您的位置:

如何实现网页中的Wobble效果

Wobble效果是一种常见的动画效果,它可以为网页增添趣味性,同时还可以帮助用户更好地感知界面元素的变化。在本文中,我们将会探讨如何利用CSS实现网页中的Wobble效果。

一、Wobble效果的定义

Wobble效果指的是一种元素在被鼠标悬停或点击时出现的一种颤动效果。这种效果可以应用在按钮、图标、文本框等网页元素上,从而增强其交互性和趣味性。

二、实现Wobble效果的基本原理

实现Wobble效果的基本原理是利用CSS中的transition和transform属性控制元素的动画效果。在Wobble效果中,我们需要对目标元素进行旋转、位移、缩放等多种变化,从而呈现出开口跳舞的效果。

具体而言,我们可以利用CSS中的@keyframes关键字定义一组动画序列,再通过transition属性触发动画效果。例如下面的代码即实现了一个简单的Wobble效果:


.btn {
    display: inline-block;
    position: relative;
    z-index: 1;
    overflow: hidden;
    -webkit-transform-origin: 50% 50%;
            transform-origin: 50% 50%;
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
            tap-highlight-color: rgba(0, 0, 0, 0);
    -webkit-transition: all 0.3s ease-out;
            transition: all 0.3s ease-out;
}

.btn:hover {
    -webkit-transform: scale(1.1) rotate(10deg);
            transform: scale(1.1) rotate(10deg);
}

@-webkit-keyframes wobble-hor-bottom {
    0% {
        -webkit-transform: translateX(0%);
                transform: translateX(0%);
    }
    15% {
        -webkit-transform: translateX(-25%) rotate(-5deg);
                transform: translateX(-25%) rotate(-5deg);
    }
    30% {
        -webkit-transform: translateX(20%) rotate(3deg);
                transform: translateX(20%) rotate(3deg);
    }
    45% {
        -webkit-transform: translateX(-15%) rotate(-3deg);
                transform: translateX(-15%) rotate(-3deg);
    }
    60% {
        -webkit-transform: translateX(10%) rotate(2deg);
                transform: translateX(10%) rotate(2deg);
    }
    75% {
        -webkit-transform: translateX(-5%) rotate(-1deg);
                transform: translateX(-5%) rotate(-1deg);
    }
    100% {
        -webkit-transform: translateX(0%);
                transform: translateX(0%);
    }
}

@keyframes wobble-hor-bottom {
    0% {
        -webkit-transform: translateX(0%);
                transform: translateX(0%);
    }
    15% {
        -webkit-transform: translateX(-25%) rotate(-5deg);
                transform: translateX(-25%) rotate(-5deg);
    }
    30% {
        -webkit-transform: translateX(20%) rotate(3deg);
                transform: translateX(20%) rotate(3deg);
    }
    45% {
        -webkit-transform: translateX(-15%) rotate(-3deg);
                transform: translateX(-15%) rotate(-3deg);
    }
    60% {
        -webkit-transform: translateX(10%) rotate(2deg);
                transform: translateX(10%) rotate(2deg);
    }
    75% {
        -webkit-transform: translateX(-5%) rotate(-1deg);
                transform: translateX(-5%) rotate(-1deg);
    }
    100% {
        -webkit-transform: translateX(0%);
                transform: translateX(0%);
    }
}

.wobble-horizontal {
    -webkit-animation-name: wobble-hor-bottom;
            animation-name: wobble-hor-bottom;
}

在上面的代码中,我们先定义了一个btn类,用于表示页面中的按钮元素。然后,在:hover伪类下,我们定义了元素在鼠标悬停时的样式,其中scale和rotate属性分别控制了元素的缩放和旋转效果。

接着,我们通过@keyframes定义了一组名为wobble-hor-bottom的动画序列,其中包含了元素在不同阶段下的多种变化。最后,在对应的类名.wobble-horizontal下,我们通过animation-name属性将动画序列与HTML元素进行关联。

三、Wobble效果的调优技巧

实现Wobble效果时,我们可以使用多种方法来调整其效果的表现形式,从而达到更好的效果呈现。下面列出了几种常见的调优技巧:

1、调整动画序列的时间间隔

