您的位置:

利用CSS Animation实现元素跳动效果

一、什么是CSS Animation?

CSS Animation是CSS3新引入的特性,它能够实现在网页中以动画的形式呈现出各种不同的效果。通过定义关键帧,我们可以让一个元素在一段时间内从始至终发生某种变化,比如移动、旋转、缩放等。

二、如何使用CSS Animation实现元素跳动效果?

使用CSS Animation实现元素跳动效果,是通过定期改变元素的位置、大小等属性值达到的。我们可以定义关键帧,设置元素在不同的时间点应该拥有的不同外观,再让CSS运用线性插值技术,平滑的过渡过程中任意两个关键帧的值。以下是一个简单的例子:

.animation {
  position: absolute;
  height: 50px;
  width: 50px;
  background-color: red;
  animation-name: jump;
  animation-duration: 1s;
  animation-iteration-count: infinite; 
}

@keyframes jump {
  from {
    transform: translateY(0);
  }
  to {
    transform: translateY(-100px); 
  }
}

以上代码表示,一个尺寸为50x50px的红色方块会无限次的在1秒内向上移动100px,再返回原位置。这是通过定义两个关键帧来实现的,一个是from,表示元素在动画开始时的状态,即不偏移;另一个是to,表示元素在动画结束时的状态,即向上偏移100px。中间的过程则会通过CSS Animation自动完成。

三、如何实现动态变化的元素跳动效果?

上面的例子中,元素的跳跃高度、速度、频率等都是固定的,很难实现一些更加生动、有趣的效果。实现动态变化的元素跳动效果,我们需要使用多个关键帧,随机生成元素的各种属性值,达到类似于物理仿真的效果。以下是一个稍微复杂一些的例子:

.animation {
  position: absolute;
  height: 50px;
  width: 50px;
  background-color: red;
  animation-name: jump;
  animation-duration: 2s;
  animation-iteration-count: infinite;
}

@keyframes jump {
  0% {
    transform: translateY(0) scale(1) rotate(0);
  }
  25% {
    transform: translateY(-80px) scale(0.8) rotate(-20deg); 
  }
  50% {
    transform: translateY(-140px) scale(1.2) rotate(20deg); 
  }
  75% {
    transform: translateY(-80px) scale(0.8) rotate(-20deg); 
  }
  100% {
    transform: translateY(0) scale(1) rotate(0); 
  }
}

以上代码表示,一个尺寸为50x50px的红色方块会不断的跳跃,高度位置、大小、旋转角度随机变化。我们定义了5个关键帧,分别对应元素在动画的不同时间点上,所具有的不同属性值。25%的关键帧代表元素跳起来到了一半,此时元素会变小,并向左旋转一定角度;50%的关键帧代表元素跳到了最高点,此时元素会变大,并向右旋转一定角度;75%的关键帧代表元素开始下落,此时元素会变小,并向左旋转一定角度;100%的关键帧代表元素回到了原点。这样定义了多个关键帧后,CSS Animation会根据这些关键帧来自动计算属性值的中间过渡。

四、使用CSS Animation需要注意什么?

虽然CSS Animation非常强大,但是我们在使用它时需要注意以下几点:

1、性能问题:CSS Animation是以帧为单位的动画,如果帧数过多或关键帧的变化过于复杂,会极大的消耗浏览器的性能,影响网页的加载速度和用户体验。我们需要在性能和效果之间加以权衡,尽可能的避免过度的动态效果,尤其是在移动设备上。

2、兼容性问题:CSS Animation仍然是一个比较新的技术,存在一定的兼容性问题,比如IE8及以下浏览器不支持。为了保证在不同的浏览器中都能够正常显示动画效果,我们需要编写适当的兼容性代码,并进行充分的测试。

3、可读性问题:由于CSS Animation通常会引用大量的关键帧,其中很多属性值是重复的,这样会极大的影响CSS代码的可读性和维护性。我们应该尽可能的利用缩写、继承等技术,合理的组织CSS代码。

五、总结

CSS Animation是一项非常有用的技术,可以帮助我们实现网页中丰富多彩的动态效果。通过定义关键帧,我们可以让元素在不同的时间点上拥有不同的样式,从而实现各种不同的动画效果。但是在使用CSS Animation时需要注意性能、兼容性和可读性等问题,合理地组织CSS代码,避免过度的动态效果,才能达到更好的效果。

完整代码示例:

<!DOCTYPE html>
<html>
<head>
  <title>CSS Animation示例</title>
  <style>
    .animation {
      position: absolute;
      height: 50px;
      width: 50px;
      background-color: red;
      animation-name: jump;
      animation-duration: 2s;
      animation-iteration-count: infinite;
    }
    
    @keyframes jump {
      0% {
        transform: translateY(0) scale(1) rotate(0);
      }
      25% {
        transform: translateY(-80px) scale(0.8) rotate(-20deg); 
      }
      50% {
        transform: translateY(-140px) scale(1.2) rotate(20deg); 
      }
      75% {
        transform: translateY(-80px) scale(0.8) rotate(-20deg); 
      }
      100% {
        transform: translateY(0) scale(1) rotate(0); 
      }
    }
  </style>
</head>
<body>
  <div class="animation"></div>
</body>
</html>
利用CSS Animation实现元素跳动效果

2023-05-12
CSS实现弹跳效果

2023-05-12
CSS与After Effects结合实现弹跳效果

2023-05-12
如何实现元素的弹跳动画效果

2023-05-12
CSS实现图片弹跳效果

2023-05-12
用CSS实现元素晃动动画效果,让网页更生动

2023-05-12
CSS和JavaScript实现元素的移动效果

2023-05-12
让你的网页元素摇摆起来:使用CSS animation sh

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)