Start · Sprachen · JavaScript · Referenz · CSSKeyframesRule.length

CSSKeyframesRule.length

Eigenschaft

Gibt die Anzahl der <code>CSSKeyframeRule</code>-Objekte (Keyframes) einer <code>@keyframes</code>-Regel als nicht veränderbare Zahl zurück.

seit JavaScript Baseline 2024 (Chrome 120, Firefox 125, Safari 4) Kategorie: webapi

Signatur

get CSSKeyframesRule.length

Beschreibung

Die Eigenschaft length des Interfaces CSSKeyframesRule ist schreibgeschützt. Sie gibt an, wie viele einzelne Keyframes (CSSKeyframeRule) eine @keyframes-Regel enthält, zum Beispiel from, 50% und to. Der Wert entspricht rule.cssRules.length. Durch length verhält sich CSSKeyframesRule aber selbst wie ein Array-ähnliches Objekt.

Zusammen mit dem Indexzugriff rule[index], der ebenfalls neu dazugekommen ist, kannst du die Keyframes direkt durchlaufen, ohne den Umweg über cssRules. Typische Einsatzfälle sind Werkzeuge, die Animationen untersuchen oder anzeigen, Editoren für Animationen und Code, der mit appendRule() bzw. deleteRule() Keyframes zur Laufzeit ändert und danach die Anzahl prüft.

Der Wert ist immer aktuell: Wenn du mit appendRule() einen Keyframe hinzufügst oder mit deleteRule() einen entfernst, ändert sich length sofort.

Rückgabewert

Typ
number
Beschreibung
Eine ganze Zahl ab 0: die Anzahl der Keyframes in der @keyframes-Regel.

Beispiele

Anzahl der Keyframes einer Animation ermitteln

// CSS in einem <style>-Element:
// @keyframes pulse { from { opacity: 1; } 50% { opacity: .4; } to { opacity: 1; } }
const style = document.createElement('style');
style.textContent = '@keyframes pulse { from { opacity: 1; } 50% { opacity: .4; } to { opacity: 1; } }';
document.head.append(style);

const keyframesRule = style.sheet.cssRules[0];
console.log(keyframesRule.name);   // Name der Animation
console.log(keyframesRule.length); // Anzahl der Keyframes
pulse 3

Keyframes per Index durchlaufen

const style = document.createElement('style');
style.textContent = '@keyframes slide { 0% { transform: translateX(0); } 100% { transform: translateX(200px); } }';
document.head.append(style);

const rule = style.sheet.cssRules[0];
for (let i = 0; i < rule.length; i++) {
  const frame = rule[i]; // CSSKeyframeRule
  console.log(`${frame.keyText}: ${frame.style.transform}`);
}
0%: translateX(0px) 100%: translateX(200px)

length ändert sich nach appendRule() und deleteRule()

const style = document.createElement('style');
style.textContent = '@keyframes fade { from { opacity: 0; } to { opacity: 1; } }';
document.head.append(style);

const rule = style.sheet.cssRules[0];
console.log(rule.length);          // 2

rule.appendRule('50% { opacity: 0.8; }');
console.log(rule.length);          // 3

rule.deleteRule('50%');
console.log(rule.length);          // 2

// Versuch zu schreiben hat keine Wirkung
rule.length = 10;
console.log(rule.length);          // weiterhin 2
2 3 2 2

Abwärtskompatibel mit Rückfall auf cssRules

// Funktioniert auch in älteren Browsern ohne CSSKeyframesRule.length
const countKeyframes = (rule) =>
  typeof rule.length === 'number' ? rule.length : rule.cssRules.length;

const allKeyframes = [...document.styleSheets]
  .flatMap((sheet) => {
    try { return [...sheet.cssRules]; } catch { return []; } // CORS-geschützte Stylesheets überspringen
  })
  .filter((r) => r instanceof CSSKeyframesRule);

allKeyframes.forEach((r) => console.log(r.name, countKeyframes(r)));

// Wichtig · Fallstricke

  • Browser-Unterstützung: length und der Indexzugriff rule[i] gibt es erst seit Chrome/Edge 120 und Firefox 125. Safari unterstützt beides schon sehr lange. Für ältere Browser nimm rule.cssRules.length, das überall funktioniert.
  • Schreibgeschützt: Wenn du length einen Wert zuweist, passiert nichts. Im Strict Mode ("use strict") wird dabei ein TypeError ausgelöst. Keyframes änderst du nur mit appendRule() und deleteRule().
  • Doppelte Selektoren: Wenn zwei Keyframes denselben Selektor haben (z. B. zweimal 50%), zählen beide einzeln mit, auch wenn sich ihre Deklarationen beim Rendern überlagern. Ein Keyframe mit mehreren Selektoren wie 0%, 100% { … } zählt dagegen nur einmal.
  • Kein echtes Array: CSSKeyframesRule hat keine Array-Methoden wie map(). Wandle die Regel vorher mit Array.from(rule.cssRules) um.
  • CORS: Bei Stylesheets von anderen Domains ohne passende CORS-Header löst der Zugriff auf sheet.cssRules einen SecurityError aus. Dann kommst du gar nicht erst an die CSSKeyframesRule.