Signatur
Beschreibung
Die schreibgeschützte Eigenschaft cssRules der Schnittstelle CSSGroupingRule liefert eine CSSRuleList mit allen Regeln, die innerhalb einer Gruppierungsregel stehen. Gruppierungsregeln sind z. B. @media (CSSMediaRule), @supports (CSSSupportsRule), @container (CSSContainerRule), @layer-Blöcke (CSSLayerBlockRule) und @scope. In neueren Browsern ist auch CSSStyleRule eine Gruppierungsregel, da CSS-Verschachtelung (Nesting) unterstützt wird.
Man benutzt cssRules, um Stylesheets zur Laufzeit zu untersuchen oder zu durchsuchen: etwa um alle Regeln innerhalb eines bestimmten Media-Querys aufzulisten, Selektoren zu finden oder Werte gezielt zu ändern. Da Gruppierungsregeln beliebig tief verschachtelt sein können, durchläuft man sie typischerweise rekursiv.
Die Liste ist live: Änderungen durch insertRule() oder deleteRule() an derselben Gruppierungsregel spiegeln sich sofort wider. Die Eigenschaft selbst kann nicht zugewiesen werden; Regeln fügt man über die Methoden von CSSGroupingRule hinzu oder entfernt sie.
Rückgabewert
CSSRule-Objekten (mit length und item(index) bzw. Indexzugriff), die die verschachtelten Regeln enthält.Beispiele
Regeln innerhalb einer @media-Regel auflisten
const style = document.createElement('style');
style.textContent = `
body { margin: 0; }
@media (max-width: 600px) {
.nav { display: none; }
.menu-btn { display: block; }
}
`;
document.head.append(style);
const sheet = style.sheet;
const mediaRule = [...sheet.cssRules].find((r) => r instanceof CSSMediaRule);
console.log(mediaRule.conditionText);
for (const rule of mediaRule.cssRules) {
console.log(rule.cssText);
}
Alle Stilregeln rekursiv durchsuchen
// Sammelt alle CSSStyleRule-Objekte, auch in verschachtelten Gruppen
const collectStyleRules = (ruleList, result = []) => {
for (const rule of ruleList) {
if (rule instanceof CSSStyleRule) result.push(rule);
// CSSGroupingRule enthält selbst wieder cssRules
if (rule instanceof CSSGroupingRule) {
collectStyleRules(rule.cssRules, result);
}
}
return result;
};
const style = document.createElement('style');
style.textContent = `
@supports (display: grid) {
@media (min-width: 800px) { .grid { display: grid; } }
}
`;
document.head.append(style);
const rules = collectStyleRules(style.sheet.cssRules);
console.log(rules.map((r) => r.selectorText));
Live-Verhalten nach insertRule()
const style = document.createElement('style');
style.textContent = '@media print { h1 { color: black; } }';
document.head.append(style);
const printRule = style.sheet.cssRules[0];
const list = printRule.cssRules;
console.log(list.length);
printRule.insertRule('nav { display: none; }', list.length);
console.log(list.length);
console.log(list[1].cssText);
// Wichtig · Fallstricke
CSSRuleListist kein echtes Array: Methoden wiemap()oderfilter()fehlen. Mit[...rule.cssRules]oderArray.from()umwandeln;for...offunktioniert direkt.- Bei Stylesheets von fremden Ursprüngen (Cross-Origin ohne CORS) wirft bereits der Zugriff auf
CSSStyleSheet.cssRuleseinenSecurityError– man gelangt dann gar nicht erst an die Gruppierungsregeln. - Die Eigenschaft ist schreibgeschützt; eine Zuweisung wird ignoriert (im Strict Mode
TypeError). CSSGroupingRuleals gemeinsame Basisschnittstelle wird von allen modernen Browsern unterstützt. DassCSSStyleRuledavon erbt (CSS-Nesting), gibt es erst in neueren Versionen (etwa Chrome 112+, Safari 16.5+, Firefox 117+) – in älteren Browsern hatCSSStyleRulekeinecssRules.- Der Browser verwirft ungültige Regeln bereits beim Parsen – sie tauchen in
cssRulesnicht auf.