Signatur
Beschreibung
Die schreibgeschützte Eigenschaft styleSheets eines ShadowRoot gibt eine StyleSheetList mit CSSStyleSheet-Objekten zurück. Darin stehen alle Stylesheets, die direkt im Shadow-Baum eingebunden sind, also über <style>-Elemente oder <link rel="stylesheet">. Sie ist das Gegenstück zu document.styleSheets, bezieht sich aber nur auf den gekapselten Shadow-DOM.
Nützlich ist die Eigenschaft, wenn man Styles einer Web Component zur Laufzeit untersuchen, debuggen oder anpassen will. Über die enthaltenen CSSStyleSheet-Objekte lassen sich mit cssRules, insertRule() und deleteRule() einzelne Regeln lesen und ändern, ohne das Markup anzufassen.
Wichtig: Stylesheets, die über shadowRoot.adoptedStyleSheets übernommen wurden (Constructable Stylesheets), tauchen in styleSheets nicht auf. Die zurückgegebene Liste ist live: Kommen <style>-Elemente hinzu oder werden welche entfernt, ändert sich die Liste mit.
Rückgabewert
CSSStyleSheet-Objekten in der Reihenfolge, in der sie im Shadow-Baum vorkommen. Ohne eingebettete Stylesheets ist die Liste leer (length === 0).Beispiele
Stylesheets eines Shadow-Baums zählen und auslesen
const host = document.createElement('div');
document.body.append(host);
const shadow = host.attachShadow({ mode: 'open' });
shadow.innerHTML = `
<style>p { color: rebeccapurple; }</style>
<style>.hinweis { font-weight: bold; }</style>
<p class="hinweis">Hallo aus dem Shadow DOM</p>
`;
console.log(shadow.styleSheets.length);
for (const sheet of shadow.styleSheets) {
console.log([...sheet.cssRules].map((r) => r.cssText));
}
Regel zur Laufzeit in einer Web Component ergänzen
class ThemeBox extends HTMLElement {
constructor() {
super();
const shadow = this.attachShadow({ mode: 'open' });
shadow.innerHTML = `
<style>:host { display: block; padding: 1rem; }</style>
<slot></slot>
`;
}
setDarkMode(enabled) {
const [sheet] = this.shadowRoot.styleSheets;
if (enabled) {
sheet.insertRule(':host { background: #222; color: #eee; }', sheet.cssRules.length);
} else if (sheet.cssRules.length > 1) {
sheet.deleteRule(sheet.cssRules.length - 1);
}
}
}
customElements.define('theme-box', ThemeBox);
const box = document.createElement('theme-box');
box.textContent = 'Inhalt';
document.body.append(box);
box.setDarkMode(true);
console.log(box.shadowRoot.styleSheets[0].cssRules.length);
Unterschied zu adoptedStyleSheets
const host = document.createElement('section');
document.body.append(host);
const shadow = host.attachShadow({ mode: 'open' });
const adopted = new CSSStyleSheet();
adopted.replaceSync('h2 { margin: 0; }');
shadow.adoptedStyleSheets = [adopted];
shadow.innerHTML = '<style>h2 { color: teal; }</style><h2>Titel</h2>';
console.log('styleSheets:', shadow.styleSheets.length);
console.log('adoptedStyleSheets:', shadow.adoptedStyleSheets.length);
// Wichtig · Fallstricke
- Adoptierte Stylesheets fehlen: Sheets aus
adoptedStyleSheetssind nicht instyleSheetsenthalten. Für einen vollständigen Überblick müssen beide Listen ausgewertet werden. - Geschlossene Shadow Roots: Bei
mode: 'closed'istelement.shadowRootgleichnull. AufstyleSheetskommt man dann nur über die beimattachShadow()gespeicherte Referenz. - Externe Stylesheets: Ein
<link rel="stylesheet">steht eventuell erst nach dem Laden in der Liste. Außerdem löst der Zugriff aufcssRulesbei Sheets von fremden Ursprüngen ohne passende CORS-Header einenSecurityErroraus. - Live-Liste:
StyleSheetListist kein echtes Array. Fürmap()/filter()vorher mitArray.from()oder dem Spread-Operator umwandeln. - Die Eigenschaft ist schreibgeschützt: Eine Zuweisung wird ignoriert bzw. wirft im Strict Mode einen
TypeError. - Browser-Unterstützung: in allen aktuellen Browsern vorhanden, im Internet Explorer nicht.