Signatur
Beschreibung
Die Eigenschaft composite eines KeyframeEffect gibt die Kompositionsoperation an. Sie legt fest, wie die animierten Werte mit dem zugrunde liegenden Wert einer CSS-Eigenschaft verrechnet werden. Das ist entweder der statische Stilwert des Elements oder das Ergebnis einer Animation mit niedrigerer Priorität, die auf dieselbe Eigenschaft wirkt. Man kann den Wert lesen und schreiben. Neu gesetzte Werte gelten sofort, auch während die Animation läuft.
"replace"(Standard): Der animierte Wert ersetzt den zugrunde liegenden Wert vollständig."add": Der animierte Wert wird zum zugrunde liegenden Wert addiert. Beitransformwerden die Funktionen aneinandergehängt, zum BeispieltranslateX(50px) rotate(45deg)."accumulate": Die Werte werden akkumuliert. Beitransformwerden gleichartige Funktionen zusammengerechnet, zum Beispielblur(2px)undblur(3px)zublur(5px), statt sie hintereinander anzuwenden.
Die Eigenschaft hilft vor allem, wenn mehrere Animationen auf dieselbe Eigenschaft wirken. Ein Beispiel ist ein Hover-Effekt, der eine bestehende Transformation nicht überschreiben, sondern ergänzen soll. Mit "add" oder "accumulate" lassen sich Effekte stapeln, ohne dass man die Ausgangswerte im JavaScript kennen oder nachrechnen muss.
Man kann den Wert pro Effekt über composite setzen, bei der Erstellung über das Optionsobjekt von element.animate() bzw. new KeyframeEffect() übergeben oder in einzelnen Keyframes als composite angeben. Ein Wert in einem Keyframe hat für diesen Keyframe Vorrang vor dem Wert des Effekts.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value | "replace" | "add" | "accumulate" | "replace" | Neuer Wert beim Schreiben der Eigenschaft. Ungültige Zeichenketten lösen einen TypeError aus. |
Rückgabewert
Beispiele
Wert auslesen und nachträglich ändern
const box = document.querySelector('.box');
const animation = box.animate(
[{ transform: 'translateX(0)' }, { transform: 'translateX(200px)' }],
{ duration: 1000, iterations: Infinity }
);
console.log(animation.effect.composite);
// Ab sofort auf die bestehende Transformation aufaddieren
animation.effect.composite = 'add';
console.log(animation.effect.composite);
Hover-Pulsieren, das eine vorhandene Drehung ergänzt
// CSS: .card { transform: rotate(-5deg); }
const card = document.querySelector('.card');
card.addEventListener('mouseenter', () => {
card.animate(
[{ transform: 'scale(1)' }, { transform: 'scale(1.1)' }, { transform: 'scale(1)' }],
{ duration: 400, composite: 'add' } // Drehung bleibt erhalten
);
});
Unterschied zwischen add und accumulate
const el = document.querySelector('.foto');
el.style.filter = 'blur(2px)';
const effect = new KeyframeEffect(
el,
[{ filter: 'blur(3px)' }],
{ duration: 1000, fill: 'forwards' }
);
const anim = new Animation(effect, document.timeline);
effect.composite = 'add'; // Ergebnis: blur(2px) blur(3px)
// effect.composite = 'accumulate'; // Ergebnis: blur(5px)
anim.play();
anim.finished.then(() => {
console.log(getComputedStyle(el).filter);
});
Composite pro Keyframe überschreiben
const ball = document.querySelector('.ball');
const anim = ball.animate(
[
{ transform: 'translateY(0)' },
{ transform: 'translateY(-100px)', composite: 'replace' },
{ transform: 'translateY(0)' }
],
{ duration: 800, composite: 'add' }
);
console.log(anim.effect.composite);
console.log(anim.effect.getKeyframes()[1].composite);
// Wichtig · Fallstricke
- Browser-Kompatibilität: Firefox unterstützt die Eigenschaft seit Version 80, Safari seit 14 und Chrome/Edge vollständig erst seit 112. Ältere Chromium-Versionen ignorieren
"add"und"accumulate"stillschweigend oder verarbeiten sie nur teilweise. Prüfen lässt sich die Unterstützung mit'composite' in KeyframeEffect.prototype. - Nicht jede Eigenschaft ist additiv: Bei diskret animierten Eigenschaften wie
displayodervisibilityverhalten sich"add"und"accumulate"wie"replace". - Die Reihenfolge zählt: Bei
transformkommt es bei"add"auf die Reihenfolge der Funktionen an. So ergibtrotate()vortranslate()ein anderes Bild als umgekehrt. - Abgrenzung zu verwandten Eigenschaften:
iterationCompositesteuert, wie sich Werte über Wiederholungen hinweg aufbauen.compositesteuert die Verrechnung mit dem zugrunde liegenden Wert. Beides sind getrennte Einstellungen. - Stapeln mit
fill: 'forwards': Jede neue additive Animation baut auf den vorherigen auf. Der Browser kann ersetzte Animationen automatisch entfernen (replaceState/persist()), dadurch können sich Endwerte unerwartet ändern. - Ungültige Werte lösen beim Setzen einen
TypeErroraus.