Menu

CSS Pseudoklassen: nth-child, not, first-child, focus

Pseudoklassen wählen Elemente nach Position oder Zustand aus: :nth-child(), :first-child, :not(), :focus, :checked, :has() und mehr. Hier lernst du die Syntax, die Formel an+b mit einem Live-Tester und den Unterschied zwischen nth-child und nth-of-type.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Was eine Pseudoklasse ist

Eine Pseudoklasse ist ein Schlüsselwort nach einem Doppelpunkt, das Elemente nach ihrer Position im Dokument oder ihrem Zustand auswählt. Du hängst sie an einen normalen Selektor an: li:first-child, input:focus, a:hover.

Zustands-Pseudoklassen für Links und die Maus (:hover, :active, :visited) haben eine eigene Seite, CSS hover.

:nth-child() und die Formel an+b

:nth-child() nimmt eine Zahl, ein Schlüsselwort oder eine Formel an+b. Der Browser probiert n = 0, 1, 2, ... und trifft jede Position, die die Formel ergibt (Positionen beginnen bei 1).

FormelTrifft PositionenBedeutung
33Das dritte Kind
odd oder 2n+11, 3, 5, ...Ungerade Zeilen
even oder 2n2, 4, 6, ...Gerade Zeilen
3n3, 6, 9, ...Jedes dritte
n+44, 5, 6, ...Das vierte und alle danach
-n+31, 2, 3Die ersten drei
3n+11, 4, 7, ...Jedes dritte, beginnend beim ersten

Tipp eine Formel ein und sieh, welche Einträge getroffen werden:

Probier odd, even, 4, n+7, -n+5 und 2n+3. Eine ungültige Formel trifft nichts.

Das Gegenstück, das von hinten zählt, ist :nth-last-child(): li:nth-last-child(-n+2) wählt die letzten zwei Einträge.

nth-child vs. nth-of-type

:nth-child() zählt jedes Geschwisterelement, egal welcher Tag, und prüft erst danach den Rest des Selektors. :nth-of-type() zählt nur Geschwister mit demselben Tag. Der Unterschied zeigt sich, sobald die Geschwister gemischt sind:

Dieselben Paare gibt es für die Enden: :first-child / :first-of-type, :last-child / :last-of-type, :only-child / :only-of-type.

:not(), :is() und :where()

PseudoklasseBeispielTrifft
:not(X)li:not(.done)Elemente, die nicht auf X passen
:is(X, Y):is(h1, h2, h3) aElemente, die auf einen Eintrag der Liste passen
:where(X, Y):where(ul, ol) liWie :is(), mit Spezifität null
:has(X)li:has(> input:checked)Elemente, die einen Treffer für X enthalten

:not() brauchst du ständig, zum Beispiel für einen Trenner zwischen Einträgen, aber nicht nach dem letzten:

Zustands-Pseudoklassen: focus, checked, disabled, invalid

PseudoklasseTrifft
:focusDas Element, das den Tastatur- oder Mausfokus hat
:focus-visibleFokussiert, und der Browser entscheidet, dass ein Fokusring erscheinen soll (meist bei Tastaturfokus)
:focus-withinEin Element, das das fokussierte Element enthält
:checkedEine angehakte Checkbox, ein gewählter Radio-Button oder eine gewählte <option>
:disabled / :enabledFormularelemente, die (nicht) deaktiviert sind
:required / :optionalEingabefelder mit oder ohne required
:invalid / :validEingabefelder, deren Wert die Validierung nicht besteht oder besteht
:user-invalidUngültig, aber erst, nachdem der Nutzer damit interagiert hat
:placeholder-shownEin Eingabefeld, das gerade seinen Platzhalter zeigt
:emptyEin Element ohne Kinder, nicht einmal Text
:targetDas Element, dessen id zum #fragment der URL passt

Klick in das E-Mail-Feld: Sein Label wird durch :focus-within blau. Tipp etwas ein, das keine E-Mail-Adresse ist, und verlass das Feld: :user-invalid färbt den Rahmen bernsteinfarben. Ein einfaches :invalid hätte das leere Pflichtfeld schon markiert, bevor du es berührt hast.

Was auch immer du mit :focus machst, behalte einen sichtbaren Fokusstil. Wer die Umrandung ohne Ersatz entfernt, lässt Tastaturnutzer im Unklaren darüber, wo sie gerade sind.

:has(), der Elternselektor

:has() trifft ein Element anhand dessen, was es enthält. Das ist der lange gewünschte „Elternselektor“, und er funktioniert in aktuellen Versionen von Chrome, Firefox und Safari.

Wähl den anderen Tarif: Die ganze Karte folgt dem Radio-Button, ganz ohne JavaScript.

Häufige Fehler

  • Ein Leerzeichen vor dem Doppelpunkt. li :first-child bedeutet „ein erstes Kind innerhalb eines li“. Schreib li:first-child.
  • Erwarten, dass p:nth-child(1) „das erste p“ bedeutet. Es bedeutet „das erste Kind, falls es ein p ist“. Für das erste p nimmst du :first-of-type.
  • Ab 0 zählen. Positionen beginnen bei 1: :nth-child(0) trifft nichts.
  • Fokus-Umrandungen entfernen. :focus { outline: none } ohne Ersatz macht die Tastaturnavigation kaputt.
  • : und :: verwechseln. :before ist eine alte Schreibweise des Pseudoelements ::before; Pseudoklassen haben immer einen Doppelpunkt.

Häufig gestellte Fragen

Was ist eine Pseudoklasse in CSS?

Ein Schlüsselwort nach einem Doppelpunkt, das Elemente nach Zustand oder Position auswählt statt nach Namen, etwa a:hover, li:first-child oder input:focus. Es wird an einen normalen Selektor angehängt, und die meisten Pseudoklassen zählen für die Spezifität wie eine Klasse (:where() zählt null).

Wie funktioniert nth-child in CSS?

:nth-child(an+b) trifft Elemente, deren Position unter ihren Geschwistern a×n+b ist, für n = 0, 1, 2 und so weiter, gezählt ab 1. :nth-child(3) ist das dritte Kind, :nth-child(odd) oder 2n+1 jedes ungerade und :nth-child(n+4) das vierte und alle danach.

Was ist der Unterschied zwischen nth-child und nth-of-type?

:nth-child() zählt alle Geschwisterelemente und prüft danach den Rest des Selektors; :nth-of-type() zählt nur Geschwister desselben Elementtyps. In einer Folge aus einem h2 und mehreren Absätzen trifft p:nth-child(1) nichts, während p:nth-of-type(1) den ersten Absatz trifft.

Wie verwendet man :not() in CSS?

Schreib den auszuschließenden Selektor in die Klammern: li:not(.done) trifft jeden Listeneintrag ohne die Klasse done. Es nimmt auch eine Liste an, input:not([type="checkbox"], [type="radio"]).

Was ist der Unterschied zwischen einer Pseudoklasse und einem Pseudoelement?

Eine Pseudoklasse (ein Doppelpunkt, :hover) wählt ein ganzes vorhandenes Element in einem bestimmten Zustand aus. Ein Pseudoelement (zwei Doppelpunkte, ::before) zielt auf einen Teil eines Elements oder erzeugt generierten Inhalt.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S