Wobble效果的表现形式往往需要经过多次调整才能达到最优状态,其中时间间隔的调整是一种非常常见的调优方式。我们可以通过调整动画序列中关键帧的时间来实现,例如将15%的时间改为10%或20%,从而改变颤动的频率和幅度。

2、调整动画序列的事件分布

在Wobble效果中,每个关键帧的时间分布都会对效果的最终表现产生影响。例如,如果一个元素在关键帧的前后都没有足够的时间进行调整,那么它的效果将会显得有些僵硬。因此,我们需要对动画序列的事件分布进行调整,以使得每个阶段的效果更加自然流畅。

3、调整动画序列的幅度和频率

Wobble效果的幅度和频率一般都比较关键,这关系到效果的强烈程度和流畅程度。在实际应用中,我们需要多次尝试不同的参数组合,从而达到最佳效果。

四、实战应用及代码示例

下面我们将通过一个实际案例来演示Wobble效果的实现方法。在这个案例中,我们将为一个按钮元素应用Wobble效果,从而增强其动态交互性。

HTML代码如下:


<button class="btn wobble-horizontal">Click Me</button>

CSS代码如下:


.btn {
    padding: 10px 20px;
    background-color: #007aff;
    color: #fff;
    border: none;
    border-radius: 4px;
    font-size: 16px;
}

.btn:hover {
    -webkit-transform: scale(1.1) rotate(10deg);
            transform: scale(1.1) rotate(10deg);
}

@-webkit-keyframes wobble-hor-bottom {
    0% {
        -webkit-transform: translateX(0%);
                transform: translateX(0%);
    }
    15% {
        -webkit-transform: translateX(-25%) rotate(-5deg);
                transform: translateX(-25%) rotate(-5deg);
    }
    30% {
        -webkit-transform: translateX(20%) rotate(3deg);
                transform: translateX(20%) rotate(3deg);
    }
    45% {
        -webkit-transform: translateX(-15%) rotate(-3deg);
                transform: translateX(-15%) rotate(-3deg);
    }
    60% {
        -webkit-transform: translateX(10%) rotate(2deg);
                transform: translateX(10%) rotate(2deg);
    }
    75% {
        -webkit-transform: translateX(-5%) rotate(-1deg);
                transform: translateX(-5%) rotate(-1deg);
    }
    100% {
        -webkit-transform: translateX(0%);
                transform: translateX(0%);
    }
}

@keyframes wobble-hor-bottom {
    0% {
        -webkit-transform: translateX(0%);
                transform: translateX(0%);
    }
    15% {
        -webkit-transform: translateX(-25%) rotate(-5deg);
                transform: translateX(-25%) rotate(-5deg);
    }
    30% {
        -webkit-transform: translateX(20%) rotate(3deg);
                transform: translateX(20%) rotate(3deg);
    }
    45% {
        -webkit-transform: translateX(-15%) rotate(-3deg);
                transform: translateX(-15%) rotate(-3deg);
    }
    60% {
        -webkit-transform: translateX(10%) rotate(2deg);
                transform: translateX(10%) rotate(2deg);
    }
    75% {
        -webkit-transform: translateX(-5%) rotate(-1deg);
                transform: translateX(-5%) rotate(-1deg);
    }
    100% {
        -webkit-transform: translateX(0%);
                transform: translateX(0%);
    }
}

.wobble-horizontal {
    -webkit-animation-name: wobble-hor-bottom;
            animation-name: wobble-hor-bottom;
}

在上述代码中,我们为按钮元素创建了一个名为btn的类,并定义了其基本样式。然后通过:hover伪类和@keyframes关键字实现了Wobble颤动效果。最后,在该元素的class属性中加入了名为wobble-horizontal的类,以触发动画效果。

