Skip to main content
JavaScript & the browser·Module C9 · Lesson 6
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.

PreviousNext lesson →

Get one Python or web tip a day — by email

Short, hand-written, no spam. Unsubscribe in one click.