JS 特效 词条目录
前端Wiki/JS 特效/基础/性能与优化

rAF 与定时器对比

setInterval(fn, 16) 并不能保证 16ms 执行一次:它只是“至少间隔 16ms”,且可能丢帧、后台继续跑。rAF 则保证每次重绘前恰好一次,是“帧驱动”而非“时间驱动”。

对比实验:同样的位移动画,setInterval 在拖动窗口、切后台时容易抖动;rAF 一直平滑。老代码迁移成本很低——把 setInterval(fn, 16) 换成用 rAF 的递归调用即可。

  • setInterval:时间驱动,可能累积漂移、后台空转
  • rAF:重绘驱动,与刷新率同步、后台暂停
  • 动画始终用“时间差”计算进度,帧率无关
HTML
<style>
.lane { height: 60px; border-bottom: 2px solid #eee; position: relative; }
.car { width: 40px; height: 26px; border-radius: 6px; position: absolute;
       top: 22px; left: 0; }
#carA { background: #4a9eff; }
#carB { background: #f778ba; }
</style>
<p style="color:#888">蓝车 setInterval,粉车 rAF —— 都能跑,但 rAF 更稳更省电</p>
<div class="lane"><div class="car" id="carA"></div></div>
<div class="lane"><div class="car" id="carB"></div></div>
<script>
var a = document.getElementById('carA'), b = document.getElementById('carB');
var ax = 0, bx = 0;
// 反面:setInterval
setInterval(function () { ax = (ax + 2) % 360; a.style.left = ax + 'px'; }, 16);
// 正面:rAF
function drive() { bx = (bx + 2) % 360; b.style.left = bx + 'px'; requestAnimationFrame(drive); }
requestAnimationFrame(drive);
</script>
本节要点setInterval 时间驱动会漂移,rAF 重绘驱动平滑且省电;动画统一交给 rAF。