Was ein CSS-Selektor ist
Ein Selektor ist der Teil einer Regel vor den geschweiften Klammern. Er entscheidet, für welche Elemente die Deklarationen gelten.
p.note { color: #2563eb; }
/* selector: p.note declaration: color: #2563eb */
Die fünf grundlegenden Selektoren decken die meisten echten Stylesheets ab:
Selektortypen im Überblick
| Selektor | Beispiel | Trifft |
|---|---|---|
| Universal | * | Jedes Element |
| Typ | p | Jedes <p> |
| Klasse | .tip | Elemente mit class="tip" (unter anderem) |
| ID | #main-title | Das Element mit id="main-title" |
| Attribut | [type="email"] | Elemente, deren Attribut passt |
| Pseudoklasse | a:hover, li:first-child | Elemente in einem Zustand oder an einer Position |
| Pseudoelement | p::first-line, .x::before | Einen Teil eines Elements |
| Gruppe | h1, h2, h3 | Alles, was auf einen Eintrag der Liste passt |
| Zusammengesetzt | p.tip | Ein <p>, das zusätzlich die Klasse hat |
Klassen und IDs haben eine eigene Seite, CSS Klassenselektor. Pseudoklassen wie :nth-child() und :not() stehen auf der Seite zu Pseudoklassen.
Kombinatoren: Nachfahre vs. Kind
Ein Kombinator verbindet zwei Selektoren über ihre Beziehung im HTML-Baum. Es gibt vier.
| Kombinator | Syntax | Trifft B, wenn |
|---|---|---|
| Nachfahre | A B (Leerzeichen) | B irgendwo in A steht |
| Kind | A > B | A das Elternelement von B ist |
| Direkter Nachbar | A + B | B direkt nach A kommt, gleiches Elternelement |
| Allgemeiner Nachbar | A ~ B | B irgendwo nach A kommt, gleiches Elternelement |
Das Leerzeichen und das > sind das Paar, das oft verwechselt wird. Der Nachfahrenselektor reicht in jede Tiefe; der Kindselektor hört nach einer Ebene auf:
Geschwister-Kombinatoren: + und ~
Geschwister-Kombinatoren schauen nur nach vorn. Einen Kombinator für das „vorherige Geschwister“ gibt es nicht, aber :has() kann es ausdrücken: h2:has(+ p) trifft ein h2, auf das direkt ein p folgt.
Attributselektoren
Eckige Klammern prüfen Attribute und ihre Werte:
| Selektor | Trifft |
|---|---|
[disabled] | Hat das Attribut, beliebiger Wert |
[type="email"] | Wert ist genau email |
[href^="https"] | Wert beginnt mit https |
[href$=".pdf"] | Wert endet mit .pdf |
[class*="icon"] | Wert enthält irgendwo icon |
[lang|="en"] | Wert ist en oder beginnt mit en- |
[data-state="open" i] | Exakter Treffer, Groß- und Kleinschreibung egal |
Attributselektoren auf data-*-Attributen sind ein sauberer Weg, Zustände zu stylen, die JavaScript setzt, ohne Klassennamen zu erfinden.
Probier einen beliebigen Selektor aus
Tipp einen Selektor in das Feld. Jedes Element, das er trifft, bekommt eine bernsteinfarbene Umrandung, und darunter steht die Anzahl.
Probier #demo a, ul > li, h2 ~ *, a[href^="https"], li:not(.active).
Zusammengesetzt vs. Nachfahre: das Leerzeichen zählt
p.note und p .note unterscheiden sich um ein Leerzeichen und bedeuten Verschiedenes.
Wie Browser Selektoren lesen
Wenn mehrere Regeln auf dasselbe Element passen und dieselbe Eigenschaft setzen, gewinnt der spezifischere Selektor, und bei Gleichstand gewinnt der spätere. Eine ID wiegt schwerer als beliebig viele Klassen, und eine Klasse schwerer als beliebig viele Typselektoren; die Seite zu !important enthält die vollständige Spezifitätstabelle.
Eine Gruppe hat einen Haken: Ist irgendein Selektor in einer einfachen Liste ungültig, wird die ganze Regel verworfen. Bei a, b:unknown { } werden nicht einmal die Links gestylt. Wenn du die Liste in :is() packst, wird sie nachsichtig, und :is(a, b:unknown) stylt die Links trotzdem.
Häufige Fehler
- Punkt oder Raute fehlt.
tip { }zielt auf ein<tip>-Element, nicht aufclass="tip". Schreib.tip. - Leerzeichen in einem zusammengesetzten Selektor.
p .noteist nichtp.note. - Erwarten, dass
>Enkel erreicht. Für jede Tiefe nimmst du ein Leerzeichen. - Ein Tippfehler macht eine ganze Gruppe kaputt. Bei
h1, h2:hovr, h3wird nichts gestylt. - Zu lange Selektoren.
body div.wrapper ul li aist schwer zu lesen und schwer zu überschreiben. Eine einzelne Klasse reicht meistens.
Häufig gestellte Fragen
Was ist ein CSS-Selektor?
Der Teil einer CSS-Regel vor der {, der festlegt, für welche Elemente die Deklarationen gelten. In p.note { color: blue; } trifft der Selektor p.note jedes <p> mit der Klasse note.
Was ist der Unterschied zwischen einem Leerzeichen und > in einem CSS-Selektor?
Ein Leerzeichen ist der Nachfahren-Kombinator: nav a trifft jeden Link irgendwo in einem nav, in beliebiger Tiefe. > ist der Kind-Kombinator: nav > a trifft nur Links, deren direktes Elternelement das nav ist.
Was bedeutet + in CSS?
+ ist der Kombinator für den direkten Nachbarn. h2 + p trifft ein <p>, das unmittelbar auf ein <h2> mit demselben Elternelement folgt. ~ ist lockerer: h2 ~ p trifft jedes spätere <p> auf derselben Ebene.
Wie wähle ich Elemente in CSS über ein Attribut aus?
Setz das Attribut in eckige Klammern: [disabled] trifft Elemente, die es haben, [type="email"] einen exakten Wert, [href^="https"] einen Wert, der mit einem String beginnt, [href$=".pdf"] einen, der damit endet, und [class*="btn"] einen, der ihn enthält.
Kann CSS ein Elternelement auswählen?
Ja, mit der Pseudoklasse :has(), die aktuelle Versionen von Chrome, Firefox und Safari unterstützen. li:has(> a.active) trifft die Listeneinträge, die direkt einen aktiven Link enthalten.