Start · Sprachen · JavaScript · Referenz · CSSFunctionRule

CSSFunctionRule

Schnittstelle

Stellt im CSS-Objektmodell eine <code>@function</code>-At-Regel dar, also eine benutzerdefinierte CSS-Funktion mit Name, Parametern und Rückgabetyp.

seit JavaScript Chrome/Edge 139+ (experimentell, noch nicht Baseli Kategorie: webapi

Signatur

interface CSSFunctionRule extends CSSGroupingRule

Beschreibung

Die Schnittstelle CSSFunctionRule gehört zum CSS-Objektmodell (CSSOM) und steht für eine @function-At-Regel. Damit lassen sich in CSS eigene Funktionen wie --opacity(--color, --alpha) definieren, die Parameter entgegennehmen und über den Deskriptor result einen Wert zurückgeben. Sobald ein Stylesheet mit einer solchen Regel geladen ist, taucht sie in CSSStyleSheet.cssRules als CSSFunctionRule-Objekt auf.

Die Schnittstelle erbt von CSSGroupingRule (und damit von CSSRule). Sie hat folgende eigene Mitglieder:

  • name (nur lesbar, string): der Name der Funktion inklusive der beiden Bindestriche, z. B. "--opacity".
  • returnType (nur lesbar, string): der deklarierte Rückgabetyp, z. B. "<color>"; ohne returns-Angabe "*".
  • getParameters(): liefert ein Array von Objekten mit den Feldern name, type und defaultValue (string oder null) – eines pro deklariertem Parameter.

Über das geerbte cssRules kommt man an den Rumpf der Funktion. Dort liegen CSSFunctionDeclarations-Objekte, deren style-Eigenschaft (ein CSSFunctionDescriptors-Objekt) den result-Wert enthält, außerdem verschachtelte bedingte Regeln wie @media oder @supports.

Brauchen wirst du die Schnittstelle vor allem für Werkzeuge, die Stylesheets untersuchen: Debugging-Tools, Linter, Design-System-Dokumentation oder Code, der zur Laufzeit prüft, welche benutzerdefinierten Funktionen es gibt und welche Signatur sie haben.

Rückgabewert

Typ
CSSFunctionRule
Beschreibung
Instanzen legt der Browser beim Parsen eines Stylesheets an. Einen öffentlichen Konstruktor gibt es nicht.

Beispiele

Alle @function-Regeln eines Dokuments auflisten

// Voraussetzung im CSS:
// @function --opacity(--color <color>, --alpha <number>: 0.5) returns <color> {
//   result: rgb(from var(--color) r g b / var(--alpha));
// }

const listCustomFunctions = () => {
  if (typeof CSSFunctionRule === 'undefined') {
    console.warn('@function wird von diesem Browser nicht unterstützt.');
    return [];
  }
  const result = [];
  for (const sheet of document.styleSheets) {
    let rules;
    try {
      rules = sheet.cssRules; // kann bei fremden Stylesheets (CORS) fehlschlagen
    } catch {
      continue;
    }
    for (const rule of rules) {
      if (rule instanceof CSSFunctionRule) {
        result.push(`${rule.name} → ${rule.returnType}`);
      }
    }
  }
  return result;
};

console.log(listCustomFunctions());
["--opacity → <color>"]

Parameter einer Funktion mit getParameters() auslesen

const sheet = new CSSStyleSheet();
sheet.replaceSync(`
  @function --spacing(--factor <number>: 1, --base) returns <length> {
    result: calc(var(--factor) * 8px);
  }
`);

const rule = sheet.cssRules[0];
if (rule instanceof CSSFunctionRule) {
  console.log(rule.name);
  console.log(rule.returnType);
  for (const { name, type, defaultValue } of rule.getParameters()) {
    console.log(`${name}: ${type} (Standard: ${defaultValue ?? 'keiner'})`);
  }
}
--spacing <length> --factor: <number> (Standard: 1) --base: * (Standard: keiner)

result-Deskriptor im Funktionsrumpf lesen

const sheet = new CSSStyleSheet();
sheet.replaceSync(`
  @function --double(--x) {
    result: calc(var(--x) * 2);
  }
`);

const fnRule = sheet.cssRules[0];
for (const inner of fnRule.cssRules) {
  // CSSFunctionDeclarations enthält die Deskriptoren
  if (inner.style) {
    console.log('result =', inner.style.result);
  }
}
result = calc(var(--x) * 2)

// Wichtig · Fallstricke

  • Kompatibilität: @function und CSSFunctionRule sind experimentell. Bisher unterstützen nur Chromium-Browser sie (ab Version 139). Firefox und Safari kennen sie noch nicht. Prüfe deshalb vorher mit typeof CSSFunctionRule !== 'undefined' oder in CSS mit @supports, ob sie verfügbar sind.
  • Browser ohne Unterstützung verwerfen die Regel beim Parsen. Sie erscheint dann gar nicht in cssRules, es wird also auch keine andere Regel an ihrer Stelle angelegt.
  • name und returnType sind nur lesbar. Um eine Funktion zu ändern, musst du die Regel mit deleteRule() entfernen und mit insertRule() neu einfügen.
  • Der Funktionsname muss mit -- beginnen, genau wie bei benutzerdefinierten Eigenschaften. Ohne Typangabe liefert getParameters() den Typ "*".
  • Stylesheets von fremden Ursprüngen ohne passende CORS-Header werfen beim Zugriff auf cssRules einen SecurityError. Fange diesen Fehler ab.
  • Die Spezifikation (CSS Mixins and Functions) ist noch im Entwurf. Namen und Rückgabeformen einzelner Mitglieder können sich noch ändern.