Signatur
Beschreibung
elapsedTime ist eine schreibgeschützte Eigenschaft von TransitionEvent. Sie enthält eine Gleitkommazahl mit der Zeit in Sekunden, die die CSS-Transition bereits lief, als das Ereignis ausgelöst wurde. Eine mit transition-delay festgelegte Verzögerung zählt nicht mit. Gemessen wird nur die Zeit, in der die Transition tatsächlich läuft.
Welcher Wert herauskommt, hängt vom Ereignistyp ab:
transitionend: normalerweise genau der Wert vontransition-duration, also die volle Laufzeit.transitionrun/transitionstart: normalerweise0. Bei einer negativen Verzögerung (z. B.transition-delay: -0.5s) beginnt die Transition mittendrin. Dann steht hier der übersprungene Anteil, höchstens aber die Gesamtdauer.transitioncancel: die Zeit, die bis zum Abbruch vergangen ist.
Die Eigenschaft ist nützlich für Logging und Fehlersuche. Außerdem kann man damit prüfen, ob eine Transition vollständig durchlief, und abhängige Abläufe daran ausrichten, zum Beispiel eine Folgeanimation mit passender Restdauer starten. Zusammen mit propertyName und pseudoElement lässt sich genau feststellen, welche Transition an welchem Element wie lange lief.
Rückgabewert
0.3. Eine Verzögerung durch transition-delay ist nicht enthalten.Beispiele
Laufzeit beim Ende einer Transition ausgeben
// CSS: .box { transition: transform 0.4s ease 0.2s; }
const box = document.querySelector('.box');
box.addEventListener('transitionend', (event) => {
console.log(`${event.propertyName} lief ${event.elapsedTime}s`);
});
// Transition auslösen
requestAnimationFrame(() => {
box.style.transform = 'translateX(200px)';
});
Abgebrochene Transitionen erkennen
const panel = document.querySelector('.panel');
panel.addEventListener('transitioncancel', (event) => {
const total = parseFloat(getComputedStyle(panel).transitionDuration);
const progress = Math.round((event.elapsedTime / total) * 100);
console.warn(`Abgebrochen nach ${event.elapsedTime.toFixed(2)}s (${progress} %)`);
});
// Klasse umschalten; wird z. B. display:none gesetzt, bricht die Transition ab
document.querySelector('#toggle').addEventListener('click', () => {
panel.classList.toggle('open');
});
Negative Verzögerung bei transitionstart
// CSS: .bar { transition: width 1s linear -0.25s; }
const bar = document.querySelector('.bar');
bar.ontransitionstart = (event) => {
// Die Transition beginnt bereits zu 25 % fortgeschritten
console.log('Start bei', event.elapsedTime, 's');
};
requestAnimationFrame(() => {
bar.style.width = '100%';
});
Synthetisches Event mit Konstruktor
const evt = new TransitionEvent('transitionend', {
propertyName: 'opacity',
elapsedTime: 1.5,
bubbles: true
});
document.body.addEventListener('transitionend', (e) => {
console.log(e.propertyName, e.elapsedTime);
});
document.body.dispatchEvent(evt);
// Wichtig · Fallstricke
- Einheit Sekunden, nicht Millisekunden: Für
setTimeoutoder die Web Animations API muss der Wert mit 1000 multipliziert werden. - Verzögerung zählt nicht mit: Bei
transition: opacity 1s 2smeldettransitionendden Wert1, nicht3. - Ein Ereignis pro Eigenschaft: Wer mehrere Eigenschaften animiert oder die Kurzschreibweise
transition: allbenutzt, bekommt mehreretransitionend-Ereignisse mit eigenemelapsedTime. Deshalb nachpropertyNamefiltern. - Ereignisse aus Kind-Elementen: Transition-Ereignisse steigen im DOM nach oben. Mit
event.target === elementlässt sich ausschließen, dass Ereignisse von Kind-Elementen falsch ausgewertet werden. - Kein
transitionendbei Abbruch: Wird die Transition vorzeitig abgebrochen (z. B. durchdisplay: noneoder weil die Eigenschaft entfernt wird), wird stattdessentransitioncancelausgelöst. Dieses Ereignis undtransitionrun/transitionstartwerden erst seit etwa 2019/2020 von allen großen Browsern unterstützt. - Werte können Gleitkomma-Ungenauigkeiten enthalten. Deshalb vor Vergleichen runden (z. B. mit
toFixed()). - Die Eigenschaft ist schreibgeschützt. Bei synthetischen Ereignissen legt man sie über den Konstruktor
new TransitionEvent(type, { elapsedTime })fest.