Signatur
Beschreibung
Das Interface HTMLStyleElement steht für ein <style>-Element, das CSS direkt im Dokument einbettet. Es erbt alle Eigenschaften und Methoden von HTMLElement und ergänzt einige eigene. Instanzen erhält man über document.createElement("style") oder indem man vorhandene Elemente abfragt, etwa mit document.querySelector("style").
Die wichtigsten eigenen Eigenschaften sind:
sheet(nur lesbar): das zugehörigeCSSStyleSheet-Objekt bzw.null, solange das Element nicht im Dokument hängt.media: die Media Query, für die das Stylesheet gilt (z. B."print"oder"(max-width: 600px)").disabled:trueschaltet das Stylesheet ab, ohne das Element zu entfernen.blocking: eineDOMTokenList, mit der man angibt, ob das Stylesheet das Rendern blockiert ("render").type(veraltet): MIME-Typ, heute überflüssig, weiltext/cssder einzige sinnvolle Wert ist.
Gebraucht wird das Interface vor allem, um zur Laufzeit CSS einzuschleusen, etwa für Themes, CSS-in-JS-Bibliotheken, Widgets oder Styles innerhalb eines Shadow DOM. Außerdem kann man bestehende Stylesheets gezielt ein- und ausschalten. Über sheet.insertRule() lassen sich Regeln einzeln einfügen, ohne den Textinhalt neu zu parsen.
Rückgabewert
document.createElement("style") oder von DOM-Abfragen wie querySelector("style") zurückgegeben.Beispiele
Style-Element erzeugen und CSS einfügen
const style = document.createElement("style");
style.textContent = `
.hinweis { background: #fffae6; padding: 1rem; border-left: 4px solid orange; }
`;
document.head.append(style);
console.log(style instanceof HTMLStyleElement);
console.log(style.sheet.cssRules.length);
Regeln dynamisch über sheet.insertRule() ergänzen
const style = document.createElement("style");
document.head.append(style); // sheet existiert erst nach dem Einhängen
const sheet = style.sheet;
sheet.insertRule("body { font-family: system-ui, sans-serif; }", 0);
sheet.insertRule(".btn:hover { opacity: 0.8; }", sheet.cssRules.length);
console.log([...sheet.cssRules].map((r) => r.cssText));
Dark-Mode-Theme per disabled umschalten
const darkTheme = document.createElement("style");
darkTheme.id = "dark-theme";
darkTheme.textContent = "body { background: #121212; color: #eee; }";
darkTheme.disabled = true; // zunächst aus
document.head.append(darkTheme);
const toggleTheme = () => {
darkTheme.disabled = !darkTheme.disabled;
console.log(`Dark Mode: ${darkTheme.disabled ? "aus" : "an"}`);
};
document.querySelector("#theme-toggle")?.addEventListener("click", toggleTheme);
toggleTheme();
Druck-Styles über media einschränken
const printStyle = document.createElement("style");
printStyle.media = "print";
printStyle.textContent = "nav, footer { display: none; }";
document.head.append(printStyle);
console.log(printStyle.media);
console.log(printStyle.sheet.media.mediaText);
// Wichtig · Fallstricke
sheetistnull, solange das Element nicht im Dokument (oder in einem Shadow Root) hängt. Erst einhängen, danninsertRule()aufrufen.disabledvor dem Einhängen: Ältere Browser haben einen vor dem Einhängen gesetzten Wert ignoriert. Sicherer ist es,disablederst nach dem Einfügen zu setzen.- Wenn man
textContentneu setzt, wird das komplette Stylesheet neu geparst, und Regeln, die perinsertRule()eingefügt wurden, gehen verloren. Bei häufigen Änderungen lieber mitsheetarbeiten oder Constructable Stylesheets (new CSSStyleSheet()plusadoptedStyleSheets) verwenden. - Sicherheit: Nutzereingaben nie ungeprüft in
textContenteines Style-Elements schreiben. CSS-Injection kann Daten abgreifen (z. B. über Attribut-Selektoren miturl()-Anfragen) oder die Oberfläche manipulieren. Mit einer strengen Content Security Policy (style-srcohne'unsafe-inline') werden eingebettete Style-Elemente blockiert, außer sie tragen eine passendenonce(style.nonce = "..."). typeist veraltet und sollte nicht mehr gesetzt werden. Das Attributscopedwurde aus dem Standard entfernt; für gekapselte Styles verwendet man heute Shadow DOM oder@scope.- Kompatibilität:
sheet,mediaunddisabledfunktionieren in allen modernen Browsern.blockingist neuer und wird noch nicht überall unterstützt.