Start · Sprachen · JavaScript · Referenz · KeyframeEffect.target

KeyframeEffect.target

Eigenschaft

Liest oder setzt das Element (bzw. dessen Pseudo-Element), auf das ein <code>KeyframeEffect</code> seine Keyframes anwendet.

seit JavaScript Baseline: alle modernen Browser (seit 2020) Kategorie: webapi

Signatur

KeyframeEffect.target

Beschreibung

Die Eigenschaft target eines KeyframeEffect verweist auf das DOM-Element, das durch den Effekt animiert wird. Soll ein Pseudo-Element wie ::before oder ::after animiert werden, bleibt target das Ursprungselement. Das Pseudo-Element selbst wird dann über die zusätzliche Eigenschaft pseudoElement festgelegt.

Die Eigenschaft ist beschreibbar. Deshalb kann man einen fertig konfigurierten Effekt (Keyframes, Dauer, Easing) zur Laufzeit einem anderen Element zuweisen, ohne eine neue Animation anzulegen. Das läuft sogar während der Wiedergabe: Der aktuelle Fortschritt bleibt erhalten, nur das Ziel ändert sich.

Der Wert kann auch null sein. Ein Effekt ohne Ziel läuft zeitlich ganz normal weiter (Ereignisse, currentTime, finished-Promise), zeigt aber nichts an. So lassen sich Effekte zuerst anlegen und erst später an ein Element binden, etwa nachdem es ins DOM eingefügt wurde.

Parameter

Name Typ Default Beschreibung
$value Element | null Beim Setzen: das neue Zielelement oder null, um den Effekt vom Element zu lösen.

Rückgabewert

Typ
Element | null
Beschreibung
Das aktuell animierte Element oder null, wenn der Effekt kein Ziel hat. Bei Pseudo-Elementen ist es das Ursprungselement (siehe pseudoElement).

Beispiele

Ziel eines Effekts auslesen

const box = document.querySelector('#box');
const effect = new KeyframeEffect(
  box,
  [{ opacity: 0 }, { opacity: 1 }],
  { duration: 500, fill: 'forwards' }
);
const animation = new Animation(effect, document.timeline);
animation.play();

console.log(effect.target === box);
console.log(animation.effect.target.id);
true box

Laufende Animation auf ein anderes Element umhängen

const items = [...document.querySelectorAll('.tab')];
const highlight = new KeyframeEffect(
  items[0],
  [{ backgroundColor: '#fff' }, { backgroundColor: '#ffe08a' }],
  { duration: 800, iterations: Infinity, direction: 'alternate' }
);
const anim = new Animation(highlight);
anim.play();

// Beim Klick wandert das Pulsieren zum angeklickten Tab
items.forEach((item) => {
  item.addEventListener('click', () => {
    highlight.target = item;
  });
});

Effekt ohne Ziel anlegen und später binden

const effect = new KeyframeEffect(
  null,
  [{ transform: 'translateY(20px)', opacity: 0 }, { transform: 'none', opacity: 1 }],
  { duration: 300, easing: 'ease-out' }
);
console.log(effect.target);

const toast = document.createElement('div');
toast.textContent = 'Gespeichert!';
document.body.append(toast);

effect.target = toast;
await new Animation(effect).play?.();
console.log(effect.target.textContent);
null Gespeichert!

Pseudo-Element animieren

const button = document.querySelector('button');
const effect = new KeyframeEffect(
  button,
  [{ opacity: 0 }, { opacity: 1 }],
  { duration: 400, pseudoElement: '::after' }
);
new Animation(effect).play();

console.log(effect.target.tagName, effect.pseudoElement);
BUTTON ::after

// Wichtig · Fallstricke

  • Pseudo-Elemente: target gibt nie ein Pseudo-Element zurück, sondern immer das Ursprungselement. Welches Pseudo-Element gemeint ist, steht in KeyframeEffect.pseudoElement, das man für einen vollständigen Vergleich zusätzlich prüfen muss.
  • Bei null gibt es keinen Fehler und keine sichtbare Änderung. Die Animation läuft still weiter und löst weiterhin finish-Ereignisse aus.
  • Wird target umgesetzt, verschwinden die animierten Stile sofort vom alten Element, auch wenn fill: 'forwards' gesetzt ist. Soll der Endzustand erhalten bleiben, vorher animation.commitStyles() aufrufen.
  • Bei Animationen, die mit Element.animate() erstellt wurden, zeigt animation.effect.target auf das aufrufende Element. Bei CSS-Animationen und -Übergängen (CSSAnimation/CSSTransition) ist das Ziel durch CSS festgelegt und sollte nicht per Skript geändert werden.
  • Kompatibilität: Chrome/Edge 84+, Firefox 63+, Safari 14+. In älteren Browsern ist target teilweise nur lesbar oder fehlt ganz, dann hilft das Polyfill web-animations-js.