Signatur
Beschreibung
CSSMathNegate gehört zur CSS Typed Object Model API (Typed OM). Die Schnittstelle stellt die Operation „Vorzeichen umkehren“ innerhalb eines calc()-Ausdrucks als Objekt dar. Sie erbt von CSSMathValue und damit von CSSNumericValue. Deshalb stehen auch Methoden wie add(), mul(), to() oder equals() zur Verfügung.
Solche Objekte entstehen meist automatisch, zum Beispiel wenn Sie mit CSSNumericValue.prototype.sub() subtrahieren: Intern ist a - b eine Summe aus a und der Negation von b, also CSSMathSum(a, CSSMathNegate(b)). Beim Auslesen berechneter Stile über computedStyleMap() bzw. attributeStyleMap können Sie deshalb auf CSSMathNegate-Knoten stoßen, wenn Sie den Ausdrucksbaum durchlaufen.
Sie können auch selbst eine Instanz mit new CSSMathNegate(wert) erzeugen und sie direkt einer CSS-Eigenschaft zuweisen. Die wichtigsten Eigenschaften sind:
value(nur lesbar): der negierteCSSNumericValue, also der Operand.operator(geerbt, nur lesbar): hat immer den Wert"negate".
Wenn Sie eine CSSMathNegate-Instanz in einen String umwandeln, entsteht gültige CSS-Syntax, zum Beispiel calc(-5px).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $arg Pflicht | CSSNumericValue | number | Konstruktor-Argument von new CSSMathNegate(arg): der Wert, dessen Vorzeichen umgekehrt wird. Eine einfache Zahl wird wie CSS.number(n) behandelt. |
Rückgabewert
CSSMathNegate-Objekt zurück. Dessen Eigenschaft value enthält den Operanden, operator ist immer "negate".Beispiele
Instanz erzeugen und Eigenschaften lesen
const neg = new CSSMathNegate(CSS.px(5));
console.log(neg.operator); // Operator des Ausdrucks
console.log(neg.value.toString()); // Operand
console.log(neg.toString()); // CSS-Serialisierung
Negativen Außenabstand per Typed OM setzen
const box = document.querySelector('.box');
// -(10px + 2em) als Ausdrucksbaum
const offset = new CSSMathNegate(
new CSSMathSum(CSS.px(10), CSS.em(2))
);
box.attributeStyleMap.set('margin-left', offset);
console.log(box.style.marginLeft);
sub() erzeugt intern eine CSSMathNegate
const diff = CSS.percent(100).sub(CSS.px(20));
console.log(diff.constructor.name); // CSSMathSum
const [first, second] = diff.values;
console.log(first.toString()); // 100%
console.log(second instanceof CSSMathNegate); // true
console.log(second.value.toString()); // 20px
console.log(diff.toString());
Ausdrucksbaum rekursiv auswerten
// Wandelt einen reinen px-Ausdrucksbaum in eine Zahl um
const evalPx = (v) => {
if (v instanceof CSSUnitValue) return v.to('px').value;
if (v instanceof CSSMathNegate) return -evalPx(v.value);
if (v instanceof CSSMathSum) {
return [...v.values].reduce((s, x) => s + evalPx(x), 0);
}
throw new TypeError(`Nicht unterstützt: ${v.operator}`);
};
const expr = CSS.px(50).sub(CSS.px(8)).sub(CSS.px(2));
console.log(evalPx(expr));
// Wichtig · Fallstricke
- Browser-Unterstützung: Das CSS Typed OM gibt es in Chromium-Browsern ab Version 66 und in Safari ab 16.4. Firefox unterstützt es nicht. Prüfen Sie die Unterstützung deshalb vorher, z. B. mit
if ('CSSMathNegate' in window), und sehen Sie einen Rückfall auf String-Werte überelement.stylevor. CSSNumericValue.prototype.negate()gibt nicht immer eineCSSMathNegatezurück: Bei einemCSSUnitValueentsteht direkt ein neuer Einheitswert, z. B. wirdCSS.px(5).negate()zu-5px. Wenden Sienegate()auf eineCSSMathNegatean, erhalten Sie derenvaluezurück, also keine doppelte Negation.- Die Eigenschaft
valueist nur lesbar. Um den Operanden zu ändern, erzeugen Sie eine neue Instanz. - Der Ausdruck wird nicht vereinfacht, solange Sie nicht
to()odertoSum()aufrufen. Die Serialisierung kann deshalb verschachtelte Klammern enthalten, etwacalc(-(10px + 2em)). - Die Typen müssen verträglich sein: Weisen Sie einen negierten Ausdruck einer Eigenschaft mit unpassendem Typ zu, wirft
attributeStyleMap.set()einenTypeError.