JavaScript Academy · Lektion

Animationstiming — introduktion med tidsbaserade loopar

Bygg en liten animationsloop, använd tidsbaserade uppdateringar med delta, simulera requestAnimationFrame och lägg till enkel easing.

Lektion 3 av 38 steg

Animationstiming — introduktion med tidsbaserade loopar är en gratis lektion i JavaScript Academy på CoddyKit. Detta är lektion 3 av 3. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för JavaScript Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i JavaScript Academy innehåller totalt 3 lektioner.

Varför tidsbaserad animering?

Mål: Skapa mjuka rörelser med tidsbaserade uppdateringar.

  • Simulera requestAnimationFrame
  • Mät delta time
  • Flytta med enheter/sekund
  • Lägg till lite easing
Animationstiming — introduktion med tidsbaserade loopar — illustration 1

Simulerad rAF

Det finns ingen DOM här, så vi simulerar requestAnimationFrame med setTimeout på cirka 16 ms.

// requestFrame: simulate ~60 FPS with setTimeout
function requestFrame(fn) {
  // ~16ms between frames for ~60fps
  return setTimeout(function () { fn(Date.now()); }, 16);
}

function cancelFrame(id) {
  clearTimeout(id);
}

// Tiny demo: schedule one frame
requestFrame(function (ts) {
  console.log("frame at", ts);
});
Animationstiming — introduktion med tidsbaserade loopar — illustration 2

Grunderna i delta time

Beräkna delta time för varje bildruta: (now − last) / 1000. Då skalas rörelsen efter verklig tid.

// Time-based loop: compute delta time in seconds
let running = true;
let last = Date.now();

function loop() {
  if (!running) { return; }
  const now = Date.now();
  const dt = (now - last) / 1000; // seconds
  last = now;

  // Print a tiny delta preview
  console.log("dt", dt.toFixed(3), "s");

  requestFrame(loop);
}

// Start the loop and stop after a few frames
loop();
setTimeout(function () {
  running = false;
  console.log("stop");
}, 60);
Animationstiming — introduktion med tidsbaserade loopar — illustration 3

Enheter per sekund

Använd speed × dt för att uppdatera positionen så att rörelsen förblir konsekvent vid olika bildfrekvenser.

// Move with a speed in units/second
let x = 0;               // position
const speed = 50;        // units per second

let lastT = Date.now();
let frames = 0;

function moveLoop() {
  const now = Date.now();
  const dt = (now - lastT) / 1000;
  lastT = now;

  // Distance = speed * time
  x = x + speed * dt;
  frames = frames + 1;

  console.log("x", Math.round(x));

  if (frames < 5) {
    requestFrame(moveLoop);
  } else {
    console.log("final x", Math.round(x));
  }
}

moveLoop();
Animationstiming — introduktion med tidsbaserade loopar — illustration 4

Exempel på lite easing

Easing formar kurvan. Här börjar easeOutQuad snabbt och saktar ner mot slutet.

// Ease from 0 to 1 over duration using easeOutQuad
function easeOutQuad(t) {
  // t in [0,1]
  return 1 - (1 - t) * (1 - t);
}

async function tween(durationMs) {
  let start = Date.now();
  let id = null;

  function step() {
    const now = Date.now();
    const t = Math.min(1, (now - start) / durationMs);
    const eased = easeOutQuad(t);
    console.log("eased", eased.toFixed(2));

    if (t < 1) {
      id = requestFrame(step);
    } else {
      cancelFrame(id);
      console.log("done");
    }
  }

  step();
}

tween(60);
Animationstiming — introduktion med tidsbaserade loopar — illustration 5

En titt på fasta steg

Ett fast steg kan stabilisera logiken; accumulator hinner ikapp om en bildruta blir försenad.

// Fixed-step taste: step a physics tick and catch up using an accumulator
let acc = 0;                  // accumulated time
const step = 1 / 30;          // 30 FPS fixed step in seconds
let lastTime = Date.now();
let value = 0;
let fixedFrames = 0;

function fixedLoop() {
  const now = Date.now();
  const dt = (now - lastTime) / 1000;
  lastTime = now;
  acc = acc + dt;

  // Run zero or more fixed steps to catch up
  while (acc >= step) {
    // Update logic at a fixed rate
    value = value + 1;        // pretend physics
    acc = acc - step;
  }

  console.log("value", value);

  fixedFrames = fixedFrames + 1;
  if (fixedFrames < 5) {
    requestFrame(fixedLoop);
  } else {
    console.log("fixed stop");
  }
}

fixedLoop();
Animationstiming — introduktion med tidsbaserade loopar — illustration 6

Quiz om delta och fasta steg

Snabb kontroll: Varför delta time?

Animationstiming — introduktion med tidsbaserade loopar — illustration 7

Sammanfattning

Sammanfattning: Ni simulerade rAF med setTimeout, mätte delta time, flyttade med enheter/sekund, lade till ett ease-out och såg ett exempel på fasta steg med en accumulator.

Animationstiming — introduktion med tidsbaserade loopar — illustration 8
Gratis att börja

Lär dig JavaScript med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
59
Lektioner
200

Vanliga frågor

Är lektionen ”Animationstiming — introduktion med tidsbaserade loopar” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen JavaScript Academy, inklusive ”Animationstiming — introduktion med tidsbaserade loopar”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i JavaScript Academy innehåller totalt 3 lektioner.

Vad lär jag mig i ”Animationstiming — introduktion med tidsbaserade loopar”?

Bygg en liten animationsloop, använd tidsbaserade uppdateringar med delta, simulera requestAnimationFrame och lägg till enkel easing. Ni övar på JavaScript Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig JavaScript Academy?

Du behöver inga förkunskaper. Utbildningen i JavaScript Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 3.

Hur lång tid tar lektionen ”Animationstiming — introduktion med tidsbaserade loopar”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här JavaScript Academy-lektionen?

Ja. Varje JavaScript Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. setTimeout, setInterval och timerdrift
  2. Debounce kontra throttle — implementera själv
  3. Animationstiming — introduktion med tidsbaserade loopar
← Tillbaka till JavaScript Academy