Signatur
Beschreibung
Die Eigenschaft media eines CSSMediaRule-Objekts gibt die Media-Query-Liste einer @media-Regel als MediaList zurück. Über dieses Objekt kannst du die Bedingungen der Regel auslesen, zum Beispiel screen and (min-width: 900px). Du kannst sie aber auch zur Laufzeit ändern.
Die Eigenschaft selbst ist schreibgeschützt: Du kannst ihr kein neues Objekt zuweisen. Die zurückgegebene MediaList ist aber veränderbar. Mit mediaText, appendMedium() und deleteMedium() passt du die Bedingungen an. Der Browser wertet die Regel danach sofort neu aus.
Typische Einsatzfälle sind Werkzeuge, die Stylesheets untersuchen (etwa Debugger oder Überprüfungen von Haltepunkten), das dynamische Verschieben von Haltepunkten, ohne CSS neu zu laden, und das Erzeugen von Dokumentation aus vorhandenen Stylesheets.
Rückgabewert
MediaList. Sie hat mediaText (die gesamte Liste als String), length und item(index) sowie die Methoden appendMedium() und deleteMedium().Beispiele
Alle @media-Regeln eines Stylesheets auflisten
const style = document.createElement('style');
style.textContent = `
body { margin: 0; }
@media screen and (min-width: 900px) { body { font-size: 18px; } }
@media print { nav { display: none; } }
`;
document.head.append(style);
const rules = [...style.sheet.cssRules]
.filter((rule) => rule instanceof CSSMediaRule);
for (const rule of rules) {
console.log(rule.media.mediaText);
}
Haltepunkt zur Laufzeit ändern
const style = document.createElement('style');
style.textContent = '@media (min-width: 768px) { .sidebar { display: block; } }';
document.head.append(style);
const mediaRule = style.sheet.cssRules[0];
// Die MediaList selbst ist veränderbar
mediaRule.media.mediaText = '(min-width: 1024px)';
console.log(mediaRule.media.mediaText);
console.log(mediaRule.cssText);
Einzelne Medien hinzufügen und entfernen
const sheet = new CSSStyleSheet();
sheet.replaceSync('@media screen { h1 { color: teal; } }');
const { media } = sheet.cssRules[0];
media.appendMedium('print');
console.log(media.length, media.item(1));
media.deleteMedium('screen');
console.log(media.mediaText);
Prüfen, ob eine Regel gerade greift
const findActiveMediaRules = (sheet) =>
[...sheet.cssRules]
.filter((r) => r instanceof CSSMediaRule)
.filter((r) => window.matchMedia(r.media.mediaText).matches)
.map((r) => r.media.mediaText);
console.log(findActiveMediaRules(document.styleSheets[0]));
// Wichtig · Fallstricke
- Schreibschutz: Eine Zuweisung wie
rule.media = '...'hat keine Wirkung. Im Strict Mode kann sie einenTypeErrorauslösen. Änderungen laufen immer überrule.media.mediaTextoder die Methoden derMediaList. - Serialisierung: Browser normalisieren
mediaText. Leerzeichen, Groß- und Kleinschreibung oder die Schreibweise von Bereichsabfragen wie(width >= 600px)können vom Originalquelltext abweichen. Vergleiche daher nicht blind als String. - Ungültige Queries: Nicht auswertbare Media Queries werden zu
not allund greifen nie. - Cross-Origin-Stylesheets: Auf
cssRulesvon Stylesheets anderer Herkunft ohne CORS-Freigabe kannst du nicht zugreifen. Es wird einSecurityErrorgeworfen. Umschließe den Zugriff daher mittry/catch. - Verschachtelung:
@media-Regeln können in anderen Gruppierungsregeln stecken (@supports,@layer, CSS Nesting). Um alle Regeln zu finden, musst ducssRulesrekursiv durchlaufen. - Die Eigenschaft wird von allen modernen Browsern unterstützt. Das in den Beispielen genutzte
CSSStyleSheet.replaceSync()(konstruierbare Stylesheets) ist erst seit 2023 überall verfügbar.