Start · Sprachen · JavaScript · Referenz · CSSRuleList.length

CSSRuleList.length

Eigenschaft

Gibt die Anzahl der <code>CSSRule</code>-Objekte in einer <code>CSSRuleList</code> als nicht negative Ganzzahl zurück (nur lesbar).

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

get CSSRuleList.length

Beschreibung

Die schreibgeschützte Eigenschaft length des Interfaces CSSRuleList liefert die Anzahl der CSS-Regeln in der Liste. Eine CSSRuleList bekommt man typischerweise über CSSStyleSheet.cssRules oder über die cssRules-Eigenschaft einer Gruppierungsregel wie CSSMediaRule, CSSSupportsRule oder CSSKeyframesRule.

Gebraucht wird length vor allem in drei Fällen: um mit einer klassischen for-Schleife über alle Regeln zu laufen, um zu prüfen, ob ein Stylesheet überhaupt Regeln enthält, und um neue Regeln mit CSSStyleSheet.insertRule(rule, sheet.cssRules.length) am Ende eines Stylesheets einzufügen.

Die Liste ist live: Wenn Regeln über insertRule() oder deleteRule() hinzukommen oder wegfallen, ändert sich length sofort mit. Gezählt werden nur die Regeln der obersten Ebene. Regeln innerhalb von @media-Blöcken zählen also jeweils als eine einzige Regel. Wer tiefer hinein will, muss die Liste rekursiv durchlaufen.

Rückgabewert

Typ
number
Beschreibung
Nicht negative Ganzzahl mit der Anzahl der CSSRule-Objekte in der Liste. Bei einer leeren Liste ist der Wert 0.

Beispiele

Anzahl der Regeln aller Stylesheets ausgeben

// Zählt die Regeln jedes Stylesheets, das von derselben Herkunft stammt
for (const sheet of document.styleSheets) {
  try {
    console.log(`${sheet.href ?? 'inline'}: ${sheet.cssRules.length} Regeln`);
  } catch (err) {
    // Stylesheets von fremden Herkünften sind ohne CORS gesperrt
    console.warn('Kein Zugriff auf', sheet.href);
  }
}
inline: 12 Regeln https://example.com/main.css: 348 Regeln

Regel ans Ende eines Stylesheets anfügen

const style = document.createElement('style');
document.head.append(style);
const sheet = style.sheet;

console.log(sheet.cssRules.length); // 0

// length als Index sorgt dafür, dass die Regel ans Ende kommt
sheet.insertRule('body { margin: 0; }', sheet.cssRules.length);
sheet.insertRule('.hinweis { color: crimson; }', sheet.cssRules.length);

console.log(sheet.cssRules.length); // 2 – die Liste ist live
0 2

Regeln inklusive verschachtelter @media-Blöcke rekursiv zählen

const countRules = (ruleList) => {
  let total = 0;
  for (let i = 0; i < ruleList.length; i++) {
    const rule = ruleList[i];
    total++;
    // Gruppierungsregeln (@media, @supports …) besitzen eigene cssRules
    if (rule.cssRules) total += countRules(rule.cssRules);
  }
  return total;
};

const style = document.createElement('style');
style.textContent = `
  p { color: gray; }
  @media (min-width: 600px) {
    p { color: black; }
    h1 { font-size: 2rem; }
  }
`;
document.head.append(style);

console.log(style.sheet.cssRules.length);    // oberste Ebene
console.log(countRules(style.sheet.cssRules)); // inklusive Verschachtelung
2 4

// Wichtig · Fallstricke

  • Nur lesbar: Wenn man length etwas zuweist, passiert nichts. Im Strict Mode wird ein TypeError geworfen. Um die Liste zu kürzen, nimmt man CSSStyleSheet.deleteRule().
  • Live-Liste: Wer beim Schleifendurchlauf Regeln löscht, verschiebt dabei die Indizes. Deshalb rückwärts laufen: for (let i = list.length - 1; i >= 0; i--).
  • Stylesheets von fremden Herkünften: Schon der Zugriff auf cssRules (und damit auf length) wirft einen SecurityError, wenn das Stylesheet von einer anderen Herkunft ohne passende CORS-Header (crossorigin-Attribut + Access-Control-Allow-Origin) geladen wurde.
  • Kein echtes Array: CSSRuleList hat keine Methoden wie map() oder filter(). Mit Array.from(list) lässt sie sich umwandeln. for…of funktioniert in modernen Browsern direkt.
  • Die Eigenschaft wird von allen gängigen Browsern seit Langem unterstützt.