Signatur
Beschreibung
Die Eigenschaft operator gehört zur abstrakten Schnittstelle CSSMathValue aus dem CSS Typed Object Model. Alle konkreten Unterklassen, also CSSMathSum, CSSMathProduct, CSSMathNegate, CSSMathInvert, CSSMathMin, CSSMathMax und CSSMathClamp, erben sie. Der Wert ist eine feste Zeichenkette aus dem Aufzählungstyp CSSMathOperator:
"sum"–CSSMathSum(Addition, auch Subtraktion)"product"–CSSMathProduct(Multiplikation, auch Division)"negate"–CSSMathNegate(Vorzeichenwechsel)"invert"–CSSMathInvert(Kehrwert, 1/x)"min"–CSSMathMin(min())"max"–CSSMathMax(max())"clamp"–CSSMathClamp(clamp())
Nützlich ist operator vor allem, wenn du einen Ausdrucksbaum aus calc(), min(), max() oder clamp() auswertest, umschreibst oder analysierst, zum Beispiel für einen eigenen Serialisierer, einen Style-Inspector oder Animationslogik. Du kannst dann mit einem einfachen switch über die Operation verzweigen und brauchst keine instanceof-Kette.
Beachte, dass das Typed OM keine eigenen Operatoren für Subtraktion und Division kennt. a - b wird als "sum" mit einem CSSMathNegate-Summanden abgebildet, a / b als "product" mit einem CSSMathInvert-Faktor.
Rückgabewert
CSSMathOperator, der zur konkreten Unterklasse passt. Die Eigenschaft ist nur lesbar.Beispiele
Operator verschiedener Math-Objekte abfragen
const summe = CSS.px(10).add(CSS.percent(5));
const negiert = new CSSMathNegate(CSS.px(5));
const maximum = new CSSMathMax(CSS.px(200), CSS.vw(30));
const kehrwert = new CSSMathInvert(CSS.number(4));
console.log(summe.operator);
console.log(negiert.operator);
console.log(maximum.operator);
console.log(kehrwert.operator);
console.log(String(summe));
calc()-Ausdruck aus dem Inline-Style analysieren
const box = document.querySelector('.box');
box.attributeStyleMap.set('width', 'calc(100% - 20px)');
const breite = box.attributeStyleMap.get('width');
console.log(breite.constructor.name, breite.operator);
// Subtraktion = Summe mit negiertem Summanden
for (const teil of breite.values) {
console.log(teil.operator ?? `${teil.value}${teil.unit}`);
}
Ausdrucksbaum rekursiv in lesbaren Text umwandeln
const beschreibe = (wert) => {
if (wert instanceof CSSUnitValue) return `${wert.value}${wert.unit}`;
switch (wert.operator) {
case 'sum':
return `(${[...wert.values].map(beschreibe).join(' + ')})`;
case 'product':
return `(${[...wert.values].map(beschreibe).join(' * ')})`;
case 'negate':
return `-${beschreibe(wert.value)}`;
case 'invert':
return `1/${beschreibe(wert.value)}`;
case 'min':
case 'max':
return `${wert.operator}(${[...wert.values].map(beschreibe).join(', ')})`;
case 'clamp':
return `clamp(${[wert.lower, wert.value, wert.upper].map(beschreibe).join(', ')})`;
default:
return String(wert);
}
};
const ausdruck = CSSNumericValue.parse('min(50vw, calc(300px - 2em))');
console.log(beschreibe(ausdruck));
// Wichtig · Fallstricke
- Browser-Kompatibilität: CSS Typed OM wird von Chromium-Browsern (ab Chrome 66) und Safari (ab 16.4) unterstützt, von Firefox bisher nicht. Prüfe die Unterstützung mit
'CSSMathValue' in windowbzw.typeof CSS?.px === 'function'. CSSMathClampund damit der Wert"clamp"ist nicht überall verfügbar. Eindefault-Zweig imswitchist deshalb sinnvoll.- Es gibt keine Operatoren wie
"subtract"oder"divide". Subtraktion erscheint als"sum"plus"negate", Division als"product"plus"invert". - Einfache Rechnungen werden sofort vereinfacht:
CSS.px(10).add(CSS.px(5))ergibt eineCSSUnitValue(15px) und keinCSSMathValue. Dort istoperatordannundefined. - Die Eigenschaft ist nur lesbar. Zuweisungen werden ignoriert und lösen im Strict Mode einen
TypeErroraus. computedStyleMap()liefert oft schon ausgerechnete Werte (etwapx). Math-Objekte bekommst du zuverlässiger überattributeStyleMapoderCSSNumericValue.parse().