You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
requestAnimationFrame() 只有当标签页处于活跃状态是才会执行,当页面隐藏或最小化时,会被暂停,页面显示,会继续执行,节省了 CPU 开销。早期浏览器会对切换至后台或不活跃的标签页中的计时器执行限流,导致计时器时间不精确,此外计时器在后台仍会进行计时工作,执行动画任务,此时刷新动画是完全没有意义的。
The text was updated successfully, but these errors were encountered:
JS深入浅出 - requestAnimationFrame
参考文章:
探讨requestAnimationFrame
深入理解HTML5定时器requestAnimationFrame
JavaScript高级程序设计(第4版) P549-551
1. JS 动画
早期 JS 定时动画:主要通过 setTimeout 和 setIntarval 实现。
HTML5 出现后:又出现了两种实现动画的方式,1. CSS 动画(transition、animation)2. H5的 canvas 实现。
与此同时,HTML5 还提供了一个专门用于请求动画的 API
requesetAniamtionFrame()
,统一了 DOM 动画、canvas动画、svg动画、webGL动画等的刷新机制。2. requestAnimationFrame(callback)
2.1 定义
告知浏览器在下一次重绘前,调用其回调函数来更新动画。
requestAnimationFrame()
开始执行回调函数的时刻。2.2 内部执行机制
document.hidden
属性是否可见(true),可见状态下才能继续执行以下步骤。requestAnimationFrame()
将回调函数追加到动画帧请求回调函数列表的末尾。2.3 总结
requestAnimationFrame()
只会执行一次, 一次只能向回调队列中推入一个回调函数,因此实现动画需要通过递归调用requestAnimationFrame()
实现。requestAnimationFrame()
的回调函数触发时间是在浏览器下一次重绘之前,而浏览器大约每秒重绘60次,因此动画帧会在大约每16.6ms后执行一次。cancelAnimationFrame()
只取消对应请求 ID 的重绘任务,内部实现是将请求 ID 标记的回调函数的 cancelled 标识符置为 true,以此让浏览器忽略并跳过该回调函数的执行。3. 特点
3.1 定时动画存在的问题
3.2 requestAnimationFrame 动画刷新机制的特点
requestAnimationFrame()
只有当标签页处于活跃状态是才会执行,当页面隐藏或最小化时,会被暂停,页面显示,会继续执行,节省了 CPU 开销。早期浏览器会对切换至后台或不活跃的标签页中的计时器执行限流,导致计时器时间不精确,此外计时器在后台仍会进行计时工作,执行动画任务,此时刷新动画是完全没有意义的。The text was updated successfully, but these errors were encountered: