Start · Sprachen · JavaScript · Referenz · CSSLayerStatementRule.nameList

CSSLayerStatementRule.nameList

Eigenschaft

Gibt die in einer <code>@layer</code>-Anweisung (ohne Block) deklarierten Cascade-Layer-Namen als eingefrorenes Array von Strings zurück.

seit JavaScript Baseline 2022: Chrome/Edge 99+, Firefox 97+, Safar Kategorie: webapi

Signatur

CSSLayerStatementRule.nameList

Beschreibung

Die schreibgeschützte Eigenschaft nameList gehört zur Schnittstelle CSSLayerStatementRule. Diese Schnittstelle steht für eine @layer-Regel ohne Block, zum Beispiel @layer reset, base, components;. Solche Anweisungen legen die Reihenfolge der Cascade Layers fest, bevor Stilregeln in sie geschrieben werden. nameList liefert die dort aufgeführten Namen in der Reihenfolge, in der sie im Quelltext stehen.

Gebraucht wird die Eigenschaft vor allem in Werkzeugen, die Stylesheets zur Laufzeit untersuchen: Debugging-Tools, Style-Linter, Design-System-Prüfungen oder Skripte, die herausfinden wollen, welche Layer eine Seite in welcher Reihenfolge anlegt. Auf die Regel greift man über CSSStyleSheet.cssRules zu und prüft sie mit rule instanceof CSSLayerStatementRule.

Verschachtelte Layer-Namen werden als ein einziger String mit Punkt-Schreibweise zurückgegeben, z. B. "framework.base". Der Rückgabewert ist ein FrozenArray: Das Array lässt sich lesen und durchlaufen, aber nicht verändern. Einen einzelnen Layer mit Block (@layer name { … }) stellt dagegen CSSLayerBlockRule dar. Dort steht der Name in der Eigenschaft name.

Rückgabewert

Typ
ReadonlyArray<string>
Beschreibung
Ein eingefrorenes Array (FrozenArray<CSSOMString>) mit den Layer-Namen in der Reihenfolge ihrer Deklaration. Verschachtelte Namen stehen in Punkt-Schreibweise, z. B. "theme.dark".

Beispiele

Layer-Namen einer @layer-Anweisung auslesen

const style = document.createElement('style');
style.textContent = '@layer reset, base, components;';
document.head.append(style);

const rule = style.sheet.cssRules[0];
console.log(rule instanceof CSSLayerStatementRule); // true
console.log(rule.nameList);
true ["reset", "base", "components"]

Layer-Reihenfolge aller gleich-origin Stylesheets ermitteln

const collectLayerOrder = () => {
  const order = [];
  for (const sheet of document.styleSheets) {
    let rules;
    try {
      rules = sheet.cssRules; // bei Cross-Origin-Sheets: SecurityError
    } catch {
      continue;
    }
    for (const rule of rules) {
      if (rule instanceof CSSLayerStatementRule) {
        for (const name of rule.nameList) {
          if (!order.includes(name)) order.push(name);
        }
      } else if (rule instanceof CSSLayerBlockRule && rule.name) {
        if (!order.includes(rule.name)) order.push(rule.name);
      }
    }
  }
  return order;
};

console.log(collectLayerOrder());
z. B. ["reset", "base", "components", "utilities"]

Verschachtelte Namen und Unveränderlichkeit

const sheet = new CSSStyleSheet();
sheet.insertRule('@layer framework.base, framework.theme;');

const { nameList } = sheet.cssRules[0];
console.log(nameList);             // Punkt-Schreibweise bleibt erhalten
console.log(Object.isFrozen(nameList));

try {
  'use strict';
  nameList.push('extra');
} catch (err) {
  console.log(err.name);
}
["framework.base", "framework.theme"] true TypeError

// Wichtig · Fallstricke

  • Nur Anweisungen ohne Block: nameList gibt es ausschließlich bei CSSLayerStatementRule. Für @layer name { … } ist CSSLayerBlockRule.name zuständig. Anonyme Layer (@layer { … }) können in einer Anweisung ohne Block nicht vorkommen.
  • Eingefrorenes Array: Aufrufe wie push() oder direkte Zuweisungen an Indizes lösen in Modulen und im Strict Mode einen TypeError aus und werden sonst stillschweigend ignoriert. Wer die Namen bearbeiten will, legt zuerst eine Kopie an: [...rule.nameList].
  • Keine vollständige Layer-Reihenfolge: Die Liste enthält nur die Namen dieser einen Regel. Die tatsächliche Reihenfolge der Kaskade entsteht aus allen @layer-Regeln, allen @import … layer()-Regeln und der Reihenfolge der Stylesheets. Liegen Layer-Regeln in @media- oder @supports-Blöcken, muss man deren cssRules ebenfalls rekursiv durchlaufen.
  • Cross-Origin: Wer auf cssRules fremder Stylesheets ohne passende CORS-Freigabe zugreift, bekommt einen SecurityError.
  • Kompatibilität: Die Eigenschaft wird seit 2022 von allen aktuellen Browsern unterstützt. In älteren Browsern ist CSSLayerStatementRule nicht definiert. Wer solche Browser unterstützen muss, prüft vorher mit typeof CSSLayerStatementRule !== 'undefined'.