Zusammenfassung

  • Im Februar 2018 beschrieb ein W3C-Entwurf eine noch namenlose Pseudoklasse mit Spezifität null; der Entwurf vom November führte sie als :where().
  • Bedingungen innerhalb von :where() bestimmen weiterhin, welche Elemente getroffen werden, erhöhen aber die Spezifität nicht. Selektoren außerhalb der Klammern zählen unverändert.

Zwei Zeilen CSS reichen für den Streit. a:not(:hover) entfernt die Unterstreichung bei Links, über denen der Mauszeiger gerade nicht steht. nav a soll die Links im Navigationsmenü wieder unterstreichen. Die zweite Regel mag später stehen; ihre zwei Elementselektoren verlieren gegen Element plus Pseudoklasse. Der Strich bleibt weg. Wer CSS lange genug bearbeitet hat, kennt die nächste Szene: eine zusätzliche Klasse, dann noch eine, schließlich !important als Brechstange für eine dünne Linie.

Der Selectors-Level-4-Entwurf vom 21. November 2018 führt genau diese Paarung vor. Die allgemeine Regel wird zu a:where(:not(:hover)). Sie erfasst weiterhin Links außerhalb des Hover-Zustands. Der Filter in :where() bringt jedoch kein zusätzliches Gewicht mehr mit; das äußere a zählt weiterhin. Für Links im Menü gewinnt nun nav a. Die Standardregel erfüllt ihre Aufgabe und lässt dem lokalen Autor das letzte Wort in seinem Bereich.

Den Gedanken gab es schon vor dem Namen. Der Entwurf vom 2. Februar 2018 listete eine Pseudoklasse vom Typ :matches() mit Spezifität null auf, deren Bezeichnung noch offen war. Im November stand :where() im Text; die Veröffentlichungsnotiz der CSS Working Group nannte die Neuerung ausdrücklich. Die zeitliche Folge zeigt, worum es ging. Elemente zu finden war längst möglich. Eine gemeinsam genutzte Regel sollte ihre Treffgenauigkeit behalten können, ohne dadurch jede spätere Anpassung zu überstimmen.

Ein Selektor beantwortet zwei Fragen: Welche Elemente bekommen eine Deklaration? Und mit welchem Gewicht tritt sie bei einem Konflikt an? :where() trennt beides. Der Entwurf vom 7. Mai 2022 rechnet vor, dass .qux:where(em, #foo#bar#baz) die Spezifität (0,1,0) besitzt. Die vielen IDs innerhalb der Funktion können zum Abgleich dienen; auf dem Punktekonto erscheinen sie nicht. Die Klasse .qux außerhalb bringt weiterhin ihren Punkt. Der Nullwert ist bewusst begrenzt, damit Autoren Stärke und Genauigkeit getrennt dosieren können.

Für eine Komponentenbibliothek ist das mehr als ein mathematischer Kunstgriff. Sie kann Links oder Steuerelemente sehr genau auswählen und trotzdem einen Ausgangsstil anbieten, den eine einzelne Seite mit normalem CSS anpasst. Der Bibliotheksautor muss die spätere Navigationsleiste nicht kennen. Der Seitenautor muss keinen immer längeren Selektor gegen eine fremde Grundregel bauen. Der Browser führt die gemeinsame Rechnung aus; beide Seiten entscheiden selbst, wie viel Gewicht ihre Regeln brauchen.

Der Entwurf vom 11. November 2022 erläutert außerdem tolerante Selektorlisten: Ungültige Einträge können entfernt werden, während gültige erhalten bleiben. Diese Parsing-Regel hat genaue Grenzen. Die W3C-Veröffentlichungsgeschichte ordnet die öffentlichen Schritte von 2018 und 2022 ein. Im Kern geht es um eine einfache Höflichkeit der Technik: Eine Regel darf wissen, wo sie gilt, und zugleich Platz für jemanden lassen, der den konkreten Ort besser kennt.