requestAnimationFrame 是实现流畅动画的推荐方式,它自动匹配屏幕刷新率、后台暂停、提供高精度时间戳,并需递归调用形成循环;而 setInterval/timeout 无法对齐刷新、易丢帧且不节电。
requestAnimationFrame 是 JavaScript 中实现流畅动画的推荐方式,它让浏览器决定何时执行动画帧,从而与屏幕刷新率(通常是 60Hz)同步,避免丢帧、卡顿和过度渲染。
传统定时器无法感知浏览器是否处于后台、页面是否被节流,也不保证执行时机与屏幕刷新对齐。比如:
它不是“更快”的 API,而是“更聪明”的调度机制:
、布局、绘制,提升整体渲染效率它是一次性调用,需手动递归触发才能形成动画循环:
function animate(timestamp) {
// timestamp 是自页面加载以来的毫秒数(高精度)
update(timestamp); // 更新状态,如位置、透明度
render(); // 绘制到页面(如修改 style 或 canvas)
requestAnimationFrame(animate); // 下一帧继续
}
requestAnimationFrame(animate); // 启动
注意:不要在每次动画中重复绑定事件或创建新函数;避免在回调里做耗时操作(如大量 DOM 查询、复杂计算),否则会挤占渲染时间。
requestAnimationFrame 更适合需要 JavaScript 动态控制的场景,例如:
而纯位移、缩放、颜色渐变等简单过渡,优先使用 CSS transition 或 @keyframes —— 它们由合成器线程处理,不触发重排重绘,性能更高。