JS 特效 词条目录
前端Wiki/JS 特效/基础/特效基础

动画原理 requestAnimationFrame

requestAnimationFrame(rAF)是浏览器原生的动画接口:把回调排到下一次重绘前执行,与显示器刷新率同步(通常 60fps)。它比 setInterval 更准、更省电,是写 JS 动画的现代标准。

rAF 的优势:页面切到后台时自动暂停(setInterval 会继续空转耗电);刷新率变化时自动适配(120Hz 屏自动 120fps)。几乎所有动画库(GSAP、Framer Motion)底层都是 rAF。

  • rAF 在每次重绘前调用,天然对齐刷新率
  • 后台标签页自动暂停,不耗电
  • 用时间差(timestamp)计算位移,与帧率解耦
HTML
<style>
#ball { width: 40px; height: 40px; border-radius: 50%; background: #4a9eff;
        position: relative; margin-top: 30px; }
</style>
<button id="go" style="padding:8px 20px">用 rAF 滚动小球</button>
<div id="ball"></div>
<script>
document.getElementById('go').addEventListener('click', function () {
  var ball = document.getElementById('ball'), start = null;
  function step(ts) {
    if (!start) start = ts;
    var t = (ts - start) / 1000;            // 经过的时间(秒)
    var x = Math.min(t * 180, 300);          // 时间驱动位移,与帧率无关
    ball.style.transform = 'translateX(' + x + 'px)';
    if (x < 300) requestAnimationFrame(step);
  }
  requestAnimationFrame(step);
});
</script>
本节要点动画用 rAF 而非 setInterval;位移用时间戳计算,天然抗帧率波动。
🔗 相关词条JavaScriptCSS 特效DOM