Start · Sprachen · JavaScript · Referenz · CSSNumericValue

CSSNumericValue

Schnittstelle

Abstrakte Basisschnittstelle der CSS Typed OM für numerische CSS-Werte. Bietet Rechenoperationen, Einheitenumrechnung und Vergleiche wie <code>add()</code>, <code>to()</code> und <code>equals()</code>.

seit JavaScript Chromium 66+, Safari 16.4+; nicht in Firefox Kategorie: webapi

Signatur

interface CSSNumericValue extends CSSStyleValue

Beschreibung

CSSNumericValue ist die gemeinsame Basis aller numerischen Werte der CSS Typed Object Model API (Houdini). Mit ihr rechnet man mit CSS-Werten als echten Objekten und nicht mit Zeichenketten wie "10px". Konkrete Unterklassen sind CSSUnitValue (ein Wert mit einer Einheit, z. B. 10px) und CSSMathValue mit den Varianten CSSMathSum, CSSMathProduct, CSSMathNegate, CSSMathInvert, CSSMathMin, CSSMathMax und CSSMathClamp. Sie stehen für calc()-, min()-, max()- und clamp()-Ausdrücke.

Die Schnittstelle stellt folgende Methoden bereit:

  • add(...values), sub(...values), mul(...values), div(...values): Grundrechenarten. Als Argumente sind CSSNumericValue-Objekte oder einfache Zahlen erlaubt.
  • min(...values), max(...values): geben das Minimum bzw. Maximum zurück, bei gemischten Einheiten als CSSMathMin/CSSMathMax.
  • equals(...values): prüft, ob die Werte strukturell gleich sind.
  • to(unit): rechnet in eine andere, kompatible Einheit um (z. B. in → px).
  • toSum(...units): zerlegt den Wert in eine CSSMathSum aus den angegebenen Einheiten.
  • type(): liefert ein CSSNumericType-Objekt, das den Typ beschreibt (z. B. { length: 1 }).
  • statisch CSSNumericValue.parse(cssText): wandelt eine CSS-Zeichenkette in ein CSSNumericValue um.

Sinnvoll ist das vor allem zusammen mit element.attributeStyleMap und element.computedStyleMap(). Werte lassen sich damit typsicher lesen, verrechnen und zurückschreiben, ohne Zeichenketten zu zerlegen oder zusammenzubauen. Bei gleichen Einheiten wird direkt gerechnet, das Ergebnis ist ein CSSUnitValue. Bei unterschiedlichen, aber kompatiblen Einheiten (z. B. px und %) entsteht ein CSSMathValue, den der Browser später wie calc() auswertet.

Parameter

Name Typ Default Beschreibung
$cssText Pflicht string Nur für die statische Methode CSSNumericValue.parse(): ein numerischer CSS-Wert als Zeichenkette, z. B. "10px" oder "calc(50% - 2em)".

Rückgabewert

Typ
CSSNumericValue
Beschreibung
Die Rechenmethoden (add, sub, mul, div, min, max, to) und parse() geben ein neues CSSNumericValue zurück, also einen CSSUnitValue oder einen CSSMathValue. Das Ausgangsobjekt bleibt unverändert. equals() liefert boolean, type() ein CSSNumericType-Objekt und toSum() eine CSSMathSum.

Beispiele

Werte erzeugen und mit gleichen Einheiten rechnen

// CSSNumericValue ist abstrakt: Instanzen entstehen über CSS.px() & Co. oder parse()
const a = CSSNumericValue.parse('10px');
const b = CSS.px(5);

const summe = a.add(b);
console.log(summe instanceof CSSUnitValue, summe.value, summe.unit);
console.log(a.mul(3).toString());
console.log(CSS.px(10).equals(CSS.px(10)));
console.log(CSS.px(10).type());
true 15 "px" 30px true { length: 1 }

Gemischte Einheiten ergeben calc()-Ausdrücke

const breite = CSS.percent(100).sub(CSS.px(40));
console.log(breite.constructor.name, breite.toString());

const kleinste = CSS.px(300).min(CSS.vw(50));
console.log(kleinste.toString());

// Einheitenumrechnung zwischen kompatiblen absoluten Einheiten
console.log(CSS.in(1).to('px').toString());
console.log(CSS.s(1.5).to('ms').toString());
CSSMathSum calc(100% - 40px) min(300px, 50vw) 96px 1500ms

Praxis: Element-Breite typsicher verdoppeln

const box = document.querySelector('.box');
box.attributeStyleMap.set('width', CSS.px(120));

// Wert lesen, verrechnen und zurückschreiben, ganz ohne String-Parsing
const aktuell = box.attributeStyleMap.get('width');
const neu = aktuell.mul(2).add(CSS.rem(1));
box.attributeStyleMap.set('width', neu);

console.log(box.style.width);
calc(240px + 1rem)

Fehlerbehandlung bei inkompatiblen Typen

try {
  // Länge + Zeit ist nicht definiert
  CSS.px(10).add(CSS.s(1));
} catch (err) {
  console.log(err.name);
}

try {
  CSSNumericValue.parse('rot');
} catch (err) {
  console.log(err.name);
}
TypeError SyntaxError