Signatur
Beschreibung
Die schreibgeschützte Eigenschaft attributeStyleMap gehört zur CSS Typed Object Model API (CSS Typed OM). Sie liefert ein StylePropertyMap-Objekt, das die im Inline-style-Attribut eines SVG-Elements deklarierten Eigenschaften abbildet. Anders als bei element.style bekommst du die Werte nicht als Zeichenketten zurück, sondern als typisierte Objekte wie CSSUnitValue, CSSKeywordValue oder CSSTransformValue.
Die Map ist aktiv (live): Änderungen über set(), append(), delete() oder clear() wirken sich sofort auf das style-Attribut aus, und umgekehrt spiegeln sich Änderungen am Attribut direkt in der Map wider. Die Eigenschaft selbst kann nicht neu zugewiesen werden, der Inhalt der Map aber schon.
Praktisch ist attributeStyleMap vor allem bei Animationen und dynamischen Grafiken: Du rechnest mit Zahlen und Einheiten, statt Zeichenketten wie "12.5px" zu parsen und wieder zusammenzusetzen. Das ist weniger fehleranfällig und kann in Browsern mit Typed OM auch schneller sein. Beachte, dass nur Inline-Stile erfasst werden. Die tatsächlich berechneten Werte (inklusive Stylesheets) liefert computedStyleMap().
Rückgabewert
get(), getAll(), has(), set(), append(), delete(), clear() sowie der Eigenschaft size. Die Map ist iterierbar.Beispiele
Inline-Stile eines SVG-Kreises typisiert auslesen
// <svg><circle id="punkt" cx="50" cy="50" r="20" style="fill: tomato; stroke-width: 4px; opacity: 0.8" /></svg>
const kreis = document.querySelector('#punkt');
const stile = kreis.attributeStyleMap;
const breite = stile.get('stroke-width');
console.log(breite.value, breite.unit);
console.log(stile.get('opacity').value);
console.log(stile.size);
for (const [name, [wert]] of stile) {
console.log(name, '→', wert.toString());
}
Stile mit CSS-Einheiten setzen und entfernen
const rechteck = document.querySelector('svg rect');
// Typisierte Werte über die CSS-Fabrikfunktionen
rechteck.attributeStyleMap.set('stroke-width', CSS.px(3));
rechteck.attributeStyleMap.set('opacity', CSS.number(0.5));
rechteck.attributeStyleMap.set('fill', 'steelblue'); // Zeichenketten gehen auch
console.log(rechteck.getAttribute('style'));
rechteck.attributeStyleMap.delete('opacity');
console.log(rechteck.attributeStyleMap.has('opacity'));
Pulsierende Linienstärke ohne String-Parsing animieren
const pfad = document.querySelector('svg path');
pfad.attributeStyleMap.set('stroke-width', CSS.px(2));
let wachsend = true;
const schritt = () => {
const aktuell = pfad.attributeStyleMap.get('stroke-width');
let neu = aktuell.value + (wachsend ? 0.2 : -0.2);
if (neu >= 8) wachsend = false;
if (neu <= 2) wachsend = true;
pfad.attributeStyleMap.set('stroke-width', CSS.px(neu));
requestAnimationFrame(schritt);
};
// Feature-Erkennung vor der Nutzung
if ('attributeStyleMap' in SVGElement.prototype) {
requestAnimationFrame(schritt);
} else {
pfad.style.strokeWidth = '4px'; // Fallback
}
// Wichtig · Fallstricke
- Browser-Unterstützung: Chromium-Browser (Chrome, Edge, Opera) unterstützen CSS Typed OM seit Version 66, Safari seit 16.4. Firefox unterstützt die API standardmäßig nicht. Prüfe deshalb vorher mit
'attributeStyleMap' in SVGElement.prototypeund sieh einen Fallback überelement.stylevor. - Nur Inline-Stile: Werte aus Stylesheets oder aus SVG-Präsentationsattributen wie
fill="red"erscheinen nicht in der Map. Diese Werte bekommst du überelement.computedStyleMap(). get()liefertundefined, wenn die Eigenschaft nicht inline gesetzt ist. Vor dem Zugriff auf.valuesolltest du das prüfen.- Ungültige Werte führen bei
set()zu einemTypeError, statt stillschweigend ignoriert zu werden wie beielement.style. - Werte, die der Browser nicht genauer typisieren kann, etwa manche Farben, kommen als
CSSStyleValueoderCSSUnparsedValuezurück. In diesem Fall hilfttoString(). - Die Eigenschaft selbst ist schreibgeschützt.
el.attributeStyleMap = …hat keine Wirkung, im Strict Mode wirft die Zuweisung einen Fehler.