Signatur
Beschreibung
CSSFontFeatureValuesMap ist ein Interface des CSS Object Model (CSSOM). Es stellt den Inhalt eines einzelnen Feature-Blocks innerhalb einer @font-feature-values-Regel dar, also z. B. @swash, @annotation, @ornaments, @stylistic, @styleset oder @character-variant. Jeder Eintrag ordnet einem selbst gewählten Namen (z. B. fancy) eine Liste von Ganzzahlen zu, die den OpenType-Feature-Index der Schrift angeben.
Instanzen erzeugt man nicht selbst. Man erhält sie über die Eigenschaften eines CSSFontFeatureValuesRule-Objekts: rule.swash, rule.annotation, rule.ornaments, rule.stylistic, rule.styleset und rule.characterVariant. Jede dieser Eigenschaften liefert eine eigene CSSFontFeatureValuesMap.
Das Interface verhält sich wie eine Map<string, number[]> und bietet die üblichen Map-Methoden an:
size: Anzahl der Einträgeget(name),has(name): einzelne Werte abfragenkeys(),values(),entries(),forEach(),[Symbol.iterator](): Einträge durchlaufenset(name, values),delete(name),clear(): Einträge ändern, sofern der Browser das zulässt
Einsatzbereiche sind Werkzeuge, die Stylesheets auslesen (Typografie-Inspektoren, Designsystem-Dokumentation), und dynamische Anpassungen. Damit lässt sich etwa zur Laufzeit festlegen, welcher Swash-Index für font-variant-alternates: swash(fancy) gilt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $featureValueName Pflicht | string | Für get(), has(), set() und delete(): der in CSS vergebene Name des Feature-Werts, z. B. fancy. Groß- und Kleinschreibung wird unterschieden. |
|
| $values | number | number[] | Nur bei set(): der neue Feature-Index als nicht-negative Ganzzahl oder als Liste von Ganzzahlen, etwa bei @character-variant mit zwei Werten. |
|
| $callback | (value: number[], key: string, map: CSSFontFeatureValuesMap) => void | Nur bei forEach(): wird für jeden Eintrag aufgerufen. |
Rückgabewert
CSSFontFeatureValuesRule abgerufen. get() liefert ein number[] oder undefined, has() liefert ein boolean, die Iteratoren liefern Paare der Form [string, number[]].Beispiele
Swash-Werte einer @font-feature-values-Regel auslesen
// CSS im Dokument:
// @font-feature-values "Font One" { @swash { fancy: 12; plain: 1; } }
const style = document.createElement('style');
style.textContent = `@font-feature-values "Font One" { @swash { fancy: 12; plain: 1; } }`;
document.head.append(style);
const rule = [...style.sheet.cssRules]
.find((r) => r instanceof CSSFontFeatureValuesRule);
const swashMap = rule.swash; // CSSFontFeatureValuesMap
console.log(swashMap.size);
for (const [name, values] of swashMap) {
console.log(name, values);
}
Einzelnen Wert prüfen und abfragen
const rule = [...document.styleSheets]
.flatMap((sheet) => [...sheet.cssRules])
.find((r) => r instanceof CSSFontFeatureValuesRule);
if (rule?.swash.has('fancy')) {
const [index] = rule.swash.get('fancy');
console.log(`Swash "fancy" nutzt Index ${index}`);
} else {
console.log('Kein Swash "fancy" definiert');
}
Feature-Index zur Laufzeit ändern
const style = document.createElement('style');
style.textContent = `
@font-feature-values "Font One" { @styleset { alt-a: 1; } }
h1 { font-family: "Font One"; font-variant-alternates: styleset(alt-a); }
`;
document.head.append(style);
const rule = [...style.sheet.cssRules]
.find((r) => r instanceof CSSFontFeatureValuesRule);
// Styleset 1 durch Styleset 3 ersetzen, h1 wird neu gerendert
if (typeof rule.styleset.set === 'function') {
rule.styleset.set('alt-a', 3);
}
console.log(rule.styleset.get('alt-a'));
console.log(rule.cssText.includes('alt-a: 3'));
// Wichtig · Fallstricke
- Browser-Kompatibilität:
@font-feature-valuesund die CSSOM-Schnittstellen dazu gibt es in Chromium erst ab Version 111. Firefox unterstützt die Regel schon länger. Ob Safari und ältere Browser einzelne Methoden wieset()anbieten, ist unterschiedlich. Vorher prüfen, z. B. mit'CSSFontFeatureValuesRule' in window. - Werte werden immer als Array zurückgegeben, auch wenn in CSS nur eine Zahl steht (
fancy: 12ergibt[12]). - Wie viele Werte gültig sind, hängt vom Block ab.
@swash,@annotationund@stylisticerlauben genau einen Wert,@character-varianteinen oder zwei,@stylesetmehrere. Ungültige Angaben werden ignoriert oder lösen einen Fehler aus. - Die Namen gelten nur für die Schriftfamilien, die in der Regel angegeben sind. Ein Name wie
swash(fancy)wirkt nur, wenn die Schrift das Feature tatsächlich enthält. - Stylesheets von fremden Ursprüngen ohne CORS-Freigabe können nicht gelesen werden. Der Zugriff auf
cssRuleslöst dann einenSecurityErroraus.