Signatur
Beschreibung
CSSStyleRule ist der CSSOM-Typ für normale Stilregeln, also einen Selektor mit Deklarationsblock. Solche Objekte bekommt man nicht über einen Konstruktor, sondern über die Liste cssRules eines CSSStyleSheet (z. B. document.styleSheets[0].cssRules) oder einer Gruppenregel wie @media. Ob es sich um eine Stilregel handelt, prüft man mit rule instanceof CSSStyleRule.
Wichtige Eigenschaften:
selectorText(string): der Selektor der Regel. Man kann ihn lesen und neu setzen. Ist der neue Selektor ungültig, wird die Zuweisung stillschweigend ignoriert.style(CSSStyleDeclaration, schreibgeschützte Referenz): die Deklarationen. Änderungen daran wirken sofort auf alle Elemente, auf die der Selektor passt.styleMap(StylePropertyMap): typisierter Zugriff über die CSS Typed OM.cssRules,insertRule(),deleteRule(): seit CSS Nesting erbt die Schnittstelle vonCSSGroupingRuleund kann verschachtelte Regeln enthalten.- Von
CSSRulegeerbt:cssText,parentRule,parentStyleSheet.
Sinnvoll ist das z. B. für Themes, bei denen eine Regel zentral geändert wird, statt Tausende Elemente einzeln per Inline-Style anzufassen. Auch Werkzeuge, die Stylesheets untersuchen (Linter, Extraktion von „Critical CSS“), oder Konstruierbare Stylesheets für Web Components nutzen diese Schnittstelle.
Rückgabewert
CSSStyleSheet.cssRules oder CSSGroupingRule.cssRules.Beispiele
Alle Stilregeln eines Stylesheets auflisten
const sheet = new CSSStyleSheet();
sheet.replaceSync(`
.btn { color: white; background: navy; }
@media (min-width: 600px) { .btn { padding: 1rem; } }
`);
for (const rule of sheet.cssRules) {
if (rule instanceof CSSStyleRule) {
console.log(rule.selectorText, '→', rule.style.cssText);
} else {
console.log('Andere Regel:', rule.constructor.name);
}
}
Theme-Farbe zentral in der Regel ändern
const style = document.createElement('style');
style.textContent = '.card { background: #fff; color: #222; }';
document.head.append(style);
const cardRule = [...style.sheet.cssRules]
.find((r) => r instanceof CSSStyleRule && r.selectorText === '.card');
// Wirkt sofort auf alle .card-Elemente
cardRule.style.setProperty('background', '#1e1e1e');
cardRule.style.setProperty('color', '#eee');
console.log(cardRule.cssText);
Selektor ändern und neue Regel einfügen
const sheet = new CSSStyleSheet();
const index = sheet.insertRule('.alt { margin: 0; }');
const rule = sheet.cssRules[index];
rule.selectorText = '.neu, .neu-2';
console.log(rule.selectorText);
rule.selectorText = '::ungültig('; // wird ignoriert
console.log(rule.selectorText);
document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];
Verschachtelte Regeln (CSS Nesting) auslesen
const sheet = new CSSStyleSheet();
sheet.replaceSync('.menu { color: black; &:hover { color: red; } }');
const menu = sheet.cssRules[0];
console.log(menu.cssRules.length);
console.log(menu.cssRules[0].selectorText);
// Wichtig · Fallstricke
- Cross-Origin-Stylesheets: Wird ein Stylesheet von einer fremden Domain ohne passende CORS-Header (
crossorigin-Attribut plusAccess-Control-Allow-Origin) geladen, löst schon der Zugriff aufcssRuleseinenSecurityErroraus. Deshalb intry…catcheinpacken. - Browser normalisieren Werte und Selektoren.
#fffwird z. B. zurgb(255, 255, 255), Leerzeichen ändern sich. Selektoren daher nicht per exaktem Zeichenkettenvergleich mit dem Quelltext abgleichen. - Ein ungültiger Wert bei
selectorTextoderstyle.setProperty()wirft keinen Fehler, sondern wird ignoriert. - Verschachtelung (
cssRules,insertRuleaufCSSStyleRule) gibt es erst in neueren Browsern (Chrome 112+, Safari 16.5+, Firefox 117+). In älteren fehlen diese Mitglieder. styleMap(Typed OM) fehlt in Firefox bislang.- Änderungen an Regeln betreffen alle passenden Elemente und lösen eine Neuberechnung der Stile aus. Viele Änderungen deshalb bündeln, statt sie in einer Schleife einzeln vorzunehmen.