Signatur
Beschreibung
CSSAnimation ist eine Unterklasse von Animation aus der Web Animations API. Der Browser erzeugt für jede über die CSS-Eigenschaft animation-name gestartete Animation automatisch eine CSSAnimation-Instanz. Einen eigenen Konstruktor gibt es nicht: Man bekommt die Objekte über Element.getAnimations() oder document.getAnimations().
Zu allen geerbten Methoden und Eigenschaften (play(), pause(), reverse(), finish(), cancel(), currentTime, playbackRate, playState, finished, effect …) kommt nur eine eigene Eigenschaft hinzu:
animationName(nur lesbar,string): Name der zugehörigen@keyframes-Regel, also der Wert ausanimation-name.
Die Schnittstelle bietet sich an, wenn Animationen deklarativ in CSS beschrieben sind und man sie trotzdem gezielt per Skript steuern will, z. B. anhalten, vorspulen, die Geschwindigkeit ändern oder auf das Ende warten (await animation.finished). So bleibt die Gestaltung im Stylesheet, und im JavaScript steckt nur die Steuerlogik.
Beispiele
CSS-Animationen eines Elements finden und benennen
// CSS:
// @keyframes pulse { from { opacity: 1 } to { opacity: .3 } }
// .badge { animation: pulse 1s infinite alternate; }
const badge = document.querySelector('.badge');
for (const anim of badge.getAnimations()) {
if (anim instanceof CSSAnimation) {
console.log(anim.animationName, anim.playState);
}
}
CSS-Animation per Button anhalten und fortsetzen
const spinner = document.querySelector('.spinner');
const toggle = document.querySelector('#toggle');
toggle.addEventListener('click', () => {
const anim = spinner
.getAnimations()
.find((a) => a instanceof CSSAnimation && a.animationName === 'spin');
if (!anim) return;
anim.playState === 'running' ? anim.pause() : anim.play();
toggle.textContent = anim.playState === 'running' ? 'Pause' : 'Weiter';
});
Auf das Ende einer CSS-Einblendung warten
const dialog = document.querySelector('.dialog');
dialog.classList.add('fade-in'); // startet @keyframes fadeIn
const waitForCssAnimation = async (el, name) => {
const anim = el
.getAnimations()
.find((a) => a instanceof CSSAnimation && a.animationName === name);
if (anim) await anim.finished;
};
await waitForCssAnimation(dialog, 'fadeIn');
dialog.querySelector('input')?.focus();
console.log('Einblendung fertig');
Alle CSS-Animationen der Seite verlangsamen
// z. B. als Debug-Hilfe: alles in halber Geschwindigkeit
document
.getAnimations()
.filter((a) => a instanceof CSSAnimation)
.forEach((a) => {
a.playbackRate = 0.5;
});
console.log(document.getAnimations().length, 'Animationen angepasst');
// Wichtig · Fallstricke
- Kein Konstruktor:
new CSSAnimation()wirft einenTypeError. Eigene Animationen legt man mitelement.animate()odernew Animation()an. - Kopplung an CSS: Entfernt man
animation-nameoder die Klasse, wird die Animation abgebrochen und das Objekt ist nutzlos. Ändert sichanimation-name, entsteht eine neue Instanz. Referenzen also nicht dauerhaft zwischenspeichern. - Skript schlägt CSS: Nach einem Aufruf von
pause()oderplay()per Skript werden spätere Änderungen ananimation-play-stateim CSS für diese Animation ignoriert. Dasselbe gilt für andere Eigenschaften, die man übereffect.updateTiming()überschrieben hat. - Zeitpunkt: Direkt nachdem eine Klasse gesetzt wurde, muss der Stil erst berechnet werden.
getAnimations()erzwingt diese Stilberechnung, das kann bei häufigen Aufrufen auf die Leistung gehen. - Pseudo-Elemente: Animationen auf
::before/::afterfindet man mitgetAnimations({ subtree: true }).effect.targetzeigt dann auf das Elternelement, das Pseudo-Element steht ineffect.pseudoElement. - Kompatibilität: Wird seit 2020 von allen aktuellen Browsern unterstützt. Für ältere Browser vorher per
'CSSAnimation' in windowprüfen. - Für CSS-Übergänge (
transition) gibt es die SchwesterklasseCSSTransitionmit der EigenschafttransitionProperty.