前言
直至如今,已经有许多方法可以实现web动画效果了。就css实现的动画和js实现的动画我所知道的就有很多种,它们虽然都可以在一定程度上实现动画效果,但是在性能上还是有一定的差别的。一般来说,前端想要实现流畅的动画效果,建议使用css动画。如果使用js实现动画,建议前端使用requestAnimationFrame这个接口实现。
我所知道的方法有以下几种:
(1)css动画:animation + @keyframes;
(2)css动画:transition;
(3)js动画:requestAnimationFrame();
(4)js动画:setInterval();
(5)js动画:setTimeout();
1.css动画:animation + @keyframes
用法
animation语法:
animation: name duration timing-function delay iteration-count direction fill-mode play-state;
(1)animation中的name是自定义的,@keyframes后的名称必须和name保持一致。
(2)通过 @keyframes 规则创建动画,以百分比来规定改变发生的时间,或者通过关键词 “from” 和 “to”,等价于 0% 和 100%。
1 | div{ |
兼容
Internet Explorer 9以及更早的版本不支持 @keyframe 规则或 animation 属性。
例子
例子来自使用 CSS3 实现超炫的 Loading(加载)动画效果 ,觉得挺有想法的。
1 |
|
效果图:
2.css动画:transition
transition是网页上的过渡动画,变化的逐渐过渡效果,简称过渡动画。
语法
transition: *property duration timing-function delay*;
值 | 描述 |
---|---|
transition-property | 指定CSS属性的name,transition效果 |
transition-duration | transition效果需要指定多少秒或毫秒才能完成 |
transition-timing-function | 指定transition效果的转速曲线 |
transition-delay | 定义transition效果开始的时候 |
如何触发过渡?
可以通过伪类触发(:hover :focus :checked),也可以通过js事件触发。
例子
1 |
|
效果如图所示:
3.js动画:requestAnimationFrame()
html5 提供了一个专门用于请求动画的API,那就是 requestAnimationFrame,顾名思义就是请求动画帧 。
优势
由系统来决定回调函数的执行时机。requestAnimationFrame的步伐跟着系统的屏幕刷新频率走,它能保证回调函数在屏幕每一次的刷新间隔中只被执行一次,这样就不会引起丢帧现象,也不会导致动画出现卡顿的问题。
###兼容性
如何解决兼容性问题?
Opera浏览器的技术师Erik Möller对它进行了优雅降级,不仅解决了IE11以下不兼容的问题,而且解决了不同浏览器带有不同前缀的问题,从而使得requestAnimationFrame能更好的兼容各种浏览器。
用法
用法和setInterval类似,定义一个ID接收requestAnimationFrame动画。使用cancelAnimationFrame(ID);
语句结束动画。
canvas动画要结合requestAnimationFrame()实现。
例子
1 |
|
效果如图所示:
4.js动画:setInterval()
定义
setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。
setInterval() 方法会不停地调用函数,直到 clearInterval()被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。
clearInterval() 用法
setInterval()返回一个 ID(数字),可以将这个ID传递给clearInterval()以取消执行。
其实,jQuery中animate()函数就是由定时器实现的。
例子
1 |
|
效果如图所示:
5.js动画:setTimeout()
定义
setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。
注意:setTimeout() 方法要结合递归实现动画。
例子
1 |
|
效果如图所示:
setTimeout() 方法、setInterval() 方法的区别?
setInterval()比setTimeout()计时更加准确;
setInterval()能自动将动画函数插入执行队列,实现起来更方便直观,不用重复设置计时器;而setTimeout()每次动画函数结束时,需要再重新设置一次计时器函数(一般使用递归),所以当setTimeout()的执行步调和屏幕的刷新步调不一致时,有可能产生丢帧现象,也就是动画卡顿;
setTimeout()实现动画不会阻塞执行队列,而setInterval()会,所以setInterval()可能会产生时间误差;