Signatur
Beschreibung
CSSConditionRule ist eine abstrakte Schnittstelle im CSS-Objektmodell (CSSOM). Sie steht für alle At-Regeln, deren Inhalt nur dann greift, wenn eine Bedingung erfüllt ist. Instanzen erzeugt man nie direkt. Man bekommt sie über die konkreten Unterklassen CSSMediaRule (@media), CSSSupportsRule (@supports) und CSSContainerRule (@container).
Von CSSGroupingRule erbt die Schnittstelle die Liste der verschachtelten Regeln cssRules sowie die Methoden insertRule() und deleteRule(). Neu hinzu kommt nur die schreibgeschützte Eigenschaft conditionText. Sie liefert die Bedingung als Text, zum Beispiel (min-width: 600px) oder (display: grid).
Praktisch nutzt man CSSConditionRule vor allem mit instanceof. So findet man beim Durchlaufen eines Stylesheets alle bedingten Regeln auf einmal, ohne jeden Typ einzeln prüfen zu müssen. Das hilft bei Werkzeugen, die Stylesheets untersuchen, Breakpoints auslesen oder Regeln zur Laufzeit ändern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $conditionText | string | Eigenschaft (schreibgeschützt): die Bedingung der At-Regel als serialisierter Text, ohne das Schlüsselwort @media/@supports/@container. |
|
| $cssRules | CSSRuleList | Geerbt von CSSGroupingRule: die Liste der Regeln innerhalb des Bedingungsblocks. |
|
| $insertRule(rule, index) | (rule: string, index?: number) => number | index = 0 | Geerbt: fügt eine Regel in den Block ein und gibt ihren Index zurück. |
| $deleteRule(index) | (index: number) => void | Geerbt: entfernt die Regel an der angegebenen Position aus dem Block. |
Rückgabewert
CSSMediaRule, CSSSupportsRule, CSSContainerRule) aus CSSStyleSheet.cssRules.Beispiele
Alle bedingten Regeln eines Stylesheets auflisten
const style = document.createElement('style');
style.textContent = `
body { margin: 0; }
@media (min-width: 600px) { .card { padding: 2rem; } }
@supports (display: grid) { .layout { display: grid; } }
`;
document.head.append(style);
for (const rule of style.sheet.cssRules) {
if (rule instanceof CSSConditionRule) {
console.log(rule.constructor.name, '→', rule.conditionText);
}
}
Breakpoints aus allen Stylesheets sammeln
const collectConditions = (rules, result = []) => {
for (const rule of rules) {
if (rule instanceof CSSConditionRule) {
result.push(rule.conditionText);
collectConditions(rule.cssRules, result); // verschachtelte Regeln
}
}
return result;
};
const conditions = [...document.styleSheets].flatMap((sheet) => {
try {
return collectConditions(sheet.cssRules);
} catch {
return []; // fremde Stylesheets ohne CORS werfen SecurityError
}
});
console.log([...new Set(conditions)]);
Regeln zur Laufzeit in einen Bedingungsblock einfügen
const style = document.createElement('style');
style.textContent = '@media (prefers-color-scheme: dark) { body { background: #111; } }';
document.head.append(style);
const darkRule = style.sheet.cssRules[0];
if (darkRule instanceof CSSConditionRule) {
const index = darkRule.insertRule('body { color: #eee; }', darkRule.cssRules.length);
console.log(index, darkRule.cssText);
}
// Wichtig · Fallstricke
- Abstrakt:
new CSSConditionRule()wirft einenTypeError. Es gibt keinen Konstruktor. conditionTextist schreibgeschützt: Frühere Fassungen der Spezifikation erlaubten Schreibzugriff. Heute ignorieren Browser Zuweisungen. Eine Media-Bedingung ändert man überCSSMediaRule.media(MediaList), oder man löscht die Regel und legt sie neu an.- Serialisierung: Der Browser gibt
conditionTextnormalisiert zurück. Leerzeichen, Groß- und Kleinschreibung oder Farbwerte können sich vom Quelltext unterscheiden. Für Vergleiche also nicht blind auf Zeichenketten-Gleichheit setzen. - Sicherheit: Bei Stylesheets von fremden Ursprüngen ohne CORS-Freigabe löst der Zugriff auf
cssRuleseinenSecurityErroraus. - Kompatibilität:
CSSMediaRuleundCSSSupportsRulesind seit Langem überall verfügbar.CSSContainerRulegibt es erst in neueren Browsern (ungefähr ab 2023). In älteren Browsern istCSSMediaRulemöglicherweise noch keine Unterklasse vonCSSConditionRule. Dort schlägt dieinstanceof-Prüfung fehl.