requestAnimationFrame lets you schedule “the next frame” at the same timing the screen is about to redraw, so you can make smooth animations or game loops while avoiding unnecessary updates.
requestAnimationFrame は、画面の描画タイミングに合わせて「次のコマ」を予約できるしくみで、ムダな更新を減らしつつ、なめらかな動き(アニメーションやゲームのループ)を作りやすくしてくれます。
アニメーションって、パラパラ漫画みたいに「コマ(フレーム)」を素早く切り替えると動いて見えますよね。
requestAnimationFrame(略して rAF)は、その“次のコマ”を ブラウザにお願いして予約するための仕組みです。
つまり、スムーズに動かすのが得意で、ムダな更新を減らしやすいのがポイントです。
requestAnimationFrame(callback) は、ブラウザが次に画面を描画する前のタイミングで callback を呼ぶようにスケジュールします。
呼ばれた callback には引数として高精度な時刻(DOMHighResTimeStamp)が渡されます。
基本形はこれです。
JavaScript
let rafId = 0;
function tick(time) {
// time はミリ秒(高精度): performance.now() に近い値
rafId = requestAnimationFrame(tick);
}
rafId = requestAnimationFrame(tick);
止めたいときは cancelAnimationFrame(rafId)。
setInterval / setTimeoutrequestAnimationFrame結論:動き(見た目)を更新するなら rAF が基本、定期実行(通信や監視)なら setInterval が向く、みたいに使い分けるのが定番です。
初心者が最初にハマりやすいのがここです。
x += 1」だと、PCの性能や画面のリフレッシュ率(60Hz/120Hz)で速度が変わりますHTML
<div id="box"></div>
<style>
#box {
left: 0;
top: 80px;
width: 48px;
height: 48px;
background: #333;
border-radius: 12px;
}
</style>
<script>
const box = document.getElementById("box");
let rafId = 0;
let lastTime = 0;
let x = 0;
const speed = 200; // px per second
function tick(time) {
if (!lastTime) lastTime = time;
const deltaMs = time - lastTime;
lastTime = time;
const deltaSec = deltaMs / 1000;
x += speed * deltaSec;
// 画面端でループ
const maxX = window.innerWidth - 48;
if (x > maxX) x = 0;
box.style.transform = `translateX(${x}px)`;
rafId = requestAnimationFrame(tick);
}
rafId = requestAnimationFrame(tick);
// 例:3秒後に止める
setTimeout(() => {
cancelAnimationFrame(rafId);
}, 3000);
</script>
ポイント
time は「今の時刻」なので、前回との差分が deltaspeed を「秒あたり」にすると、環境が変わっても速度が安定します