Signatur
Beschreibung
Die Eigenschaft propertyName gibt es auf jedem TransitionEvent, also bei den Events transitionrun, transitionstart, transitionend und transitioncancel. Sie enthält den Namen der CSS-Eigenschaft, deren Übergang das Event ausgelöst hat. Der Name steht in CSS-Schreibweise mit Bindestrichen ("background-color") und nicht in camelCase wie bei style.backgroundColor.
Wichtig ist das vor allem, wenn auf einem Element mehrere Eigenschaften gleichzeitig animiert werden, etwa mit transition: opacity .3s, transform .5s. Dann wird für jede Eigenschaft ein eigenes transitionend ausgelöst. Mit propertyName filtert man das Event heraus, auf das man wirklich reagieren will. So läuft Folgelogik wie Aufräumen oder das Entfernen aus dem DOM nur einmal und zum richtigen Zeitpunkt.
Bei Kurzschreibweisen (Shorthands) wie padding, border oder margin meldet der Browser die einzelnen Langform-Eigenschaften, also "padding-top", "padding-left" usw. Bei transition: all kommt ebenfalls je Eigenschaft ein eigenes Event mit dem echten Namen, nie "all".
Rückgabewert
"opacity", "transform" oder "border-top-color". Bei eigenen Properties steht dort der Name mit Präfix, z. B. "--progress". Bei einem mit dem Konstruktor erzeugten Event ohne Angabe ist es ein leerer String.Beispiele
Nur auf das Ende einer bestimmten Transition reagieren
// CSS: .toast { transition: opacity .3s, transform .5s; }
const toast = document.querySelector('.toast');
const onEnd = (event) => {
// Es gibt zwei transitionend-Events – nur auf transform reagieren
if (event.propertyName !== 'transform') return;
toast.removeEventListener('transitionend', onEnd);
toast.remove();
console.log('Toast entfernt nach:', event.propertyName);
};
toast.addEventListener('transitionend', onEnd);
toast.classList.add('is-hiding');
Alle Transitions eines Elements protokollieren
// CSS: .box { transition: all .4s; } .box.big { width: 300px; padding: 20px; }
const box = document.querySelector('.box');
box.addEventListener('transitionend', ({ propertyName, elapsedTime }) => {
console.log(`${propertyName} fertig nach ${elapsedTime}s`);
});
box.classList.add('big');
Promise-Helfer, der auf eine bestimmte Eigenschaft wartet
const waitForTransition = (el, property) =>
new Promise((resolve) => {
const handler = (event) => {
// Events von Kind-Elementen (Bubbling) ignorieren
if (event.target !== el || event.propertyName !== property) return;
el.removeEventListener('transitionend', handler);
el.removeEventListener('transitioncancel', handler);
resolve(event.type);
};
el.addEventListener('transitionend', handler);
el.addEventListener('transitioncancel', handler);
});
const panel = document.querySelector('.panel');
panel.classList.add('open');
const result = await waitForTransition(panel, 'opacity');
console.log('Panel-Übergang:', result);
Synthetisches Event mit dem Konstruktor erzeugen
const event = new TransitionEvent('transitionend', {
propertyName: 'opacity',
elapsedTime: 0.3,
bubbles: true
});
console.log(event.propertyName);
// Wichtig · Fallstricke
- Kurzschreibweisen: Ein Vergleich mit
'padding','border'oder'margin'trifft nie zu. Man muss auf eine konkrete Langform-Eigenschaft wie'padding-top'prüfen. - Keine camelCase-Namen: Der Wert lautet
'background-color', nicht'backgroundColor'. - Bubbling:
transitionendsteigt im DOM auf. Transitions von Kind-Elementen kommen also auch beim Elternelement an. Deshalb zusätzlichevent.targetprüfen. - Kein Event garantiert: Wird die Transition abgebrochen, bekommt das Element
display: noneoder wird es entfernt, kommt keintransitionend. Stattdessen feuert eventuelltransitioncancel. Bei wichtiger Logik sollte man einen Fallback per Timeout einplanen. - Eigene Properties: Mit
@propertyregistrierte Custom Properties lassen sich animieren. Sie erscheinen mit ihrem Namen, z. B.'--angle'. - Kompatibilität: Wird von allen modernen Browsern unterstützt. Sehr alte WebKit-Versionen nutzten
webkitTransitionEndmit Präfix, das ist heute nicht mehr nötig.