Strukturelle Pseudoklassen wählen Elemente anhand ihrer Position innerhalb
eines übergeordneten Elements aus. Dadurch können beispielsweise das erste,
das letzte oder jedes zweite Element einer Gruppe formatiert werden, ohne
zusätzliche Klassen im HTML einzufügen.
Erste, letzte und einzelne Elemente
Pseudoklasse
Bedeutung
:first-child
Wählt ein Element aus, wenn es das erste Kind seines
Elternelements ist.
:last-child
Wählt ein Element aus, wenn es das letzte Kind seines
Elternelements ist.
:only-child
Wählt ein Element aus, wenn es das einzige Kind seines
Elternelements ist.
:first-of-type
Wählt das erste Geschwisterelement seines Elementtyps aus.
:last-of-type
Wählt das letzte Geschwisterelement seines Elementtyps aus.
:only-of-type
Wählt ein Element aus, wenn es innerhalb seines Elternelements
das einzige Element dieses Typs ist.
:first-child und :last-child
Im folgenden Beispiel erhält das erste Listenelement eine grüne und das
letzte Listenelement eine rote Markierung.
Diese Pseudoklassen berücksichtigen den Elementtyp. Im folgenden Bereich
wird der erste und der letzte Absatz ausgewählt, obwohl vor dem ersten
Absatz noch eine Überschrift steht.
In diesem HTML trifft p:first-child auf keinen Absatz zu,
weil die Überschrift das erste Kind ist. p:first-of-type
wählt dagegen den ersten Absatz aus.
:nth-child()
Mit :nth-child() werden Elemente anhand ihrer Position
innerhalb einer Gruppe von Geschwisterelementen ausgewählt. Die Zählung
beginnt bei 1.
Ausgewählt werden die Elemente an den Positionen 1, 4, 7 und so weiter.
Die ersten oder die folgenden Elemente auswählen
Selektor
Ergebnis
:nth-child(-n + 3)
Wählt die ersten drei Elemente aus.
:nth-child(n + 4)
Wählt alle Elemente ab dem vierten aus.
:nth-child(n + 3):nth-child(-n + 6)
Wählt die Elemente 3 bis 6 aus.
/* Die ersten drei Elemente */
li:nth-child(-n + 3) {
font-weight: 700;
}
/* Alle Elemente ab dem vierten */
li:nth-child(n + 4) {
color: #6f42c1;
}
/* Die Elemente 3 bis 6 */
li:nth-child(n + 3):nth-child(-n + 6) {
background-color: #e7f1ff;
}
:nth-last-child()
:nth-last-child() funktioniert ähnlich wie
:nth-child(). Die Elemente werden jedoch vom Ende der
Geschwistergruppe aus gezählt.
Auch ein Leerzeichen oder ein Zeilenumbruch im Element kann verhindern,
dass :empty zutrifft. Das Element sollte deshalb wirklich
keinen Inhalt besitzen:
<p></p>
Funktionale Pseudoklassen
Funktionale Pseudoklassen werden wie Funktionen geschrieben. In den runden
Klammern stehen Selektoren oder Bedingungen, anhand derer Elemente ausgewählt
oder ausgeschlossen werden.
Pseudoklasse
Bedeutung
:not()
Wählt Elemente aus, auf welche die angegebenen Selektoren nicht
zutreffen.
:is()
Fasst mehrere alternative Selektoren zu einer übersichtlichen
Selektorliste zusammen.
:where()
Funktioniert ähnlich wie :is(), besitzt jedoch immer die
Spezifität 0-0-0.
:has()
Wählt ein Element abhängig davon aus, ob darin oder in einer
festgelegten Beziehung ein passendes Element vorhanden ist.
:not()
Die Pseudoklasse :not() wird auch als
Negations-Pseudoklasse bezeichnet. Sie wählt Elemente aus,
die nicht auf den Selektor innerhalb der runden Klammern passen.
Dafür könnte auch ein Geschwisterselektor oder die Eigenschaft
gap verwendet werden. Bei Flexbox- und Grid-Layouts ist
gap meistens die übersichtlichere Lösung.
Spezifität von :not()
:not() fügt selbst keine eigene Spezifität hinzu. Für die
Berechnung wird der spezifischste Selektor innerhalb der Klammern
berücksichtigt.
Selektor
Spezifität
p:not(.hinweis)
0-1-1: eine Klasse und ein Element
p:not(#wichtig)
1-0-1: eine ID und ein Element
li:not(:last-child)
0-1-1: eine Pseudoklasse und ein Element
:is()
Mit :is() können mehrere alternative Selektoren
zusammengefasst werden. Dadurch lassen sich lange Selektorlisten deutlich
kürzer und übersichtlicher schreiben.
Der Selektor wählt Links im Hoverzustand aus, wenn sie sich in einem
header-, main- oder
footer-Element befinden.
Spezifität von :is()
:is() besitzt nicht einfach die Spezifität des Selektors, der
bei einem bestimmten Element tatsächlich passt. Entscheidend ist der
spezifischste Selektor in der gesamten Selektorliste.
:is(p, .notice, #important) {
color: #6f42c1;
}
Weil die Liste den ID-Selektor #important enthält, wird für
:is() die Spezifität dieses ID-Selektors verwendet. Das gilt
auch dann, wenn das ausgewählte Element nur auf p passt.
IDs sollten deshalb nicht unnötig in einer :is()-Liste mit
einfachen Element- oder Klassenselektoren vermischt werden.
:where()
:where() funktioniert bei der Auswahl grundsätzlich wie
:is(). Der entscheidende Unterschied liegt in der
Spezifität.
.content :where(h2, h3, h4) {
color: #6f42c1;
}
Die Selektoren in den Klammern erhöhen die Spezifität nicht.
:where() besitzt unabhängig von seinem Inhalt immer die
Spezifität 0-0-0.
Vergleich zwischen :is() und :where()
Eigenschaft
:is()
:where()
Mehrere Selektoren zusammenfassen
Ja
Ja
Auswahlverhalten
Alternative Selektoren
Alternative Selektoren
Spezifität des Inhalts
Der spezifischste Selektor in der Liste wird berücksichtigt.
Die Klasse .special-link kann den Grundstil problemlos
überschreiben, weil der Selektor innerhalb von :where() die
Spezifität nicht erhöht.
:where() eignet sich deshalb besonders für Grundstile,
Komponentenbibliotheken und CSS-Regeln, die später einfach angepasst werden
sollen.
:has()
Mit :has() kann ein Element anhand anderer Elemente in seiner
Umgebung ausgewählt werden. Häufig wird damit ein Elternelement ausgewählt,
wenn es ein bestimmtes untergeordnetes Element enthält.
Der Selektor wählt eine h4-Überschrift aus, wenn direkt danach
ein Absatz folgt. Das Pluszeichen ist dabei der Selektor für unmittelbar
benachbarte Geschwister.
Dieser Selektor wählt jedes article-Element aus, das mindestens
ein Bild, ein Video oder einen eingebetteten Inhalt enthält.
Spezifität von :has()
Wie bei :is() und :not() wird für
:has() die Spezifität des spezifischsten Selektors innerhalb
der Klammern verwendet.
Selektor
Bedeutung
Spezifität
.card:has(img)
Eine Karte, die ein Bild enthält
0-1-1
label:has(input:checked)
Eine Beschriftung mit ausgewähltem Eingabefeld
0-1-2
article:has(#video)
Ein Artikel mit einem Element, das die ID
#video besitzt
1-0-1
:has() ist besonders leistungsfähig. Sehr allgemeine und
aufwendige Selektoren sollten dennoch gezielt eingesetzt werden, damit das
Stylesheet verständlich und gut wartbar bleibt.
Funktionale Pseudoklassen im Vergleich
Pseudoklasse
Aufgabe
Beispiel
:not()
Bestimmte Elemente ausschließen
li:not(.active)
:is()
Mehrere Selektoren kompakt zusammenfassen
:is(h2, h3, h4)
:where()
Mehrere Selektoren ohne zusätzliche Spezifität zusammenfassen
:where(header, main, footer) a
:has()
Elemente anhand anderer Elemente oder Beziehungen auswählen
.card:has(img)
Vereinfacht ausgedrückt:
:not() bedeutet:
„außer diesen Elementen“.
:is() bedeutet:
„einer dieser Selektoren“.
:where() bedeutet:
„einer dieser Selektoren, aber ohne zusätzliche Spezifität“.
:has() bedeutet:
„wenn ein passendes Element vorhanden ist“.