requestAnimationFrame
是html5
提供的一个专门用于请求动画的API,顾名思义就是请求动画帧。requestAnimationFrame
采用系统时间间隔,保持最佳绘制效率,不会因为间隔时间过短,造成过度绘制,增加开销;也不会因为间隔时间太长,使用动画卡顿不流畅,让各种网页动画效果能够有一个统一的刷新机制,从而节省系统资源,提高系统性能,改善视觉效果。
requestAnimationFrame的优点
- 采用系统时间间隔,保持最佳绘制效率,间隔时间相对精确,不会引起丢帧,不会卡断。而
setTimeout
和setInterval
时间间隔不精确。 requestAnimationFrame
会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率,一般是大约每16.7ms执行一次requestAnimationFrame
是由浏览器专门为动画提供的API,在运行时浏览器会自动优化方法的调用,并且如果页面不是激活状态下或者页面被隐藏或最小化时,动画会自动暂停,有效节省了CPU开销,当页面被激活时,动画从上次暂停的地方继续执行。可解决使用setTimeout或setInterval定时器的轮播图可能存在的问题。- 使用
setTimeout或setInterval
实现的动画,当页面被隐藏或最小化时,setTimeout 仍然在后台执行动画任务,由于此时页面处于不可见或不可用状态,刷新动画是没有意义的,完全是浪费CPU资源,由于动画在后台执行在返回页面未刷新时,有时会看到轮播图快速执行多次。 - 在隐藏或不可见的元素中,
requestAnimationFrame
将不会进行重绘或回流,这当然就意味着更少的CPU、GPU和内存使用量
如何使用requestAnimationFrame
requestAnimationFrame的用法与setTimeout很相似,只是不需要设置时间间隔而已。requestAnimationFrame使用一个回调函数作为参数,这个回调函数会在浏览器重绘之前调用。它返回一个整数,表示定时器的编号,这个值可以传递给cancelAnimationFrame用于取消这个函数的执行。
1
2
3
4
5// 定义requestAnimationFrame定时器
var timer = requestAnimationFrame(function(){})
console.log(timer) // 1
// cancelAnimationFrame 取消定时器
cancelAnimationFrame(timer) //控制台什么都不输出
兼容性处理
IE9及以下浏览器不支持该方法
1
2
3
4
5
6
7
8window.requestAnimFrame = (function() {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function( callback ) {
window.setTimeout( callback, 1000 / 60 )
}
})();
简单使用案例
1 |
|