Signatur
Beschreibung
Die Eigenschaft styleset einer CSSFontFeatureValuesRule gibt den Inhalt des @styleset-Blocks innerhalb einer @font-feature-values-Regel wieder. Dort ordnet man selbst gewählten Namen (user-defined idents) einen oder mehrere Feature-Indizes zu. Diese Indizes verweisen auf die OpenType-Features ss01 bis ss20 (Stylistic Sets) einer Schrift. Im CSS setzt man die Namen dann über font-variant-alternates: styleset(name) ein.
Zurückgegeben wird ein CSSFontFeatureValuesMap-Objekt, das sich wie eine Map verhält: Schlüssel sind die Namen als Zeichenketten, Werte sind Arrays mit ganzzahligen Indizes. Anders als bei @swash oder @ornaments darf ein Name bei @styleset mehrere Indizes haben, z. B. fancy: 3 5;. So lassen sich mehrere Stylistic Sets gleichzeitig einschalten.
Die Eigenschaft selbst ist schreibgeschützt, man kann ihr also kein neues Objekt zuweisen. Die zurückgegebene Map lässt sich aber mit set(), delete() und clear() ändern. Solche Änderungen wirken sich direkt auf das CSSOM aus. Damit kann man zur Laufzeit neue Stil-Varianten festlegen oder vorhandene auslesen, zum Beispiel für einen Schrift-Konfigurator.
Rückgabewert
Map<string, number[]>). Es unterstützt get(), has(), set(), delete(), clear(), size, forEach() sowie die Iteration mit for…of, entries(), keys() und values().Beispiele
Stylistic Sets aus einem Stylesheet auslesen
const style = document.createElement('style');
style.textContent = `
@font-feature-values "Font One" {
@styleset {
nice-style: 12;
fancy: 3 5;
}
}
`;
document.head.append(style);
const rule = [...style.sheet.cssRules]
.find((r) => r instanceof CSSFontFeatureValuesRule);
console.log(rule.fontFamily);
console.log(rule.styleset.get('nice-style'));
for (const [name, indices] of rule.styleset) {
console.log(`${name} → ss${indices.map((i) => String(i).padStart(2, '0')).join(' + ss')}`);
}
Neues Stylistic Set zur Laufzeit festlegen und anwenden
const sheet = new CSSStyleSheet();
sheet.replaceSync(`
@font-feature-values "Inter" { @styleset { alt-digits: 1; } }
.headline { font-family: "Inter"; }
`);
document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];
const rule = [...sheet.cssRules]
.find((r) => r instanceof CSSFontFeatureValuesRule);
// Mehrere Indizes: ss02 und ss04 zusammen aktivieren
rule.styleset.set('rounded', [2, 4]);
document.querySelector('.headline').style.fontVariantAlternates = 'styleset(rounded)';
console.log(rule.styleset.get('rounded'), rule.styleset.size);
Einträge prüfen, entfernen und Unterstützung ermitteln
const getStylesetMap = (sheet) => {
if (typeof CSSFontFeatureValuesRule === 'undefined') return null;
const rule = [...sheet.cssRules]
.find((r) => r instanceof CSSFontFeatureValuesRule);
return rule && 'styleset' in rule ? rule.styleset : null;
};
const map = getStylesetMap(document.styleSheets[0]);
if (map) {
if (map.has('fancy')) map.delete('fancy');
console.log([...map.keys()]);
} else {
console.log('styleset wird nicht unterstützt');
}
// Wichtig · Fallstricke
- Browser-Unterstützung: Die Eigenschaft gibt es in Chromium-Browsern ab Version 111 und in Safari ab 17.4. Firefox kennt
CSSFontFeatureValuesRuleschon länger, stellt die Map-Eigenschaften wiestylesetaber nicht oder nur teilweise bereit. Prüfen Sie deshalb vor dem Zugriff, ob die Eigenschaft vorhanden ist, etwa mit'styleset' in rule. - Nur lesend – aber änderbar:
rule.styleset = …hat keine Wirkung (im Strict Mode gibt es einenTypeError). Ändern Sie die Einträge stattdessen über die Methoden der Map. - Werte sind immer Arrays: Auch bei nur einem Index liefert
get()ein Array, etwa[12]. Beim Setzen sind eine einzelne Zahl und ein Array beide erlaubt. - Gültiger Bereich: Es gibt nur die Stylistic Sets
ss01bisss20, also die Indizes 1–20. Höhere Werte werden ignoriert, und hat die Schrift das Feature nicht, ändert sich die Darstellung nicht. - Keine variablen Achsen: Anders als manchmal angegeben betrifft
stylesetnicht die Achsen variabler Schriften (dafür gibt esfont-variation-settings), sondern OpenType-Stylistic-Sets. - Stylesheets von anderen Domains ohne CORS-Freigabe lösen beim Zugriff auf
cssRuleseinenSecurityErroraus.