Zum Inhalt springen

Selektoren für Fortgeschrittene

Im CSS-Kapitel habt ihr die wichtigsten Selektoren kennengelernt: Element, Klasse, ID, Descendant ( ) und Child Combinator (>) sowie die Pseudo-Klassen für Links und Fokus. Damit kommt ihr schon sehr weit.

Hier folgen Selektoren, mit denen ihr Elemente noch gezielter auswählen könnt - oft ganz ohne zusätzliche Klassen im HTML:

  • Attribut-Selektoren - anhand von HTML-Attributen auswählen
  • :first-child, :nth-child() - anhand der Position unter Geschwistern auswählen
  • Pseudo-Elemente - nur einen Teil eines Elements auswählen
  • :has() - ein Element anhand seines Inhalts auswählen

Elemente lassen sich auch anhand ihrer HTML-Attribute auswählen. Zum Beispiel alle Links, deren href mit mailto: beginnt:

a[href^="mailto:"] { color: yellow; }

Document Object Model und Selektor

Es gibt mehrere Varianten:

a[href] /* Attribut existiert, egal mit welchem Wert */
a[href="https://example.com"] /* Attribut hat genau diesen Wert */
a[href^="mailto:"] /* Wert beginnt mit ... */
a[href$=".pdf"] /* Wert endet mit ... */
a[href*="example"] /* Wert enthält ... irgendwo */

Geschwister zählen: :first-child, :last-child, :nth-child()

Abschnitt betitelt „Geschwister zählen: :first-child, :last-child, :nth-child()“

Diese Pseudo-Klassen wählen ein Element anhand seiner Position unter Geschwister-Elementen aus, unabhängig vom Tag-Namen:

li:first-child { font-weight: bold; } /* nur das erste li in seiner Liste */
li:last-child { border-bottom: none; } /* nur das letzte li */
li:nth-child(odd) { background-color: #f9fafb; } /* 1., 3., 5., ... */
li:nth-child(even) { background-color: white; } /* 2., 4., 6., ... */
li:nth-child(3) { color: red; } /* genau das dritte */

Document Object Model und Selektor

Manche Selektoren wählen keinen ganzen DOM-Knoten aus, sondern nur einen Teil davon. Erkennbar sind sie am doppelten Doppelpunkt :::

p::first-letter { font-size: 2em; } /* nur der erste Buchstabe */
p::first-line { font-weight: bold; } /* nur die erste (gerenderte) Zeile */
::selection { background-color: gold; } /* der aktuell markierte Text */

Document Object Model und Selektor

section a wählt ein a innerhalb einer section. Manchmal will man aber das Elternelement selbst auswählen, abhängig davon, was es enthält. Dafür gibt es :has():

/* section, falls sie MINDESTENS EINEN Link enthält */
section:has(a) {
border-left: 3px solid gold;
}

Document Object Model und has pseudo class

Praxisbeispiel: Ein Formularfeld rot markieren, wenn eine leere Option ausgewählt ist:

select:has(option[value=""]:checked) {
border-color: red;
}
<select>
<option value="">--- Bitte wählen ---</option>
<option value="fluss">Fluss</option>
<option value="see">See</option>
</select>
NameMusterBeschreibung
Attribut-SelektorE[attr^="wert"]Trifft, wenn ein Attributwert mit wert beginnt (auch $=, *=, =)
:nth-child() u.ä.:first-child :nth-child(3) :nth-child(odd) :last-childZählt Geschwister-Elemente, trifft je nach Position
Pseudo-ElementeE::first-letter E::first-line ::selectionWählt nur einen Teil eines Elements, keinen eigenen DOM-Knoten
:has()-Pseudo-KlasseE:has(F)Trifft jedes E, das ein F als Nachkomme enthält