Timers & animations

Animatie

= updaten van een beeld in opeenvolgende beelden of frames

  • 🐌 Slechte timing leidt tot haperingen en laggy user experience
  • 🔋 Efficiënt gebruik van resources (CPU, batterij) is cruciaal
  • 📺 Vloeiende animaties synchroniseren met de scherm-refresh

Timing

3 belangrijke timing methods in JavaScript:

  • setTimeout(): code uitvoeren na vertraging
  • setInterval(): code herhaaldelijk uitvoeren
  • requestAnimationFrame(): synchroniseert met de browser's refresh rate

Éénmalige vertragingen

setTimeout()

setTimeout(() => {
  // code
}, 1000);

= Functie die een functie uitvoert na een ingestelde tijd

  • Parameter 1: functie
  • Parameter 2: aantal milliseconden

Voorbeelden setTimeout()

setTimeout(() => {
  const modal = document.querySelector("#modal");
  modal.style.display = "block";
}, 2000);
  • 🦶 Tutorial die stap voor stap verschijnt
  • 🔔 Notificatie na een tijd verwijderen
  • 🔄 Loading animation

clearTimeout()

const myTimeout = setTimeout(() => {}, 5000);

clearTimeout(myTimeout);

= Annuleert een eerder geplande setTimeout()

  • Parameter: Naam van de variabele waarin je setTimeout() hebt gedeclareerd.

Voorbeelden clearTimeout()

const timeoutId = setTimeout(() => {
  alert("Ben je er nog?");
}, 60000);

document.addEventListener("click", () => {
  clearTimeout(timeoutId);
});
  • ⬅️ Auto-redirect annuleren als een gebruiker interactie toont
  • 🔔 Pop-ups annuleren als ze niet meer relevant zijn

Acties herhalen

setInterval()

setInterval(() => {
  // code
}, 1000);

= Functie die een functie herhaaldelijk uitvoert met een vaste intervaltijd

  • Parameter 1: functie
  • Parameter 2: aantal milliseconden

Voorbeelden setInterval()

const clockElement = document.querySelector("#clock");

function updateClock() {
  const now = new Date();
  clockElement.textContent = now.toLocaleTimeString();
}

setInterval(updateClock, 1000);
  • ⏱️ Countdown voor aanbiedingen
  • 🔔 Notificatie-checks op de achtergrond
  • 📈 Auto-refresh van data, vb beurskoers

clearInterval()

const intervalId = setInterval(() => {}, 1000);

clearInterval(intervalId);

= Stopt een lopende setInterval() functie.

  • Parameter: Naam van de variabele waarin je setInterval() hebt gedeclareerd

Voorbeelden clearInterval()

let countdown = 10;
const element = document.getElementById("countdown");

const intervalId = setInterval(() => {
  countdown--;
  element.textContent = `Nog ${countdown} seconden...`;
  
  if (countdown <= 0) {
    element.textContent = "Start! 🚀";
    clearInterval(intervalId);
  }
}, 1000);
  • ⏱️ Timers stoppen wanneer het doel bereikt is
  • 🖱️ Animaties stoppen bij gebruikersinteractie
  • 🔋 Resources vrijgeven voor performance

Performance

Frames

  • Een scherm refresht meestal 60 x / seconde (60 FPS)
  • Animaties zien er smooth uit als ze synchroon lopen met die refresh rate
  • Visuele haperingen kunnen optreden door:
    • 📈 Stutter: gebeurt wanneer frames onregelmatig worden weergegeven 
    • ⏭️ Framedrops: ontstaan wanneer de computer het niet bijhoudt en frames overslaat

setTimout() & setInterval() zijn niet ideaal voor animaties

  • 🖥️ Niet synchroon met scherm
  • 🪫 CPU-belasting: Blijft lopen, zelfs als het tabblad niet zichtbaar is. Kan laptop traag maken
  • 😵 Laggy bewegingen: Slechte performance kan leiden tot framedrops en stutter.

Oplossing

✨requestAnimationFrame()✨

Smooth animations

requestAnimationFrame()

= Vraagt de browser om een functie uit te voeren op het juiste moment voor het volgende frame

function animate() {
  // Code die iets doet
  // ...
  requestAnimationFrame(animate);
}

animate();

1️⃣

2️⃣

3️⃣

Named function

Named function

Geef de functienaam mee als parameter

requestAnimationFrame()

let x = 0;
const balloon = document.querySelector("#balloon");

function animate() {
  balloon.style.left = `${x}px`;

  x += 1; // Even snel als framerate

  requestAnimationFrame(animate);
}

animate();

Voorbeeld: elke frame een element 1px verplaatsen

Timestamp parameter

  • = huidige tijd in milliseconden sinds page load
  • Automatisch meegegeven door requestAnimationFrame()
  • Gebruik voor o.a.:
    • Berekenen van deltaTime (tijd tussen frames)
    • Snelheidsberekeningen onafhankelijk van framerate

Timestamp parameter

const box = document.getElementById("box");
let lastTime = 0;

function animate(timestamp) {
  if (!lastTime) lastTime = timestamp;
  const deltaTime = timestamp - lastTime;
  
  const leftPos = parseFloat(box.style.left) + deltaTime * 0.1
  
  box.style.left = leftPos + "px";
  lastTime = timestamp;
  
  requestAnimationFrame(animate);
}

animate();

cancelAnimationFrame()

Stopt (of pauzeert) een lopende animatie die gestart is met requestAnimationFrame()

let animationId;
let x = 0;

function animate() {
  console.log(`Positie: ${x}`);
  x += 1;
  animationId = requestAnimationFrame(animate);
}

animate();

cancelAnimationFrame(animationId);

cancelAnimationFrame()

Enhancement zodat de animatie minstens 3 seconden wordt uitgevoerd

let animationId;
let x = 0;

function animate() {
  console.log(`Positie: ${x}`);
  x += 1;
  animationId = requestAnimationFrame(animate);
}

animate();

const stopAnimation = () => cancelAnimationFrame(animationId);

setTimeout(stopAnimation, 3000); // Stopt na 3 sec

CSS vs. JS

CSS vs. JS

  • Gebruik CSS voor
    • eenvoudige UI-elementen
    • standaard overgangen
  • Gebruik JavaScript voor voor alles wat
    • complex is
    • interactief is
    • berekend moet worden

JS: Welke timer gebruik je wanneer?

  • setTimeout()
    • Eenmalig
    • Stopmethode: clearTimeout(id)
  • setInterval()
    • Herhalende taken met vaste timing
    • Stopmethode: clearInterval(id)
  • requestAnimationFrame()
    • Vloeiende visuele animaties
    • Stopmethode: cancelAnimationFrame(id)

12. Timers & animations

By Lecturer GDM

12. Timers & animations

  • 261