Signatur
Beschreibung
elapsedTime ist eine schreibgeschützte Eigenschaft von AnimationEvent. Sie gibt als number (Gleitkommazahl) an, wie viele Sekunden eine CSS-Animation schon gelaufen ist, als das Ereignis ausgelöst wurde. Zeiten, in denen die Animation angehalten war (animation-play-state: paused), werden nicht mitgezählt. Eine Verzögerung über animation-delay zählt ebenfalls nicht dazu.
Der Wert hängt vom Ereignistyp ab:
animationstart: normalerweise0. Bei einem negativenanimation-delaystartet die Animation mittendrin. Dann steht hier der Betrag der Verzögerung, höchstens aber die aktive Gesamtdauer.animationiteration: die Zeit am Ende des gerade abgeschlossenen Durchlaufs, also ungefährDurchlaufnummer × animation-duration.animationend: die aktive Gesamtdauer, alsoanimation-duration × animation-iteration-count.animationcancel: die Zeit bis zum Abbruch der Animation.
Mit der Eigenschaft kann man z. B. ablesen, wie weit eine Animation fortgeschritten ist, Durchläufe mitzählen oder Messwerte zu Animationen erfassen. Das geht, ohne selbst Zeitstempel mit performance.now() zu verwalten. Die Werte stammen aus der Animationszeitachse und sind deshalb verlässlicher als eigene Zeitmessungen im Hauptthread.
Rückgabewert
2.5. Die Zeit während animation-delay und in Pausen ist nicht enthalten.Beispiele
Laufzeit bei Start, Durchlauf und Ende protokollieren
// CSS: .box { animation: pulse 1.5s ease-in-out 3; }
const box = document.querySelector('.box');
const log = (event) => {
console.log(`${event.type}: ${event.animationName} nach ${event.elapsedTime}s`);
};
box.addEventListener('animationstart', log);
box.addEventListener('animationiteration', log);
box.addEventListener('animationend', log);
Negativer animation-delay: Animation startet mittendrin
// CSS: .loader { animation: spin 2s linear -0.5s infinite; }
const loader = document.querySelector('.loader');
loader.onanimationstart = (event) => {
// Die Animation beginnt bei 0,5 s statt bei 0
console.log('Startposition:', event.elapsedTime);
};
Aktuellen Durchlauf aus elapsedTime berechnen
// CSS: .banner { animation: slide 2s ease 5; }
const banner = document.querySelector('.banner');
const duration = parseFloat(getComputedStyle(banner).animationDuration); // 2 (Sekunden)
const onIteration = (event) => {
const round = Math.round(event.elapsedTime / duration);
console.log(`Durchlauf ${round} abgeschlossen`);
if (round >= 3) {
// Nach drei Durchläufen nicht mehr zuhören
banner.removeEventListener('animationiteration', onIteration);
}
};
banner.addEventListener('animationiteration', onIteration);
// Wichtig · Fallstricke
- Einheit ist Sekunden, nicht Millisekunden. Das unterscheidet sich von
event.timeStampundperformance.now(), die in Millisekunden messen. Vor einem Vergleich also umrechnen. - Gleitkomma-Ungenauigkeit: Werte wie
2.9999999kommen vor. Deshalb nicht mit===vergleichen, sondern runden, z. B. mitMath.round()odertoFixed(). animation-delayund Pausen zählen nicht mit.elapsedTimeist also nicht die Zeit, die seit dem Setzen der Klasse vergangen ist.- Ereignisse wie
animationiterationkommen nicht an, wenn das Elementdisplay: nonehat oder aus dem DOM entfernt wird. Beim Entfernen lösen Browser stattdessenanimationcancelaus, wo das unterstützt wird. - Die Eigenschaft ist schreibgeschützt. Für eigene Ereignisse lässt sich der Wert über den Konstruktor setzen:
new AnimationEvent('animationend', { elapsedTime: 1 }). - Kompatibilität: wird von allen modernen Browsern unterstützt. Ältere WebKit-Versionen brauchten Präfixe wie
webkitAnimationEnd.