贝利信息

javascript如何实现动画_requestanimationframe的优势是什么

日期:2026-01-13 00:00 / 作者:狼影
因为setTimeout/setInterval不与屏幕刷新同步,易掉帧卡顿且后台仍运行;requestAnimationFrame则按刷新节奏执行、提供精准时间戳、需递归调用,并适合需JS实时干预的动画场景。

为什么不用 setTimeoutsetInterval 做动画

因为它们不和屏幕刷新节奏同步,容易掉帧、卡顿,甚至在页面不可见时还在跑,浪费 CPU。浏览器每秒刷新约 60 次(即 16.67ms 一帧),而 setTimeout(fn, 16) 只是“尽量”隔 16ms 执行,并不能保证准时——实际执行时间受任务队列、JS 主线程阻塞影响很大。

requestAnimationFrame 怎么用才对

它不是“启动一次就完事”的函数,而是一个需要手动递归调用的机制:每次回调执行完,如果还想继续动画,就得再调一次 requestAnimationFrame

function animate(timestamp) {
  // timestamp 是该帧开始时的高精度时间戳(DOMHighResTimeStamp)
  const elapsed = timestamp - startTime;
  element.style.transform = `translateX(${easeInOutCubic(elapsed / duration) * 200}px)`;

if (elapsed < duration) { requestAnimationFrame(animate); // 关键:主动续订 } } let startTime = performance.now(); requestAnimationFrame(animate);

相比 CSS 动画,requestAnimationFrame 适合什么场景

CSS 动画声明式、性能好,但控制粒度粗;requestAnimationFrame 适合需要 JS 实时干预的动态过程。

容易忽略的兼容性与陷阱

现代浏览器都支持 requestAnimationFrame,但它的行为细节常被低估。

真正难的不是调用这个函数,而是设计好状态更新节奏、避免隐式重排、处理好跨设备帧率差异。这些细节没压住,再“正确”的调用也救不了动画体验。