早期 JS 定时动画:主要通过 setTimeout 和 setIntarval 实现。
HTML5 出现后:又出现了两种实现动画的方式,1. CSS 动画(transition、animation)2. H5的 canvas 实现。
与此同时,HTML5 还提供了一个专门用于请求动画的 API requesetAniamtionFrame(),统一了 DOM 动画、canvas动画、svg动画、webGL动画等的刷新机制。
告知浏览器在下一次重绘前,调用其回调函数来更新动画。
window.requestAnimationFrame(callback)requestAnimationFrame()开始执行回调函数的时刻。document.hidden 属性是否可见(true),可见状态下才能继续执行以下步骤。requestAnimationFrame() 将回调函数追加到动画帧请求回调函数列表的末尾。注意:执行 requestAnimationFrame(callback) 不会立即调用 callback 回调函数,只是将其放入动画帧请求回调函数队列(专门存放动画帧的回调队列,与其他回调队列独立)而已,同时注意,每个 callback回调函数都有一个 cancelled 标志符,初始值为 false,并对外不可见。cancelAnimationFrame() 取消了,对应 callback 的 cancelled 标识符会被置为 true)。
2.3 总结requestAnimationFrame() 只会执行一次, 一次只能向回调队列中推入一个回调函数,因此实现动画需要通过递归调用requestAnimationFrame()实现。1 2 3 4 5 6 7 8 9 10 11function myCallback(time) { console.log(time); // requestAnimation() 的唯一传入参数 // 动画没有执行完,则递归渲染 if (count < 5) { count++; // 渲染下一帧 rafId = window.requestAnimationFrame(requestAnimation); } } // 渲染第一帧 window.requestAnimationFrame(myCallback); CopyrequestAnimationFrame() 的回调函数触发时间是在浏览器下一次重绘之前,而浏览器大约每秒重绘60次,因此动画帧会在大约每16.6ms后执行一次。大多数电脑显示器的刷新频率是60Hz,大概相当于每秒钟重绘60次。大多数浏览器都会对重绘操作加以限制,不超过显示器的重绘频率,因为即使超过那个频率用户体验也不会有提升。因此,最平滑动画的最佳循环间隔是1000ms/60,约等于16.6ms。cancelAnimationFrame() 只取消对应请求 ID 的重绘任务,内部实现是将请求 ID 标记的回调函数的 cancelled 标识符置为 true,以此让浏览器忽略并跳过该回调函数的执行。3. 特点
3.1 定时动画存在的问题requestAnimationFrame() 只有当标签页处于活跃状态是才会执行,当页面隐藏或最小化时,会被暂停,页面显示,会继续执行,节省了 CPU 开销。早期浏览器会对切换至后台或不活跃的标签页中的计时器执行限流,导致计时器时间不精确,此外计时器在后台仍会进行计时工作,执行动画任务,此时刷新动画是完全没有意义的。本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。