Start · Sprachen · JavaScript · Referenz · CSSUnitValue

CSSUnitValue

Schnittstelle

Stellt in der CSS Typed OM einen numerischen CSS-Wert mit genau einer Einheit dar, z. B. <code>42px</code>, <code>50%</code> oder <code>1.5</code> (einheitslos).

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

Signatur

interface CSSUnitValue extends CSSNumericValue

Beschreibung

CSSUnitValue gehört zur CSS Typed Object Model API (Houdini) und steht für einen einfachen numerischen Wert mit einer Einheit, etwa 10px, 2em, 45deg, 300ms oder 50%. Einheitslose Zahlen wie bei opacity: 0.5 haben die Einheit "number". Das Interface erbt von CSSNumericValue und damit von CSSStyleValue.

Ein großer Vorteil gegenüber String-basiertem CSS: Mit value und unit bekommt man Zahl und Einheit getrennt. Man muss also nicht mehr mit parseFloat() und String-Verkettung wie el.style.width = w + 'px' arbeiten. Solche Werte bekommt man über element.attributeStyleMap, element.computedStyleMap(), über new CSSUnitValue(value, unit) oder über die Fabrikfunktionen im CSS-Namensraum, z. B. CSS.px(10), CSS.percent(50) oder CSS.number(1).

Von CSSNumericValue übernommen werden Rechenmethoden wie add(), sub(), mul(), div(), min(), max(), equals() sowie die Umrechnung mit to(unit). Bei gemischten Einheiten, z. B. px + %, ist das Ergebnis kein CSSUnitValue, sondern ein CSSMathSum, also ein calc()-Ausdruck.

Eigenschaften:

  • value (number, lesbar und schreibbar): der Zahlenwert.
  • unit (string, nur lesbar): die Einheit, z. B. "px", "percent", "number".

Parameter

Name Typ Default Beschreibung
$value Pflicht number Zahlenwert des neuen CSSUnitValue (Konstruktor new CSSUnitValue(value, unit)). Muss endlich sein, sonst wird ein TypeError geworfen.
$unit Pflicht string Einheit als String, z. B. "px", "em", "deg", "ms", "percent" (nicht "%"!) oder "number" für einheitslose Werte. Bei einer ungültigen Einheit wird ein TypeError geworfen.

Rückgabewert

Typ
CSSUnitValue
Beschreibung
Ein neues CSSUnitValue-Objekt mit den Eigenschaften value und unit.

Beispiele

Instanziierung per Konstruktor und CSS-Fabrikfunktion

const a = new CSSUnitValue(12, 'px');
const b = CSS.percent(50);
const c = CSS.number(0.5);

console.log(a.value, a.unit); // Zahl und Einheit getrennt
console.log(b.toString());
console.log(c.unit);
12 "px" 50% number

Breite eines Elements ohne String-Parsing vergrößern

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

const width = box.attributeStyleMap.get('width'); // CSSUnitValue
width.value += 50; // value ist beschreibbar
box.attributeStyleMap.set('width', width);

console.log(box.style.width);
250px

Einheiten umrechnen und rechnen

const angle = CSS.deg(180);
console.log(angle.to('rad').value.toFixed(4));

const dauer = CSS.s(1.5).to('ms');
console.log(dauer.toString());

// Gemischte Einheiten ergeben einen calc()-Ausdruck
const summe = CSS.px(10).add(CSS.percent(5));
console.log(summe.constructor.name, summe.toString());
3.1416 1500ms CSSMathSum calc(10px + 5%)

Berechneten Wert auslesen

const el = document.body;
const styles = el.computedStyleMap();
const fontSize = styles.get('font-size');

if (fontSize instanceof CSSUnitValue) {
  console.log(`Schriftgröße: ${fontSize.value} ${fontSize.unit}`);
}
Schriftgröße: 16 px

// Wichtig · Fallstricke

  • Browser-Unterstützung: Chromium-Browser (Chrome, Edge, Opera) ab Version 66 und Safari ab 16.4. Firefox unterstützt die CSS Typed OM bislang nicht. Vorher die Unterstützung prüfen, z. B. mit if ('CSSUnitValue' in window), und sonst auf element.style bzw. getComputedStyle() zurückfallen.
  • Prozent heißt als Einheit \"percent\", nicht \"%\". new CSSUnitValue(50, '%') wirft einen TypeError.
  • Rechenmethoden wie add() oder mul() geben nur dann wieder ein CSSUnitValue zurück, wenn die Einheiten zusammenpassen. Sonst entsteht ein CSSMathValue, das keine value-Eigenschaft hat. Vor dem Zugriff also mit instanceof prüfen.
  • to() rechnet nur zwischen absoluten, kompatiblen Einheiten um (z. B. px↔cm, deg↔rad). Relative Einheiten wie em oder % lassen sich nicht nach px umrechnen. Dabei wird ein TypeError geworfen.
  • Wenn man value ändert, passiert am Element noch nichts. Den Wert muss man danach selbst mit attributeStyleMap.set() zurückschreiben.
  • computedStyleMap() liefert je nach Eigenschaft auch andere Typen, z. B. CSSKeywordValue für auto.