完整的HTML代码如下(包含CSS和JavaScript):


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Wobble Effect Demo</title>
    <style>
        .btn {
            padding: 10px 20px;
            background-color: #007aff;
            color: #fff;
            border: none;
            border-radius: 4px;
            font-size: 16px;
        }

        .btn:hover {
            -webkit-transform: scale(1.1) rotate(10deg);
                    transform: scale(1.1) rotate(10deg);
        }

        @-webkit-keyframes wobble-hor-bottom {
            0% {
                -webkit-transform: translateX(0%);
                        transform: translateX(0%);
            }
            15% {
                -webkit-transform: translateX(-25%) rotate(-5deg);
                        transform: translateX(-25%) rotate(-5deg);
            }
            30% {
                -webkit-transform: translateX(20%) rotate(3deg);
                        transform: translateX(20%) rotate(3deg);
            }
            45% {
                -webkit-transform: translateX(-15%) rotate(-3deg);
                        transform: translateX(-15%) rotate(-3deg);
            }
            60% {
                -webkit-transform: translateX(10%) rotate(2deg);
                        transform: translateX(10%) rotate(2deg);
            }
            75% {
                -webkit-transform: translateX(-5%) rotate(-1deg);
                        transform: translateX(-5%) rotate(-1deg);
            }
            100% {
                -webkit-transform: translateX(0%);
                        transform: translateX(0%);
            }
        }

        @keyframes wobble-hor-bottom {
            0% {
                -webkit-transform: translateX(0%);
                        transform: translateX(0%);
            }
            15% {
                -webkit-transform: translateX(-25%) rotate(-5deg);
                        transform: translateX(-25%) rotate(-5deg);
            }
            30% {
                -webkit-transform: translateX(20%) rotate(3deg);
                        transform: translateX(20%) rotate(3deg);
            }
            45% {
                -webkit-transform: translateX(-15%) rotate(-3deg);
                        transform: translateX(-15%) rotate(-3deg);
            }
            60% {
                -webkit-transform: translateX(10%) rotate(2deg);
                        transform: translateX(10%) rotate(2deg);
            }
            75% {
                -webkit-transform: translateX(-5%) rotate(-1deg);
                        transform: translateX(-5%) rotate(-1deg);
            }
            100% {
                -webkit-transform: translateX(0%);
                        transform: translateX(0%);
            }
        }

        .wobble-horizontal {
            -webkit-animation-name            
如何实现网页中的Wobble效果

2023-05-12
CSS WOBBLE EFFECT

2023-05-12
CSS Wobble 教程

2023-05-12
如何优化网页在移动设备上的显示效果

2023-05-12
如何在CSS中实现页面样式的美化效果

2023-05-12
CSS实现响应式网页设计

2023-05-12
如何使用HTML和CSS创建响应式网页设计

2023-05-12
如何将CSS添加到HTML中以增强网页设计效果?

2023-05-12
Fade CSS优化网页渐变效果的实现方法

2023-05-12
重学java笔记,java笔记总结

2022-11-23
如何在CSS中实现文本截断省略号效果?

2023-05-17
使用CSS实现Web页面的自适应效果

2023-05-12
如何增加CSS省略号效果,让网页更美观

2023-05-17
如何使用CSS实现字母大写效果提升网站排名

2023-05-12
when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${item.id} [in template "article/detail/index.ftl" at line 48, column 106] ---- Java stack trace (for programmers): ---- freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...] at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:134) at freemarker.core.EvalUtil.coerceModelToTextualCommon(EvalUtil.java:481) at freemarker.core.EvalUtil.coerceModelToStringOrMarkup(EvalUtil.java:401) at freemarker.core.EvalUtil.coerceModelToStringOrMarkup(EvalUtil.java:370) at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:104) at freemarker.core.DollarVariable.accept(DollarVariable.java:63) at freemarker.core.Environment.visit(Environment.java:371) at freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:321) at freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271) at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:244) at freemarker.core.Environment.visitIteratorBlock(Environment.java:645) at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:108) at freemarker.core.IteratorBlock.accept(IteratorBlock.java:94) at freemarker.core.Environment.visit(Environment.java:335) at freemarker.core.Environment.visit(Environment.java:341) at freemarker.core.Environment.visit(Environment.java:341) at freemarker.core.Environment.process(Environment.java:314) at freemarker.template.Template.process(Template.java:383) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:332) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:266) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:220) at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:181) at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:314) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1431) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1167) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1106) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at com.software.filter.HttpSpiderIdentifyFilter.doFilter(HttpSpiderIdentifyFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at java.base/java.lang.VirtualThread.run(VirtualThread.java:309)