Signatur
Beschreibung
Der Konstruktor TransitionEvent() erzeugt ein synthetisches Ereignisobjekt vom Typ TransitionEvent. Normalerweise erzeugt der Browser solche Ereignisse selbst, wenn eine CSS-Transition eingeplant wird (transitionrun), beginnt (transitionstart), endet (transitionend) oder abgebrochen wird (transitioncancel).
Den Konstruktor braucht man vor allem in Tests (z. B. mit jsdom, Jest oder Playwright) und für Fallbacks: Code, der auf transitionend wartet, bleibt sonst hängen, wenn gar keine Transition läuft (etwa bei prefers-reduced-motion oder display: none). Mit dispatchEvent() kann man das Ereignis dann selbst auslösen.
Zusätzlich zu den Event-Optionen (bubbles, cancelable, composed) nimmt das Options-Objekt die transitionsspezifischen Felder propertyName, elapsedTime und pseudoElement an. Diese stehen danach als schreibgeschützte Eigenschaften am Ereignis zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Name des Ereignisses, z. B. "transitionend", "transitionstart", "transitionrun" oder "transitioncancel". Groß-/Kleinschreibung wird beachtet. |
|
| $options | TransitionEventInit | {} | Optionales Objekt mit folgenden Feldern:
|
Rückgabewert
TransitionEvent-Objekt mit den übergebenen Werten. Es ist noch nicht ausgelöst, das erledigt erst dispatchEvent().Beispiele
Ereignis erzeugen und Eigenschaften auslesen
const event = new TransitionEvent('transitionend', {
propertyName: 'opacity',
elapsedTime: 0.3,
bubbles: true
});
console.log(event.type, event.propertyName, event.elapsedTime, event.bubbles);
console.log(event instanceof Event);
console.log(event.isTrusted);
Fallback: transitionend selbst auslösen, wenn keine Animation läuft
const fadeOut = (el) => new Promise((resolve) => {
const onEnd = (e) => {
if (e.target !== el || e.propertyName !== 'opacity') return;
el.removeEventListener('transitionend', onEnd);
resolve();
};
el.addEventListener('transitionend', onEnd);
el.style.opacity = '0';
// Bei reduzierter Bewegung läuft keine Transition, also selbst auslösen
if (matchMedia('(prefers-reduced-motion: reduce)').matches) {
el.dispatchEvent(new TransitionEvent('transitionend', {
propertyName: 'opacity',
bubbles: true
}));
}
});
const box = document.querySelector('.toast');
await fadeOut(box);
box.remove();
console.log('Toast entfernt');
Unit-Test: Handler für transitionend prüfen
const panel = document.createElement('div');
document.body.append(panel);
let closed = false;
panel.addEventListener('transitionend', (e) => {
if (e.propertyName === 'height') closed = true;
});
// Andere Eigenschaft: Handler soll sie ignorieren
panel.dispatchEvent(new TransitionEvent('transitionend', { propertyName: 'color' }));
console.log(closed);
panel.dispatchEvent(new TransitionEvent('transitionend', { propertyName: 'height', elapsedTime: 0.25 }));
console.log(closed);
// Wichtig · Fallstricke
- Einheit:
elapsedTimewird in Sekunden angegeben, nicht in Millisekunden, also0.3und nicht300. - Kein echtes Ereignis: Selbst erzeugte Ereignisse haben
isTrusted === falseund starten keine Transition. Sie rufen nur die registrierten Listener auf. - Bubbling: Vom Browser ausgelöste
transitionend-Ereignisse steigen im DOM auf (bubbles: true). Beim Konstruktor ist der Standardfalse. Wer Ereignis-Delegation nachbilden will, mussbubbles: trueselbst setzen. - Kindelemente: Weil die Ereignisse aufsteigen, kommen auch Transitionen von Kindelementen beim Listener an. Deshalb immer
e.targetunde.propertyNameprüfen. - Kompatibilität: Der Konstruktor wird von allen modernen Browsern unterstützt. Alte WebKit-Versionen kannten nur
webkitTransitionEnd, und im Internet Explorer gab es keinen Konstruktor, dort nurdocument.createEvent('TransitionEvent'). In jsdom fehltTransitionEventje nach Version. Dann hilft ein allgemeinesEventmit nachträglich gesetztempropertyName. - Ohne
newaufgerufen wirft der Konstruktor einenTypeError.