Signatur
Beschreibung
Die schreibgeschützte Eigenschaft styleMap einer CSSStyleRule gibt ein StylePropertyMap-Objekt zurück. Es gehört zum CSS Typed Object Model (Typed OM) und bildet die Deklarationen der Regel (z. B. .card { width: 200px; }) als Schlüssel-Wert-Paare ab. Anders als bei CSSStyleRule.style, das Werte als Strings liefert, erhält man hier Objekte wie CSSUnitValue oder CSSKeywordValue.
Das ist nützlich, wenn du Stylesheet-Regeln per Skript anpassen willst, ohne Strings zusammenzubauen und wieder zu zerlegen: rule.styleMap.set('width', CSS.px(320)) statt rule.style.width = '320px'. Mit der typisierten Form kann man direkt rechnen (value.value * 2), die Einheit abfragen (value.unit) und Werte mit CSS.px(), CSS.percent() usw. erzeugen.
Die Map ist live: Änderungen über set(), append(), delete() oder clear() wirken sofort auf die Regel und damit auf alle Elemente, auf die der Selektor zutrifft. Die Eigenschaft selbst kann nicht neu zugewiesen werden – man ändert immer nur den Inhalt der zurückgegebenen Map.
Wichtig: styleMap enthält nur die in der Regel deklarierten Werte, nicht die berechneten Werte eines Elements. Für berechnete Werte gibt es Element.computedStyleMap(), für Inline-Stile HTMLElement.attributeStyleMap.
Rückgabewert
CSSStyleValue-Unterklassen geliefert (z. B. CSSUnitValue, CSSKeywordValue, CSSUnparsedValue).Beispiele
Typisierten Wert aus einer Stylesheet-Regel lesen
// Konstruierbares Stylesheet anlegen und einbinden
const sheet = new CSSStyleSheet();
sheet.replaceSync('.card { width: 200px; opacity: 0.5; }');
document.adoptedStyleSheets = [sheet];
const rule = sheet.cssRules[0]; // CSSStyleRule
const width = rule.styleMap.get('width');
console.log(width.value, width.unit);
console.log(width instanceof CSSUnitValue);
console.log(rule.styleMap.get('opacity').value);
Regel per Skript ändern – wirkt auf alle .card-Elemente
const sheet = new CSSStyleSheet();
sheet.replaceSync('.card { width: 200px; opacity: 0.5; }');
document.adoptedStyleSheets = [sheet];
const rule = sheet.cssRules[0];
const { styleMap } = rule;
// Breite verdoppeln, ohne Strings zu parsen
const current = styleMap.get('width');
styleMap.set('width', CSS.px(current.value * 2));
// Deklaration entfernen
styleMap.delete('opacity');
console.log(rule.cssText);
Alle Deklarationen einer Regel durchlaufen
const sheet = new CSSStyleSheet();
sheet.replaceSync('.btn { padding-top: 8px; color: red; }');
const rule = sheet.cssRules[0];
console.log('Anzahl:', rule.styleMap.size);
for (const [property, values] of rule.styleMap) {
// values ist immer ein Array von CSSStyleValue-Objekten
console.log(property, values.map(String).join(', '));
}
Feature-Erkennung mit Rückfall auf CSSStyleDeclaration
const setRuleWidth = (rule, px) => {
if ('styleMap' in CSSStyleRule.prototype) {
rule.styleMap.set('width', CSS.px(px));
} else {
// Firefox & ältere Browser
rule.style.setProperty('width', `${px}px`);
}
};
const sheet = new CSSStyleSheet();
sheet.replaceSync('.box { width: 100px; }');
setRuleWidth(sheet.cssRules[0], 250);
console.log(sheet.cssRules[0].style.width);
// Wichtig · Fallstricke
- Browser-Unterstützung: Chromium-Browser seit Version 66, Safari seit 16.4. Firefox unterstützt das CSS Typed OM (noch) nicht – vor der Nutzung mit
'styleMap' in CSSStyleRule.prototypeprüfen und aufrule.stylezurückfallen. - Nur deklarierte Werte:
get()liefertundefinedfür Eigenschaften, die in der Regel nicht vorkommen – auch wenn das Element über Vererbung oder andere Regeln einen Wert hat. Für berechnete WerteElement.computedStyleMap()verwenden. - Kurzschreibweisen: Shorthands wie
paddingodermarginwerden oft nicht als typisierter Wert geliefert, sondern als generischerCSSStyleValue. Für sauberes Rechnen die Einzeleigenschaften (padding-top…) abfragen. - Werte mit
var()kommen alsCSSUnparsedValuezurück und haben keinevalue/unit-Eigenschaft. - Cross-Origin-Stylesheets: Bei Stylesheets von fremden Ursprüngen ohne CORS wirft bereits der Zugriff auf
sheet.cssRuleseinenSecurityError. - Ungültige Werte in
set()(z. B.styleMap.set('width', 'rot')) lösen einenTypeErroraus, statt still ignoriert zu werden wie beistyle.width = …. - Nur Regeln vom Typ
CSSStyleRulebesitzenstyleMap;@media- oder@keyframes-Regeln incssRulesvorher perinstanceof CSSStyleRuleherausfiltern.