Signatur
Beschreibung
Ein Animation-Objekt verbindet einen Effekt (meist einen KeyframeEffect, also Keyframes plus Timing auf einem Ziel-Element) mit einer Zeitleiste (standardmäßig document.timeline). Es steuert, wann und wie schnell der Effekt abläuft. Am häufigsten entsteht es als Rückgabewert von Element.animate(). Man kann es aber auch direkt mit new Animation(effect, timeline) erzeugen.
Wiedergabe-Methoden: play(), pause(), reverse(), finish(), cancel(), updatePlaybackRate(), persist() und commitStyles(). Wichtige Eigenschaften:
currentTimeundstartTime: aktuelle Position bzw. Startzeitpunkt auf der Zeitleiste, in Millisekunden. Beide lassen sich setzen, etwa zum Suchen (Seeking).playbackRate: Abspieltempo. Negative Werte spielen rückwärts.playState: einer der Werte"idle","running","paused"oder"finished".pendingisttrue, solange eine Wiedergabe-Änderung noch aussteht.readyundfinished: Promises für „bereit zum Abspielen“ und „fertig“.effect,timeline,idundreplaceState.
Außerdem feuert Animation die Events finish, cancel und remove. Man empfängt sie per addEventListener() oder über die Eigenschaften onfinish, oncancel und onremove. CSS-Animationen und CSS-Transitions sind ebenfalls Animation-Instanzen (CSSAnimation, CSSTransition). Man erreicht sie über element.getAnimations() oder document.getAnimations() und kann sie dann per Skript steuern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $effect | AnimationEffect | null | null | Konstruktor-Parameter: der abzuspielende Effekt, meist ein KeyframeEffect. |
| $timeline | AnimationTimeline | null | document.timeline | Konstruktor-Parameter: die Zeitleiste, mit der die Animation verknüpft wird. Möglich sind z. B. document.timeline, eine ScrollTimeline oder null (dann gibt es keinen Zeitfortschritt). |
Rückgabewert
new Animation() liefert einen neuen Animations-Player im Zustand "idle". Er startet erst mit play().Beispiele
Animation per Element.animate() erzeugen und steuern
const box = document.querySelector('.box');
const anim = box.animate(
[
{ transform: 'translateX(0)', opacity: 1 },
{ transform: 'translateX(300px)', opacity: 0.5 }
],
{ duration: 1000, easing: 'ease-in-out', fill: 'forwards' }
);
console.log(anim instanceof Animation, anim.playState);
document.querySelector('#pause').addEventListener('click', () => anim.pause());
document.querySelector('#play').addEventListener('click', () => anim.play());
document.querySelector('#reverse').addEventListener('click', () => anim.reverse());
Konstruktor mit KeyframeEffect und Ende per Promise abwarten
const toast = document.querySelector('.toast');
const effect = new KeyframeEffect(
toast,
[{ opacity: 0, transform: 'translateY(20px)' }, { opacity: 1, transform: 'none' }],
{ duration: 400, fill: 'both' }
);
const anim = new Animation(effect, document.timeline);
console.log(anim.playState); // vor play()
anim.play();
await anim.finished;
console.log('Einblenden fertig:', anim.playState);
Suchen (Seeking) mit einem Schieberegler und Tempo ändern
const spinner = document.querySelector('.spinner');
const slider = document.querySelector('#progress'); // <input type="range" max="2000">
const anim = spinner.animate(
[{ transform: 'rotate(0turn)' }, { transform: 'rotate(1turn)' }],
{ duration: 2000, iterations: Infinity }
);
anim.pause();
slider.addEventListener('input', () => {
anim.currentTime = Number(slider.value); // Millisekunden
});
// Tempo ohne Sprung verdoppeln
document.querySelector('#fast').addEventListener('click', () => {
anim.updatePlaybackRate(2);
anim.play();
});
finish-Event per addEventListener und onfinish, Endzustand festschreiben
const panel = document.querySelector('.panel');
const anim = panel.animate([{ height: '0px' }, { height: '200px' }], {
duration: 300,
fill: 'forwards'
});
const onDone = () => {
anim.commitStyles(); // Endwerte ins style-Attribut schreiben
anim.cancel(); // Effekt freigeben
console.log(panel.style.height);
};
anim.addEventListener('finish', onDone, { once: true });
// Alternative über die Eigenschaft:
// anim.onfinish = onDone;
anim.addEventListener('cancel', () => console.log('abgebrochen'));
// Wichtig · Fallstricke
- Zeitangaben:
currentTimeundstartTimesind in Millisekunden angegeben. Sie könnennullsein, z. B. im Zustand"idle"oder ohne aktive Zeitleiste. Bei Scroll-getriebenen Zeitleisten ist der Wert einCSSNumericValuein Prozent. finished-Promise: Ruft mancancel()auf, wird das aktuellefinished-Promise mit einemAbortErrorabgelehnt. Alsoawait anim.finishedintry/catchsetzen. Nach jedem Neustart gibt es ein neues Promise-Objekt.- Tempo ändern: Wer
playbackRatedirekt setzt, erzeugt während der Wiedergabe einen Sprung.updatePlaybackRate()dagegen ändert das Tempo ohne Sprung und synchron zum nächsten Frame. fill: "forwards"und Speicher: Animationen mitfill: "forwards"bleiben dauerhaft aktiv. Der Browser entfernt sie automatisch, sobald sie vollständig von anderen Animationen überdeckt werden (replaceStatewird dann"removed", das Eventremovefeuert). Mitpersist()lässt sich das verhindern. Besser ist meistcommitStyles()gefolgt voncancel().- Leistung: Animationen von
transformundopacitylaufen im Compositor-Thread und damit flüssiger. Layout-Eigenschaften wieheightoderwidtherzwingen dagegen ein Reflow in jedem Frame. - Barrierefreiheit:
prefers-reduced-motionbeachten, z. B. permatchMedia('(prefers-reduced-motion: reduce)'). - Kompatibilität: Die Kern-API wird von Chrome, Edge, Firefox und Safari unterstützt (Safari ab 13.1, vollständig ab 14).
commitStyles(),persist()undreplaceStategibt es erst in neueren Versionen.ScrollTimelineundViewTimelinefehlen in Firefox standardmäßig noch.