Start · Sprachen · JavaScript · Referenz · StyleSheet

StyleSheet

Schnittstelle

Abstrakte Basisschnittstelle für ein einzelnes Stylesheet im Dokument, von der <code>CSSStyleSheet</code> erbt.

seit JavaScript Baseline: alle Browser (DOM Level 2 Style / CSSOM) Kategorie: webapi

Signatur

interface StyleSheet

Beschreibung

StyleSheet ist die abstrakte Basisschnittstelle des CSS Object Model (CSSOM) für ein einzelnes Stylesheet. Sie ist sprachunabhängig definiert. In der Praxis begegnet man ihr aber fast nur über die abgeleitete Schnittstelle CSSStyleSheet, die zusätzlich Zugriff auf die Regeln (cssRules, insertRule(), replace() usw.) bietet.

Die Schnittstelle stellt allgemeine Metadaten bereit:

  • type: MIME-Typ, bei CSS immer "text/css"
  • href: URL der externen Datei oder null bei Inline-Styles
  • ownerNode: das <link>- oder <style>-Element, das das Stylesheet einbindet
  • parentStyleSheet: das übergeordnete Stylesheet bei @import
  • title: Titel für alternative Stylesheets
  • media: eine MediaList mit den Media Queries
  • disabled: schreibbar, schaltet das Stylesheet ein oder aus

Alle eingebundenen Stylesheets bekommt man über document.styleSheets (eine StyleSheetList), über element.sheet an <style>- und <link>-Elementen und über shadowRoot.styleSheets. Typische Aufgaben sind Theme-Umschaltung per disabled, Debugging (welche Stylesheets sind geladen und woher kommen sie?) und das Auswerten von Media-Bedingungen.

Einen Konstruktor hat StyleSheet nicht: new StyleSheet() wirft einen TypeError. Wer Stylesheets per Skript erzeugen will, verwendet den Konstruktor von CSSStyleSheet (Constructable Stylesheets).

Rückgabewert

Typ
StyleSheet
Beschreibung
Wird nicht direkt erzeugt. Instanzen erhält man z. B. über document.styleSheets[i] oder styleElement.sheet. Sie sind in der Regel vom Typ CSSStyleSheet.

Beispiele

Alle Stylesheets des Dokuments auflisten

// Metadaten jedes eingebundenen Stylesheets ausgeben
for (const sheet of document.styleSheets) {
  console.log({
    type: sheet.type,
    href: sheet.href ?? '(inline)',
    owner: sheet.ownerNode?.nodeName,
    media: sheet.media.mediaText || 'all',
    disabled: sheet.disabled,
    istStyleSheet: sheet instanceof StyleSheet
  });
}
{ type: 'text/css', href: 'https://example.com/main.css', owner: 'LINK', media: 'all', disabled: false, istStyleSheet: true } { type: 'text/css', href: '(inline)', owner: 'STYLE', media: 'print', disabled: false, istStyleSheet: true }

Dark-Mode per disabled umschalten

// HTML: <link rel="stylesheet" href="dark.css" id="dark-theme">
const darkLink = document.getElementById('dark-theme');

const setDarkMode = (aktiv) => {
  // link.sheet ist erst nach dem Laden verfügbar
  if (darkLink.sheet) darkLink.sheet.disabled = !aktiv;
};

darkLink.addEventListener('load', () => setDarkMode(false));
document.querySelector('#toggle').addEventListener('click', () => {
  setDarkMode(darkLink.sheet.disabled);
});

Stylesheet aus einem <style>-Element und kein Konstruktor

const style = document.createElement('style');
style.media = 'screen and (min-width: 600px)';
style.textContent = 'body { background: #eef; }';
document.head.append(style);

const sheet = style.sheet;
console.log(sheet.ownerNode === style); // true
console.log(sheet.media.mediaText);
console.log(sheet.href);

try {
  new StyleSheet();
} catch (e) {
  console.log(e.constructor.name);
}
true screen and (min-width: 600px) null TypeError

// Wichtig · Fallstricke

  • Kein Konstruktor: StyleSheet ist abstrakt. Für dynamisch erzeugte Stylesheets verwendet man new CSSStyleSheet() zusammen mit document.adoptedStyleSheets.
  • Timing: linkElement.sheet ist null, solange die Datei nicht geladen ist. Deshalb auf das load-Ereignis warten.
  • Cross-Origin: Die Metadaten dieser Schnittstelle (href, disabled, media) sind auch bei Stylesheets von fremden Domains lesbar. Wer aber über CSSStyleSheet.cssRules auf die Regeln zugreift, bekommt ohne CORS-Freigabe (crossorigin-Attribut plus passender Server-Header) einen SecurityError.
  • disabled vs. Attribut: sheet.disabled ist nicht dasselbe wie das HTML-Attribut disabled am <link>. Wird das Element neu eingehängt, entsteht ein neues Stylesheet-Objekt und der Zustand geht verloren.
  • ownerNode ist null bei Stylesheets, die per @import eingebunden sind (dann ist parentStyleSheet gesetzt), und bei per Konstruktor erzeugten Stylesheets.
  • Kompatibilität: wird seit Jahren von allen modernen Browsern unterstützt.