Signatur
Beschreibung
Element.animate() ist der einfachste Einstieg in die Web Animations API. Mit einem Aufruf wird ein KeyframeEffect erzeugt, in ein Animation-Objekt verpackt, an das Element gebunden und abgespielt. Das Ergebnis ist vergleichbar mit einer CSS-Animation, wird aber vollständig per JavaScript gesteuert – ohne @keyframes-Regeln im Stylesheet.
Die Methode eignet sich besonders für dynamische Animationen, deren Werte erst zur Laufzeit feststehen (z. B. Positionen aus Mausereignissen, berechnete Höhen), sowie für Animationen, die pausiert, umgekehrt, beschleunigt oder abgebrochen werden sollen. Über das zurückgegebene Animation-Objekt stehen play(), pause(), reverse(), cancel(), finish(), playbackRate und das Promise finished zur Verfügung.
Keyframes können als Array von Objekten ([{ opacity: 0 }, { opacity: 1 }]) oder als Objekt mit Werte-Arrays ({ opacity: [0, 1] }) angegeben werden. CSS-Eigenschaften werden in camelCase geschrieben (backgroundColor); offset, easing und composite sind spezielle Keyframe-Schlüssel.
Wichtig: Nach Ende der Animation kehrt das Element standardmäßig in seinen ursprünglichen Stil zurück. Soll der Endzustand erhalten bleiben, nutzt man fill: "forwards" oder – sauberer – setzt den Endwert nach animation.finished direkt per Stil bzw. mit commitStyles().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $keyframes Pflicht | Array<Object> | Object | null | Keyframes als Array von Stil-Objekten oder als Objekt mit Werte-Arrays pro Eigenschaft. Optionale Schlüssel: offset (0–1), easing, composite. null erzeugt eine Animation ohne Keyframes. |
|
| $options | number | Object | Entweder die Dauer in Millisekunden oder ein Objekt mit Zeitangaben: duration, delay, endDelay, iterations (auch Infinity), direction ("normal", "reverse", "alternate", "alternate-reverse"), easing, fill ("none", "forwards", "backwards", "both"), iterationStart, composite, iterationComposite, id, pseudoElement (z. B. "::before") sowie timeline (z. B. eine ScrollTimeline). |
Rückgabewert
Animation-Objekt, über das die Wiedergabe gesteuert und das Ende per animation.finished (Promise) abgewartet werden kann.Beispiele
Einfaches Einblenden mit Dauer als Zahl
const box = document.querySelector('.box');
// Dauer direkt als Zahl (Millisekunden)
box.animate(
[
{ opacity: 0, transform: 'translateY(20px)' },
{ opacity: 1, transform: 'translateY(0)' }
],
400
);
Endlos pulsierender Button mit Optionen-Objekt
const button = document.querySelector('#cta');
const pulse = button.animate(
{ transform: ['scale(1)', 'scale(1.08)', 'scale(1)'] },
{
duration: 1200,
iterations: Infinity,
easing: 'ease-in-out'
}
);
// Beim Hover pausieren, danach weiterlaufen lassen
button.addEventListener('mouseenter', () => pulse.pause());
button.addEventListener('mouseleave', () => pulse.play());
Element ausblenden und danach entfernen
const removeWithFade = async (el) => {
const anim = el.animate(
[{ opacity: 1, height: `${el.offsetHeight}px` }, { opacity: 0, height: '0px' }],
{ duration: 300, easing: 'ease-out', fill: 'forwards' }
);
await anim.finished;
el.remove();
console.log('Element entfernt');
};
document.querySelectorAll('.notice .close').forEach((btn) => {
btn.addEventListener('click', () => removeWithFade(btn.closest('.notice')));
});
Endzustand übernehmen und Bewegungsreduktion respektieren
const panel = document.querySelector('.panel');
const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
const anim = panel.animate(
[{ transform: 'translateX(-100%)' }, { transform: 'translateX(0)' }],
{ duration: reduceMotion ? 0 : 500, easing: 'cubic-bezier(.2,.8,.2,1)', fill: 'forwards' }
);
anim.finished.then(() => {
anim.commitStyles(); // Endwert in style-Attribut schreiben
anim.cancel(); // Animation freigeben
console.log(panel.style.transform);
});
// Wichtig · Fallstricke
- Stil wird zurückgesetzt: Ohne
fill: "forwards"springt das Element nach Ende in den Ausgangszustand zurück. Viele dauerhaft gefüllte Animationen kosten Speicher; Browser entfernen ersetzte Fill-Animationen automatisch (Ereignisremove). Besser:commitStyles()+cancel(). - camelCase statt Bindestrich:
backgroundColorstattbackground-color;floatheißtcssFloat,offsetmuss alscssOffsetgeschrieben werden, daoffsetein Keyframe-Schlüssel ist. - Performance: Nur
transformundopacitywerden zuverlässig auf dem Compositor animiert. Eigenschaften wiewidth,heightodertoplösen Layout aus und können ruckeln. - Abgebrochene Animationen: Wird
cancel()aufgerufen, wirdanimation.finishedmit einemAbortErrorabgelehnt – beimawaitggf. mittry/catchabsichern. - Kompatibilität: Grundfunktion in allen modernen Browsern (Chrome 36+, Firefox 48+, Safari 13.1+). Optionen wie
composite,pseudoElement,commitStyles()sind jünger;timelinemitScrollTimeline/ViewTimelinewird noch nicht überall unterstützt. Einfache Easing-Werte wielinear()ggf. prüfen. - Barrierefreiheit:
prefers-reduced-motionberücksichtigen und Bewegungen für betroffene Nutzer reduzieren.