TaskBuild counter = 0. Inside step(): counter++; if counter < 5 schedule another RAF; else log 'done at ' + counter. Kick off with RAF. Output should end with 'done at 5'.
requestAnimationFrame — smooth animation
100 XP8 min
Theory
The right way to animate
setInterval(fn, 16) runs your function regardless of whether the browser can render. requestAnimationFrame(fn) runs ONCE before the next paint — at most 60 times per second on a 60Hz display, slowed automatically when the tab is backgrounded.
let pos = 0;
function step(timestamp) {
pos += 1;
if (pos < 100) {
requestAnimationFrame(step);
}
}
requestAnimationFrame(step);What you get
- The callback receives the timestamp (DOMHighResTimeStamp).
- No work in background tabs — the browser pauses RAF when the tab isn't visible.
- Synced to display refresh — never partial frames.
Cancelling
requestAnimationFrame returns an id. cancelAnimationFrame(id) aborts the queued tick.
const id = requestAnimationFrame(step); cancelAnimationFrame(id);
When to use setInterval anyway
Polling a server every 30 seconds — that's not animation. RAF is overkill. Use setInterval/setTimeout for that.
🔒
Sign up to start coding
Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial — card required, cancel anytime.
Sign up — free trial →First 10 lessons in each track are free. No card needed for those.