Signatur
Beschreibung
Die schreibgeschützte Eigenschaft media der Schnittstelle StyleSheet (und damit auch von CSSStyleSheet) gibt ein MediaList-Objekt zurück. Es beschreibt, für welche Zielmedien bzw. Medienabfragen das Stylesheet gilt. Bei <link>- und <style>-Elementen wird die Liste aus dem HTML-Attribut media befüllt, bei @import-Regeln aus der dort angegebenen Medienliste.
„Schreibgeschützt“ heißt nur, dass die Referenz auf das MediaList-Objekt nicht ersetzt werden kann. Die Liste selbst lässt sich ändern: über mediaText, appendMedium() und deleteMedium(). Wenn du sheet.media einen String zuweist, wird er laut Spezifikation an media.mediaText weitergeleitet ([PutForwards=mediaText]).
Typische Anwendungsfälle sind: Stylesheets zur Laufzeit nur für bestimmte Medien aktivieren (etwa eine Druckvorschau auf dem Bildschirm), die Medienbedingungen eingebundener Stylesheets prüfen oder bei konstruierten Stylesheets (new CSSStyleSheet({ media })) eine Medienbedingung festlegen. Eine leere Liste bedeutet: Das Stylesheet gilt für alle Medien.
Rückgabewert
MediaList-Objekt mit den Eigenschaften mediaText und length sowie den Methoden item(), appendMedium() und deleteMedium(). Ist die Liste leer (length === 0), gilt das Stylesheet für alle Medien.Beispiele
Medienbedingungen aller Stylesheets auflisten
// HTML: <link rel="stylesheet" href="main.css">
// <link rel="stylesheet" href="print.css" media="print">
// <style media="screen and (max-width: 600px)">…</style>
for (const sheet of document.styleSheets) {
const { media } = sheet;
const ziel = media.length === 0 ? 'alle Medien' : media.mediaText;
console.log(`${sheet.href ?? 'inline'} → ${ziel}`);
}
Druckvorschau auf dem Bildschirm umschalten
const printSheet = [...document.styleSheets]
.find((s) => s.href?.endsWith('print.css'));
const togglePrintPreview = (aktiv) => {
if (!printSheet) return;
if (aktiv) {
printSheet.media.appendMedium('screen');
} else {
printSheet.media.deleteMedium('screen');
}
console.log('Medien:', printSheet.media.mediaText);
};
togglePrintPreview(true);
togglePrintPreview(false);
Konstruiertes Stylesheet mit Medienbedingung
const darkSheet = new CSSStyleSheet({ media: '(prefers-color-scheme: dark)' });
darkSheet.replaceSync('body { background: #111; color: #eee; }');
document.adoptedStyleSheets = [...document.adoptedStyleSheets, darkSheet];
console.log(darkSheet.media.mediaText);
// Nachträglich per Zuweisung ändern (wird an mediaText weitergeleitet)
darkSheet.media = 'print';
console.log(darkSheet.media.mediaText, darkSheet.media.length);
// Wichtig · Fallstricke
- Kein Ersetzen des Objekts:
sheet.medialiefert immer dasselbeMediaList-Objekt. Eine String-Zuweisung setzt nurmediaText. Willst du die Liste leeren, weisemediaText = ''zu, dann gilt das Stylesheet für alle Medien. - Attribut und Liste sind nicht dasselbe: Wenn du das
media-Attribut eines<link>/<style>-Elements änderst, wird die Liste aktualisiert. Umgekehrt ändern Anpassungen perappendMedium()das HTML-Attribut nicht. Brauchst du beides synchron, setze lieber das Attribut. - Ungültige Abfragen: Syntaktisch fehlerhafte Medienabfragen werden zu
not allund schalten das Stylesheet damit praktisch ab. - Cross-Origin: Anders als
cssRuleskannst dumediaauch bei Stylesheets von fremden Origins lesen, ohne dass einSecurityErrorausgelöst wird. - Kompatibilität: Die Eigenschaft wird in allen Browsern unterstützt. Die Option
mediaim Konstruktornew CSSStyleSheet()undadoptedStyleSheetsgibt es erst in neueren Browsern (Safari ab 16.4). - Ob eine Medienbedingung gerade zutrifft, verrät
medianicht. Prüfe das mitwindow.matchMedia(sheet.media.mediaText).matches.