Start · Sprachen · JavaScript · Referenz · KeyframeEffect.pseudoElement

KeyframeEffect.pseudoElement

Eigenschaft

Liest oder setzt den Selektor des Pseudo-Elements (z. B. <code>"::before"</code>), das ein <code>KeyframeEffect</code> animiert, oder <code>null</code> für das Zielelement selbst.

seit JavaScript Baseline 2020: Chrome 84, Edge 84, Firefox 75, Saf Kategorie: webapi

Signatur

KeyframeEffect.pseudoElement

Beschreibung

Die Eigenschaft pseudoElement eines KeyframeEffect legt fest, ob die Keyframes auf das Zielelement (target) selbst oder auf eines seiner Pseudo-Elemente wie ::before, ::after oder ::marker angewendet werden. Ist der Wert null, wird das Element selbst animiert.

Damit lassen sich mit der Web Animations API Pseudo-Elemente per JavaScript animieren, ohne eigene CSS-Klassen oder @keyframes-Regeln anzulegen. Das ist nützlich für dekorative Effekte wie Unterstreichungen, Badges, Tooltip-Pfeile oder Aufzählungszeichen, die nur als Pseudo-Element existieren und daher nicht über das DOM erreichbar sind.

Der Wert kann beim Erzeugen über die Option pseudoElement im Konstruktor new KeyframeEffect() bzw. in Element.animate() übergeben oder später geändert werden. Die Eigenschaft ist lesend und schreibend. Die veraltete Schreibweise mit einem Doppelpunkt (":before") wird akzeptiert und intern zu "::before" normalisiert.

Wichtig: Das Pseudo-Element muss tatsächlich erzeugt werden. Bei ::before und ::after braucht es dafür im CSS eine content-Angabe. Ohne diese läuft die Animation zwar formal, man sieht aber nichts.

Parameter

Name Typ Default Beschreibung
$value string | null null Beim Setzen: ein gültiger Pseudo-Element-Selektor wie "::before", "::after" oder "::marker", oder null, um das Zielelement selbst zu animieren.

Rückgabewert

Typ
string | null
Beschreibung
Den normalisierten Pseudo-Element-Selektor (z. B. "::after") oder null, wenn kein Pseudo-Element animiert wird.

Beispiele

::after-Unterstreichung per Element.animate() animieren

// CSS: .link::after { content: ""; display: block; height: 2px; background: currentColor; transform: scaleX(0); }
const link = document.querySelector('.link');

link.addEventListener('mouseenter', () => {
  const anim = link.animate(
    [{ transform: 'scaleX(0)' }, { transform: 'scaleX(1)' }],
    { duration: 250, easing: 'ease-out', fill: 'forwards', pseudoElement: '::after' }
  );
  console.log(anim.effect.pseudoElement);
});
::after

KeyframeEffect mit Konstruktor erzeugen und Wert auslesen

const badge = document.querySelector('.badge');

const effect = new KeyframeEffect(
  badge,
  [{ opacity: 0, transform: 'scale(0.5)' }, { opacity: 1, transform: 'scale(1)' }],
  { duration: 400, pseudoElement: ':before' } // veraltete Schreibweise
);

const animation = new Animation(effect, document.timeline);
animation.play();

console.log(effect.target === badge); // true
console.log(effect.pseudoElement);    // normalisiert
true ::before

Ziel zur Laufzeit wechseln und ungültige Werte abfangen

const item = document.querySelector('li');
const anim = item.animate(
  [{ color: 'black' }, { color: 'crimson' }],
  { duration: 1000, iterations: Infinity, direction: 'alternate' }
);

console.log(anim.effect.pseudoElement); // null → das <li> selbst

// Nur das Aufzählungszeichen animieren
anim.effect.pseudoElement = '::marker';
console.log(anim.effect.pseudoElement);

try {
  anim.effect.pseudoElement = 'kein-selektor';
} catch (err) {
  console.log(err.name);
}
null ::marker SyntaxError

// Wichtig · Fallstricke

  • SyntaxError: Ein ungültiger oder nicht unterstützter Pseudo-Element-Selektor löst beim Setzen bzw. im Konstruktor eine DOMException vom Typ SyntaxError aus. Wie viele Pseudo-Elemente unterstützt werden, hängt vom Browser ab. ::before und ::after funktionieren überall, ::marker und andere nicht zuverlässig.
  • Kein sichtbarer Effekt: ::before/::after existieren nur, wenn im CSS content gesetzt ist. Manche Eigenschaften wie transform wirken außerdem nur, wenn das Pseudo-Element nicht display: inline ist.
  • Nur Pseudo-Elemente mit Selektor: Die Eigenschaft nimmt keine Pseudo-Klassen wie :hover an. Es wird immer nur ein einzelnes Pseudo-Element angegeben, nicht eine Liste.
  • Kompatibilität: Verfügbar seit Chrome/Edge 84, Firefox 75 und Safari 14. Ältere Browser ignorieren die Option pseudoElement in animate() ohne Fehlermeldung und animieren dann das Element selbst. Vorher mit 'pseudoElement' in KeyframeEffect.prototype prüfen.
  • getAnimations() auf dem Element liefert auch Animationen seiner Pseudo-Elemente, wenn { subtree: true } übergeben wird.