requestAnimationFrame是什么
window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。如果想让浏览器在下一次重绘前继续更新下一帧动画,需要在回调函数中再次调用window.requestAnimationFrame()。
回调函数执行次数通常是每秒60次,但在大多数遵循W3C建议的浏览器中,回调函数执行次数通常与浏览器屏幕刷新次数相匹配。为了提高性能和电池寿命,因此在大多数浏览器里,当requestAnimationFrame() 运行在后台标签页或者隐藏的<iframe> 里时,requestAnimationFrame() 会被暂停调用以提升性能和电池寿命。
回调函数执行时,会被传入一个时间戳参数,表示当前执行回调函数的时刻。
如何使用
|
|
优缺点
和setTimeout(callback, 16)类似,但又不同,requestAnimationFrame是通过浏览器刷新频率决定执行的最佳时机,动画不会出现卡顿现象。
- 优点
- 动画保持60fps(每帧16ms),浏览器内部决定渲染的最佳时机
- API简洁标准,维护成本低
- 缺点
- 动画的开始/取消需要开发者自己控制
- 浏览器标签未激活时,一切都不会执行
- 老版本浏览器不支持IE9
- Node.js不支持,无法用在服务器的文件系统事件
实现滚动通知栏
以下基于React实现了一个文字可滚动的通知栏:
|
|
|
|

