Signatur
Beschreibung
forEach() läuft über alle Einträge eines CSSNumericArray und ruft für jeden Eintrag die übergebene Funktion auf. Die Reihenfolge entspricht dabei der Indexreihenfolge. Die Methode arbeitet genauso wie Array.prototype.forEach(), nur eben auf dieser speziellen, schreibgeschützten Liste des CSS Typed Object Model.
Einen CSSNumericArray legt man nie selbst an. Man bekommt ihn über die Eigenschaft values von mathematischen CSS-Werten wie CSSMathSum (calc(a + b)), CSSMathProduct (calc(a * b)), CSSMathMin (min()) und CSSMathMax (max()). Jeder Eintrag ist ein CSSNumericValue, also z. B. ein CSSUnitValue oder ein weiterer, verschachtelter Rechenausdruck.
Praktisch ist forEach(), wenn man calc()-Ausdrücke analysieren, Einheiten prüfen, Werte protokollieren oder in eigene Datenstrukturen umwandeln will. Wer ein neues Array als Ergebnis braucht, wandelt die Liste besser zuerst mit Array.from() oder dem Spread-Operator um und nutzt dann map() oder filter(). Diese Methoden gibt es auf CSSNumericArray nicht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $callbackFn Pflicht | (value: CSSNumericValue, index: number, array: CSSNumericArray) => void | Wird für jeden Eintrag aufgerufen. Sie bekommt drei Argumente: den aktuellen Wert value, dessen Position index und den durchlaufenen CSSNumericArray selbst. |
|
| $thisArg | any | undefined | Wert, der beim Aufruf von callbackFn als this gilt. Bei Pfeilfunktionen hat er keine Wirkung. |
Rückgabewert
forEach() gibt immer undefined zurück und lässt sich daher nicht verketten.Beispiele
Operanden einer calc()-Summe auflisten
// CSS.px(10).add(CSS.percent(50)) erzeugt einen CSSMathSum: calc(10px + 50%)
const summe = CSS.px(10).add(CSS.percent(50));
summe.values.forEach((wert, index) => {
console.log(index, wert.value, wert.unit);
});
Geparsten calc()-Ausdruck analysieren
const style = CSSStyleValue.parse('width', 'calc(100% - 2em + 4px)');
if (style instanceof CSSMathSum) {
style.values.forEach((teil) => {
// Eine Subtraktion wird intern als CSSMathNegate dargestellt
const art = teil.constructor.name;
console.log(`${art}: ${teil.toString()}`);
});
}
Verwendete Einheiten in min() sammeln (mit thisArg)
const breite = new CSSMathMin(CSS.px(300), CSS.vw(50), CSS.rem(40));
const sammler = { einheiten: new Set() };
breite.values.forEach(function (wert) {
if (wert instanceof CSSUnitValue) {
this.einheiten.add(wert.unit);
}
}, sammler);
console.log([...sammler.einheiten]);
// Wichtig · Fallstricke
- Browser-Unterstützung: Das CSS Typed OM gibt es in Chromium-Browsern (Chrome, Edge, Opera) ab Version 66 und in Safari ab 16.4. Firefox unterstützt es bisher nicht. Prüfe die Unterstützung vorher, z. B. mit
if (window.CSS && CSS.px)oder'CSSMathSum' in window. - Die Liste ist schreibgeschützt. Wenn du innerhalb des Callbacks etwas zuweist, ändert sich der ursprüngliche Ausdruck nicht. Ändern kannst du ihn nur, indem du einen neuen
CSSMathSumusw. baust und ihn z. B. mitattributeStyleMap.set()setzt. - Einträge sind nicht immer
CSSUnitValue. Sie können auch verschachtelte Ausdrücke wieCSSMathNegate,CSSMathInvertoderCSSMathProductsein. Diese haben keine Eigenschaftenvalueoderunit. Prüfe den Typ daher mitinstanceof. - Mit
breakkannst duforEach()nicht abbrechen, und es wartet auch nicht aufasync-Callbacks. Nutze dafürfor...of:CSSNumericArrayist iterierbar. computedStyleMap()liefert oft schon aufgelöste Einzelwerte (z. B.CSSUnitValueinpx) statt einescalc()-Ausdrucks. Dann gibt es gar keinenvalues-Array.