Signatur
Beschreibung
Die Methode mul() gehört zur CSS Typed Object Model API (Houdini) und multipliziert den aktuellen numerischen CSS-Wert mit allen übergebenen Werten. Das Original bleibt unverändert; das Ergebnis ist immer ein neues Objekt. So lassen sich CSS-Werte typsicher berechnen, ohne Strings wie "calc(10px * 2)" zusammenzubauen und wieder zu parsen.
Der Typ des Ergebnisses hängt von den Operanden ab:
- Sind alle Beteiligten
CSSUnitValues und hat höchstens einer davon eine echte Einheit (die übrigen sind reine Zahlen), wird das Ergebnis direkt ausgerechnet und alsCSSUnitValuezurückgegeben – z. B.CSS.px(10).mul(2)ergibt20px. - In allen anderen Fällen (z. B. zwei Längen oder ein
CSSMathSumals Operand) entsteht einCSSMathProduct, das alscalc(...)-Ausdruck serialisiert wird.
Typische Einsatzfälle sind das Skalieren von Werten aus element.computedStyleMap() oder element.attributeStyleMap, etwa um eine Schriftgröße zu verdoppeln oder eine Breite prozentual anzupassen, sowie Berechnungen in CSS Paint Worklets.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $...values Pflicht | number | CSSNumericValue | Ein oder mehrere Faktoren. Reine Zahlen werden intern in CSS.number(n) umgewandelt. Numerische CSS-Werte wie CSS.px(5) oder CSS.percent(50) sind ebenfalls erlaubt. |
Rückgabewert
CSSUnitValue, wenn sich das Produkt direkt ausrechnen lässt, sonst ein CSSMathProduct. Der Ausgangswert wird nicht verändert.Beispiele
Einfache Multiplikation mit Zahlen
const breite = CSS.px(10);
const doppelt = breite.mul(2);
console.log(doppelt.toString());
// Mehrere Faktoren werden nacheinander multipliziert
console.log(CSS.em(1.5).mul(2, 3).toString());
console.log(CSS.percent(50).mul(0.5).toString());
// Das Original bleibt unverändert
console.log(breite.toString());
Ergebnis als calc()-Ausdruck (CSSMathProduct)
const mix = CSS.px(10).add(CSS.vw(5)); // CSSMathSum
const produkt = mix.mul(2);
console.log(produkt instanceof CSSMathProduct);
console.log(produkt.toString());
Schriftgröße eines Elements verdoppeln
const titel = document.querySelector('h1');
// Berechneten Wert typisiert auslesen (z. B. CSSUnitValue 32px)
const schrift = titel.computedStyleMap().get('font-size');
// Verdoppeln und als Inline-Style zurückschreiben
titel.attributeStyleMap.set('font-size', schrift.mul(2));
console.log(titel.attributeStyleMap.get('font-size').toString());
Feature-Erkennung vor der Nutzung
const skaliere = (el, faktor) => {
if (!('attributeStyleMap' in Element.prototype) || !window.CSS?.px) {
// Fallback über klassische Strings
el.style.width = `calc(${getComputedStyle(el).width} * ${faktor})`;
return;
}
const aktuell = el.computedStyleMap().get('width');
el.attributeStyleMap.set('width', aktuell.mul(faktor));
};
skaliere(document.querySelector('.box'), 1.5);
// Wichtig · Fallstricke
- Browser-Kompatibilität: CSS Typed OM gibt es in Chromium-Browsern (ab Chrome/Edge 66) und in Safari ab 16.4. Firefox unterstützt die API nicht. Vor der Nutzung also eine Feature-Erkennung einbauen, z. B.
'CSSNumericValue' in window. - Einheiten multiplizieren sich mit:
CSS.px(10).mul(CSS.px(2))ergibt kein20px, sondern einCSSMathProductmit dem Typ „Länge²“ (calc(10px * 2px)). Weist man so einen Wert einer Eigenschaft wiewidthzu, wird einTypeErrorgeworfen, weil der Typ nicht passt. - Keine Strings: Übergeben werden können nur Zahlen oder
CSSNumericValue-Objekte. Ein String wie"2px"löst einenTypeErroraus; ihn vorher mitCSSNumericValue.parse()umwandeln. - Werte aus
computedStyleMap()sind nicht immerCSSUnitValues, bei Schlüsselwörtern wieautokommt z. B. einCSSKeywordValueohnemul()zurück. Den Typ prüfen, bevor du rechnest. - Ein Produkt wird nicht automatisch vereinfacht, wenn relative Einheiten beteiligt sind (
vw,%,emmit anderen Einheiten gemischt). Das Endergebnis berechnet erst der Browser beim Layout.