Start · Sprachen · JavaScript · Referenz · CSSMathSum

CSSMathSum

Schnittstelle

Stellt im CSS Typed OM die Summe von zwei oder mehr <code>CSSNumericValue</code>-Werten dar, wenn das Ergebnis nicht zu einem Einzelwert zusammengefasst werden kann (z. B. <code>calc(100% - 20px)</code>).

seit JavaScript Chromium 66+, Safari 16.4+ (Firefox: nicht unterst Kategorie: webapi

Signatur

interface CSSMathSum extends CSSMathValue

Beschreibung

CSSMathSum ist Teil der CSS Typed Object Model API (Houdini) und steht für einen calc()-Ausdruck, in dem Werte addiert werden. Solche Objekte entstehen, wenn man Werte mit unterschiedlichen, nicht ineinander umrechenbaren Einheiten verknüpft, z. B. % und px oder vw und rem. Der Browser kann diese erst beim Layout auflösen, deshalb bleibt die Summe als strukturierter Ausdruck erhalten.

Ein CSSMathSum entsteht auf drei Wegen: direkt über den Konstruktor new CSSMathSum(...values), über die Methoden add() und sub() von CSSNumericValue oder beim Auslesen eines calc()-Werts über element.attributeStyleMap.get() bzw. computedStyleMap(). Subtraktion wird intern als Summe mit einem CSSMathNegate-Summanden dargestellt, calc(a - b) ist also ein CSSMathSum aus a und -b.

Die Schnittstelle erbt von CSSMathValue und CSSNumericValue. Wichtige Mitglieder sind:

  • values: ein CSSNumericArray mit den einzelnen Summanden (nur lesbar, aber iterierbar)
  • operator: immer "sum"
  • geerbte Methoden wie add(), sub(), mul(), div(), equals(), type() und toString()

Das Interface ist nützlich, wenn man Stilwerte per Skript typsicher berechnen will, ohne Strings wie `calc(${a}% - ${b}px)` zusammenzusetzen und wieder zu zerlegen. Das ist fehleranfällig und langsamer.

Parameter

Name Typ Default Beschreibung
$...values Pflicht CSSNumberish (number | CSSNumericValue) Parameter des Konstruktors new CSSMathSum(...values): ein oder mehrere Summanden. Einfache Zahlen werden in CSSUnitValue mit der Einheit number umgewandelt. Ohne Argument wird ein SyntaxError geworfen, bei nicht addierbaren Typen (z. B. px + s) ein TypeError.

Rückgabewert

Typ
CSSMathSum
Beschreibung
Der Konstruktor liefert ein neues CSSMathSum-Objekt. Seine Eigenschaft values (CSSNumericArray) enthält die Summanden, operator ist "sum".

Beispiele

Summe per Konstruktor erzeugen und untersuchen

const sum = new CSSMathSum(CSS.px(10), CSS.percent(50));

console.log(sum.operator);       // Art der Operation
console.log(sum.values.length);  // Anzahl der Summanden
console.log(sum.toString());     // als CSS-Text

for (const part of sum.values) {
  console.log(part.value, part.unit);
}
sum 2 calc(10px + 50%) 10 "px" 50 "percent"

Entstehung über add() und sub()

// Gleiche Einheiten werden direkt zusammengefasst
const simple = CSS.px(10).add(CSS.px(5));
console.log(simple.constructor.name, simple.toString());

// Unterschiedliche Einheiten ergeben eine CSSMathSum
const width = CSS.vw(100).sub(CSS.px(40));
console.log(width instanceof CSSMathSum);            // true
console.log(width.toString());
console.log(width.values[1] instanceof CSSMathNegate); // Subtraktion = negierter Summand
CSSUnitValue 15px true calc(100vw - 40px) true

calc()-Wert eines Elements typsicher lesen und setzen

const box = document.querySelector('.box');
box.style.width = 'calc(100% - 2rem)';

const current = box.attributeStyleMap.get('width');
console.log(current.constructor.name); // CSSMathSum
console.log(current.toString());

// Seitenabstand dynamisch vergrößern, ohne String-Bastelei
const padding = CSS.rem(1);
box.attributeStyleMap.set('width', current.sub(padding));
console.log(box.style.width);
CSSMathSum calc(100% - 2rem) calc(100% - 2rem - 1rem)

// Wichtig · Fallstricke

  • Browser-Unterstützung: Das CSS Typed OM gibt es in Chromium-basierten Browsern (ab Version 66) und in Safari (ab 16.4). Firefox unterstützt es bisher nicht. Vorher mit if ('CSSMathSum' in window) oder if (window.CSS && CSS.px) prüfen und notfalls auf String-Werte über element.style ausweichen.
  • Ob beim Rechnen ein CSSMathSum entsteht, ist nicht garantiert: Lassen sich die Einheiten zusammenfassen (z. B. px + px), liefern add()/sub() einen einfachen CSSUnitValue. Das Ergebnis also nicht blind als CSSMathSum behandeln, sondern mit instanceof prüfen.
  • Subtraktion erzeugt keinen eigenen Typ „CSSMathDifference“, sondern einen CSSMathNegate-Summanden. Wer values auswertet, muss das berücksichtigen.
  • Einen CSSMathSum mit relativen Einheiten (z. B. %, vw) kann to('px') nicht umrechnen; dann wird ein TypeError geworfen. Der konkrete Pixelwert steht erst nach dem Layout fest, etwa über getBoundingClientRect().
  • Die genaue Form der Serialisierung (toString()) kann sich zwischen Browsern leicht unterscheiden, z. B. bei Vereinfachung und Reihenfolge der Summanden.