Start · Sprachen · JavaScript · Referenz · CSSStyleRule.selectorText

CSSStyleRule.selectorText

Eigenschaft

Liest oder setzt den Selektor-Text einer CSS-Regel, z. B. <code>.btn:hover, a.active</code>, als serialisierten String.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

CSSStyleRule.selectorText

Beschreibung

Die Eigenschaft selectorText des Interfaces CSSStyleRule liefert die Selektorliste einer Stilregel als String, also den Teil vor dem Block { … }. Weist man ihr einen neuen Wert zu, wird der Selektor der Regel live geändert. Der Browser wendet die Regel dann sofort auf die passenden Elemente an, ohne dass das Stylesheet neu geladen wird.

Der zurückgegebene Wert ist serialisiert. Der Browser normalisiert Leerzeichen und Kommas und schreibt Typselektoren manchmal klein. Aus h1,H2 , p wird zum Beispiel h1, h2, p. Deshalb sollte man den Wert nicht Zeichen für Zeichen mit dem Originalquelltext vergleichen.

Typische Einsatzfälle sind Werkzeuge, die Stylesheets untersuchen (z. B. alle Regeln für eine bestimmte Klasse finden), dynamische Themes oder das nachträgliche Anpassen von Regeln, die man mit CSSStyleSheet.insertRule() oder über Constructable Stylesheets angelegt hat. Bei verschachteltem CSS (CSS Nesting) enthält selectorText einer verschachtelten Regel den relativen Selektor, z. B. &:hover.

Parameter

Name Typ Default Beschreibung
$value string Beim Setzen: eine gültige CSS-Selektorliste. Ist sie ungültig, wird die Zuweisung stillschweigend ignoriert und der alte Selektor bleibt erhalten.

Rückgabewert

Typ
string
Beschreibung
Die serialisierte, normalisierte Selektorliste der Regel, z. B. "ul > li.active".

Beispiele

Selektoren aller Regeln eines Stylesheets auflisten

const sheet = new CSSStyleSheet();
sheet.replaceSync(`
  h1,H2 ,  p { margin: 0; }
  .btn:hover { color: red; }
`);

for (const rule of sheet.cssRules) {
  if (rule instanceof CSSStyleRule) {
    console.log(rule.selectorText);
  }
}
h1, h2, p .btn:hover

Selektor einer Regel zur Laufzeit ändern

const style = document.createElement('style');
style.textContent = '.highlight { background: yellow; }';
document.head.append(style);

const rule = style.sheet.cssRules[0];
// Regel gilt ab jetzt für .marked statt für .highlight
rule.selectorText = '.marked';
console.log(rule.cssText);
.marked { background: yellow; }

Ungültige Selektoren werden ignoriert

const sheet = new CSSStyleSheet();
sheet.replaceSync('.card { padding: 1rem; }');
const rule = sheet.cssRules[0];

rule.selectorText = '.card[[invalid';
console.log(rule.selectorText); // unverändert

// Vorab prüfen, ob ein Selektor gültig ist
const isValid = (sel) => CSS.supports(`selector(${sel})`);
console.log(isValid('.card:has(img)'));
.card true

Alle Regeln zu einer Klasse finden

const findRulesFor = (className) =>
  [...document.styleSheets].flatMap((sheet) => {
    try {
      return [...sheet.cssRules];
    } catch {
      return []; // fremde Stylesheets ohne CORS überspringen
    }
  }).filter(
    (rule) => rule instanceof CSSStyleRule &&
      rule.selectorText.split(',').some((s) => s.includes(`.${className}`))
  );

console.log(findRulesFor('btn').map((r) => r.selectorText));
[".btn", ".btn:hover"] (abhängig von den Stylesheets der Seite)

// Wichtig · Fallstricke

  • Keine Fehlermeldung: Ungültige Selektoren lösen keine Exception aus, die Zuweisung wird einfach verworfen. Prüfe den Wert nach dem Setzen oder vorher mit CSS.supports('selector(...)').
  • Normalisierung: Der zurückgegebene String kann sich im Format vom Quelltext unterscheiden (Leerzeichen, Kleinschreibung, Anführungszeichen in Attributselektoren). Vergleiche am besten nur normalisierte Werte.
  • CORS: Bei Stylesheets von fremden Origins ohne passende CORS-Header wirft schon der Zugriff auf cssRules einen SecurityError. An selectorText kommt man dann gar nicht erst heran.
  • Das Aufteilen der Selektorliste mit split(',') ist nur eine Näherung. Kommas innerhalb von :is(), :not() oder :has() werden dabei falsch getrennt.
  • Nur Stilregeln haben diese Eigenschaft. @media, @keyframes usw. haben kein selectorText. Filtere deshalb mit instanceof CSSStyleRule.
  • Das Lesen wird überall unterstützt. Das Setzen funktioniert in allen modernen Browsern. Verschachtelte Regeln (CSS Nesting) gibt es erst in neueren Browserversionen (ab etwa 2023).