Start · Sprachen · JavaScript · Referenz · CSSNumericValue.toSum()

CSSNumericValue.toSum()

Methode

Wandelt einen numerischen CSS-Wert in eine <code>CSSMathSum</code> aus <code>CSSUnitValue</code>-Summanden um und verwendet dabei möglichst nur die angegebenen Einheiten.

seit JavaScript CSS Typed OM Level 1 – Chromium 66+, Safari 16.4+; Kategorie: webapi

Signatur

CSSNumericValue.prototype.toSum(...units)

Beschreibung

Mit toSum() bringst du einen beliebigen CSSNumericValue in eine vereinfachte, normalisierte Form. Das kann ein einfacher Wert wie CSS.px(10) sein oder ein verschachtelter Ausdruck aus add(), sub() und mul(). Heraus kommt immer eine CSSMathSum, deren Summanden ausschließlich CSSUnitValue-Objekte sind. Werte mit kompatiblen Einheiten, etwa px, in, cm und pt, werden dabei zusammengefasst.

Gibst du Einheiten an, rechnet der Browser jeden Summanden in die passende davon um. Die Reihenfolge der Summanden im Ergebnis folgt der Reihenfolge deiner Argumente. Bleibt ein Summand übrig, der sich in keine der angegebenen Einheiten umrechnen lässt, gibt es einen TypeError. Ohne Argumente werden kompatible Werte in ihrer kanonischen Einheit zusammengefasst, zum Beispiel px für Längen. Die Summanden werden dann nach Einheitennamen sortiert.

Typische Einsatzfälle:

  • Du willst einen calc()-Ausdruck gezielt in bestimmte Einheiten zerlegen, etwa in „absoluter Anteil in px + relativer Anteil in %“.
  • Du willst Werte in CSS Houdini, zum Beispiel in einem Paint Worklet, oder in Animationslogik vereinfachen, bevor du damit rechnest.
  • Du willst prüfen, ob ein Wert überhaupt in einer gewünschten Einheit darstellbar ist, indem du den TypeError abfängst.

Soll ein Wert in genau eine Einheit umgerechnet werden, ist CSSNumericValue.to() meist die direktere Wahl. Diese Methode liefert einen einzelnen CSSUnitValue.

Parameter

Name Typ Default Beschreibung
$...units string Beliebig viele Einheitennamen, z. B. "px", "em", "percent" oder "number". Sie legen fest, in welche Einheiten umgerechnet wird und in welcher Reihenfolge die Summanden erscheinen. Ohne Argumente wird automatisch zusammengefasst.

Rückgabewert

Typ
CSSMathSum
Beschreibung
Eine neue CSSMathSum, deren Eigenschaft values (ein CSSNumericArray) nur CSSUnitValue-Objekte enthält. Das Ausgangsobjekt wird nicht verändert.

Beispiele

calc()-Ausdruck in px- und %-Anteil zerlegen

// 10px + 1in + 5% → absolute Längen werden zu px zusammengefasst
const wert = CSS.px(10).add(CSS.in(1), CSS.percent(5));
console.log(wert.toString());

const summe = wert.toSum('px', 'percent');
console.log(summe.toString());

// Reihenfolge der Argumente bestimmt die Reihenfolge der Summanden
console.log(wert.toSum('percent', 'px').toString());
calc(10px + 1in + 5%) calc(106px + 5%) calc(5% + 106px)

Einzelne Summanden auslesen

const breite = CSS.px(48).add(CSS.pt(36), CSS.vw(10));
const summe = breite.toSum('in', 'vw');

for (const teil of summe.values) {
  console.log(`${teil.value} ${teil.unit}`);
}
1 in 10 vw

Prüfen, ob ein Wert in bestimmte Einheiten passt

const passtIn = (numWert, ...einheiten) => {
  try {
    numWert.toSum(...einheiten);
    return true;
  } catch (err) {
    if (err instanceof TypeError) return false; // nicht umrechenbar
    throw err; // z. B. SyntaxError bei ungültiger Einheit
  }
};

const wert = CSS.px(20).add(CSS.percent(50));
console.log(passtIn(wert, 'px'));
console.log(passtIn(wert, 'px', 'percent'));
false true

Wert aus dem Stylesheet normalisieren

const box = document.querySelector('.box');
box.attributeStyleMap.set('padding-left', CSS.px(8).add(CSS.cm(1), CSS.em(2)));

const padding = box.attributeStyleMap.get('padding-left');
console.log(padding.toSum('px', 'em').toString());
calc(45.79527559055118px + 2em)