Ich tue mir bei den neuen Selektoren etwas schwer, daher hab ich mir hier etwas zusammengestellt, das mir hilft.
1) Bestimme zuerst das Ziel ganz rechts.
Das ist das Element, auf das der Stil am Ende angewendet wird.
2) Arbeite dich dann nach links.
Alles links vom Ziel beschreibt Bedingungen, unter denen dieser Stil gilt
(Eltern, Umgebung, Reihenfolge, Zustand, Attribute …).
3) Übersetze Kombinatoren in kurze Sätze:
A B → „B irgendwo innerhalb von A“A > B → „B direktes Kind von A“A + B → „B direkt danach“A ~ B → „B irgendwo danach (gleiches Eltern-Element)“4) Pseudoklassen immer am aktuellen Element lesen.
:hover, :checked, :is(), :where():has()„Wähle [rechts] …, aber nur wenn [links] …“
:has() – Bedingung über Inhalt / Umgebungbody:has(#sidebar-toggle:checked) #sidebar {
margin-inline-start: 0;
}
Lesart:
„Wähle
#sidebar, aber nur wenn es in einembodyliegt,
der ein gechecktes#sidebar-toggleenthält.“
Wichtig:
:has() prüft NachfahrenTypischer Einsatz:
Layout-States, Formular-Abhängigkeiten, UI-Zustände ohne JS
@if selector() – globaler Zustands-Schalter@if selector(body:has(#sidebar-toggle:checked)) {
#sidebar {
margin-inline-start: 0;
}
}
Lesart:
„Wenn es irgendwo im Dokument einen
bodygibt,
der eine gecheckte Sidebar-Checkbox enthält,
dann aktiviere diesen CSS-Block.“
Wichtig:
Typischer Einsatz:
Globale UI-Zustände (Modal offen, Navigation aktiv, Fokus-Lock)
:is() – ODER-Gruppe am selben Elementbutton:is(.primary, .danger) {
font-weight: bold;
}
Lesart:
„Wähle
button, wenn es die Klasse.primaryoder.dangerhat.“
Wichtig:
Typischer Einsatz:
Selektoren zusammenfassen, Lesbarkeit erhöhen
body:is(#sidebar-toggle:checked) #sidebar {
margin-inline-start: 0;
}
Lesart:
„Wähle
#sidebar, aber nur wennbodyselbst
ein#sidebar-toggle:checkedist.“
❌ Unmöglich, denn:
body ist kein input:is() prüft nur das Element selbst:where() – ODER-Gruppe ohne Spezifität:where(h1, h2, h3) {
margin-block: 0.5em;
}
Lesart:
„Wähle
h1,h2oderh3, aber ohne Einfluss auf die Spezifität.“
Wichtig:
:is()Typischer Einsatz:
Design-Systeme, Reset-CSS, Grundlayout
:is() / :where()button.primary { color: red; }
Spezifität: 0-1-1
:is()button:is(.primary, .danger) { color: red; }
Spezifität: 0-1-1
→ :is() übernimmt die höchste Spezifität aus der Liste
Für den Browser ist das so, als hättest du button.primary direkt geschrieben.
:where()button:where(.primary, .danger) { color: red; }
Spezifität: 0-0-1
→ die Klassen zählen nicht
:where() ist immer Spezifität 0, egal was drinsteht.
❌ :is() und :where() können nicht sagen:
„wenn dieses Element etwas enthält“
✔️ Das kann nur :has()
| Fragestellung | Richtiger Mechanismus |
|---|---|
| Enthält dieses Element etwas Bestimmtes? | :has() |
| Existiert ein Zustand irgendwo im DOM? | @if selector() |
| Element ist A oder B? | :is() |
| A oder B, aber leicht überschreibbar? | :where() |
:is()und:where()beschreiben, was ein Element ist.
:has()beschreibt, was ein Element enthält.
@if selector()beschreibt, ob ein Zustand existiert.
Damit lassen sich moderne CSS-Selektoren korrekt lesen, vergleichen und gezielt einsetzen.
Als erster einen Kommentar schreiben.
Schreibe einen Kommentar