Signatur
Beschreibung
KeyframeEffect ist der Baustein der Web Animations API, der festlegt, was animiert wird: ein Zielelement (target), eine Liste von Keyframes und Zeitangaben wie Dauer, Verzögerung oder Wiederholungen. Abgespielt wird der Effekt erst, wenn du ihn an ein Animation-Objekt übergibst: new Animation(effect, document.timeline).
Intern nutzt Element.prototype.animate() genau diese Schnittstelle: Die Methode baut einen KeyframeEffect, legt eine Animation an und startet sie. Selbst einen KeyframeEffect zu bauen lohnt sich, wenn du einen Effekt wiederverwenden, vor dem Start ändern, zwischen Elementen austauschen oder mit GroupEffect-ähnlichen Mustern selbst koordinieren willst.
Wichtige Mitglieder:
target: das animierte Element (odernull), lesbar und schreibbar.pseudoElement: ein Pseudo-Element wie"::before"als Ziel.composite: wie die Werte mit darunterliegenden Werten kombiniert werden ("replace","add","accumulate").iterationComposite: wie sich die Werte über Wiederholungen hinweg aufbauen ("replace"|"accumulate").getKeyframes()/setKeyframes(): berechnete Keyframes auslesen oder ersetzen.- Geerbt von
AnimationEffect:getTiming(),getComputedTiming(),updateTiming().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $target Pflicht | Element | null | Das Element, das animiert werden soll. null ist erlaubt, dann wird nichts sichtbar gerendert. |
|
| $keyframes Pflicht | Keyframe[] | PropertyIndexedKeyframes | null | Keyframes als Array von Objekten ([{ opacity: 0 }, { opacity: 1 }]) oder als Objekt, das jeder Eigenschaft ein Werte-Array zuordnet ({ opacity: [0, 1] }). Pro Keyframe sind offset, easing und composite erlaubt. |
|
| $options | number | KeyframeEffectOptions | 0 | Dauer in Millisekunden oder ein Objekt mit duration, delay, endDelay, iterations, iterationStart, direction, easing, fill, composite, iterationComposite und pseudoElement. |
| $source | KeyframeEffect | Alternative Konstruktorform new KeyframeEffect(source): Erstellt eine unabhängige Kopie eines bestehenden Effekts. |
Rückgabewert
new Animation() oder weist ihn animation.effect zu.Beispiele
Effekt erstellen und mit Animation abspielen
const box = document.querySelector('.box');
const fadeIn = new KeyframeEffect(
box,
[
{ opacity: 0, transform: 'translateY(20px)' },
{ opacity: 1, transform: 'translateY(0)' }
],
{ duration: 400, easing: 'ease-out', fill: 'forwards' }
);
const animation = new Animation(fadeIn, document.timeline);
animation.play();
await animation.finished;
console.log('Einblenden fertig');
Keyframes auslesen und nachträglich ändern
const effect = new KeyframeEffect(
document.querySelector('#banner'),
{ backgroundColor: ['#fff', '#ffeb3b'] },
1000
);
console.log(effect.getKeyframes().length);
// Farbe zur Laufzeit austauschen
effect.setKeyframes({ backgroundColor: ['#fff', '#4caf50'] });
effect.updateTiming({ iterations: 2, direction: 'alternate' });
console.log(effect.getTiming().iterations);
new Animation(effect).play();
Effekt kopieren und auf mehrere Elemente anwenden
const template = new KeyframeEffect(
null,
[{ transform: 'scale(1)' }, { transform: 'scale(1.1)' }, { transform: 'scale(1)' }],
{ duration: 300 }
);
document.querySelectorAll('.card').forEach((card, i) => {
const effect = new KeyframeEffect(template); // unabhängige Kopie
effect.target = card;
effect.updateTiming({ delay: i * 100 });
new Animation(effect).play();
});
Pseudo-Element animieren
const pulse = new KeyframeEffect(
document.querySelector('.badge'),
{ opacity: [1, 0.3, 1] },
{ duration: 1200, iterations: Infinity, pseudoElement: '::after' }
);
const anim = new Animation(pulse);
anim.play();
console.log(pulse.pseudoElement);
// Wichtig · Fallstricke
- Ein Effekt spielt nichts von allein ab: Ohne
Animation-Objekt undplay()passiert nichts. Für einfache Fälle reichtelement.animate(). - Standardwert für
fillist"none": Nach dem Ende springt das Element auf seinen Ausgangsstil zurück.fill: "forwards"hält den Endzustand, erzeugt aber dauerhaft aktive Animationen. Besser ist oft, den Endwert percommitStyles()zu übernehmen und danncancel()aufzurufen. - Die Standarddauer ist 0: Ohne
durationläuft die Animation sofort durch. - Eigenschaftsnamen schreibst du in camelCase (
backgroundColor),floatwird zucssFloatundoffsetzucssOffset. Ungültigeeasing-Werte lösen einenTypeErroraus. - Uneinheitliche Keyframe-Abstände (
offset) müssen aufsteigend sortiert sein, sonst gibt es einenTypeError. - Leistung: Nur
transformundopacitylaufen zuverlässig auf dem Compositor-Thread. Andere Eigenschaften wiewidthodertoplösen ein neues Layout aus. - Kompatibilität: Konstruktor,
getKeyframes()undsetKeyframes()funktionieren in Chrome/Edge 84+, Firefox 63+ und Safari 13.1+.pseudoElementundcompositegibt es erst in neueren Versionen.iterationCompositewird nur teilweise unterstützt. - Denke an Barrierefreiheit: Mit
matchMedia('(prefers-reduced-motion: reduce)')kannst du Animationen abschwächen.