nth-child: Fortgeschrittene Formeln
AI generated
{ }
@
CSS · Selektoren · Frontend
nth-child: Fortgeschrittene Formeln
Die An+B Mathematik wirklich verstehen und anwenden

Die meisten Entwickler kennen nth-child nur über odd und even, dabei steckt dahinter eine vollständige lineare Formel, die weit komplexere Muster ermöglicht. Diese Sammlung erklärt die An+B Mathematik, nth-last-child und die of S Syntax anhand konkreter Rezepte für Grids, Listen und Paginierung.

17 Min. Lesezeit nth-child · An+B Formeln · nth-last-child Alle modernen Browser

1. Warum odd und even nur die Oberfläche von nth-child sind

Die Pseudoklasse nth-child wird in den meisten Tutorials auf zwei Schlüsselwörter reduziert: odd für ungerade und even für gerade Positionen, meistens demonstriert an Zebra-Streifen in Tabellen. Diese beiden Schlüsselwörter sind aber nur benannte Abkürzungen für die eigentliche, deutlich mächtigere Syntax dahinter, eine lineare Formel der Form An+B, die praktisch jedes beliebige, sich wiederholende Muster über eine Liste von Geschwistern ausdrücken kann.

Wer nur odd und even kennt, greift bei komplexeren Anforderungen, etwa jedes dritte Element ab dem fünften oder alle Elemente außer den letzten beiden, meist zu JavaScript oder zusätzlichen Klassen im Markup. Dabei lässt sich mit nth-child und der zugrunde liegenden Formel nahezu jede numerische Positionsbedingung direkt im Selektor ausdrücken. Die folgenden Abschnitte zeigen, wie die Formel funktioniert und welche praxisrelevanten Muster sich daraus ableiten lassen.

2. Die An+B Formel Schritt für Schritt erklärt

Die Formel hinter nth-child lautet An+B, wobei n für jede nicht negative Ganzzahl beginnend bei null steht, A die Schrittweite zwischen den Treffern bestimmt und B einen Offset addiert. nth-child(3n+1) berechnet für n=0,1,2,3... die Positionen 1, 4, 7, 10 und so weiter, weil jedes Mal drei zur vorherigen Position addiert wird, beginnend bei eins. Das Verständnis dieser Rechnung ist der Schlüssel, um nth-child für beliebige Muster einzusetzen, statt sich auf vorgefertigte Schlüsselwörter zu verlassen.

Negative Werte für A sind ebenfalls gültig und drehen die Zählrichtung effektiv um: nth-child(-n+3) berechnet die Positionen 3, 2, 1 und stoppt dort, weil negative Positionen nicht existieren, was in der Praxis genau die ersten drei Elemente selektiert. Diese Eigenschaft macht -n+X zu einem der nützlichsten Bausteine für Bereichsauswahl mit nth-child, deutlich kompakter als eine lange Aufzählung einzelner Positionen.


/* A = 3, B = 1: positions 1, 4, 7, 10, ... */
li:nth-child(3n+1) {
  font-weight: bold;
}

/* Negative A effectively selects "the first N" elements */
li:nth-child(-n+3) {
  color: #7c3aed;
}

/* A = 0 behaves like an exact position (equivalent to nth-child(5)) */
li:nth-child(0n+5) {
  background: #f5f3ff;
}

/* Classic odd/even are just named shortcuts for 2n+1 and 2n */
tr:nth-child(odd)  { background: #f8fafc; }  /* same as 2n+1 */
tr:nth-child(even) { background: #ffffff; }  /* same as 2n   */

3. Rezept: Bereiche auswählen, erste und letzte N ausschließen

Ein häufiger Anwendungsfall ist die Auswahl eines Bereichs innerhalb einer Liste, etwa alle Elemente zwischen Position vier und acht. Mit nth-child lässt sich das durch die Kombination zweier Formeln in einem Selektor lösen: li:nth-child(n+4):nth-child(-n+8) trifft genau auf die Positionen vier bis acht, weil die erste Formel alles ab Position vier erfasst und die zweite Formel alles bis Position acht begrenzt. Der Schnittpunkt beider Bedingungen ergibt den gewünschten Bereich.

Ein zweites verbreitetes Muster ist das Ausschließen der ersten und letzten Elemente einer Liste, etwa wenn Trennlinien zwischen Einträgen erscheinen sollen, aber nicht vor dem ersten oder nach dem letzten Eintrag. li:not(:first-child):not(:last-child) löst das direkt, während li:nth-child(n+2) allein bereits das erste Element ausschließt, wenn kein zusätzlicher Endpunkt gebraucht wird. Diese Bereichsmuster mit nth-child ersetzen viele Fälle, die sonst eine zusätzliche CSS-Klasse am ersten oder letzten Markup-Element erfordern würden.


/* Select exactly positions 4 through 8 */
li:nth-child(n+4):nth-child(-n+8) {
  background: #ede9fe;
}

/* Separator lines between items, but not before the first or after the last */
li:not(:first-child) {
  border-top: 1px solid #e2e8f0;
}

/* Fade out the last three items in a preview list */
li:nth-last-child(-n+3) {
  opacity: 0.5;
}

4. nth-last-child: Rückwärtszählung richtig nutzen

nth-last-child verwendet dieselbe An+B Mathematik wie nth-child, zählt aber vom Ende der Geschwisterliste statt vom Anfang. Das macht es zum idealen Werkzeug für Muster, die von der Gesamtanzahl der Elemente abhängen, ohne diese Anzahl explizit zu kennen. li:nth-last-child(-n+3) selektiert immer die letzten drei Elemente, unabhängig davon, ob die Liste insgesamt fünf oder fünfzig Einträge enthält, weil die Zählung stets relativ zum Ende erfolgt.

Ein besonders elegantes Muster kombiniert nth-child und nth-last-child, um ein Element in der exakten Mitte einer Liste zu finden, unabhängig von deren Länge: li:nth-child(odd):nth-last-child(odd) trifft nur auf Listen mit ungerader Gesamtlänge zu und markiert dort automatisch das mittlere Element, weil nur die exakte Mitte sowohl von vorne als auch von hinten eine ungerade Position hat. Diese Technik funktioniert komplett ohne JavaScript und ohne die Länge der Liste im Voraus zu kennen.


/* Always the last three items, regardless of total list length */
li:nth-last-child(-n+3) {
  border-color: #7c3aed;
}

/* Find the exact middle element of an odd-length list */
li:nth-child(odd):nth-last-child(odd) {
  font-weight: 700;
  color: #6d28d9;
}

/* Last row of a grid needs no bottom border */
.grid-item:nth-last-child(-n+3) {
  border-bottom: none;
}

5. Die of S Syntax: gefilterte Zählung verstehen

Die erweiterte Syntax nth-child(An+B of S) fügt der Formel einen zusätzlichen Filter hinzu: statt alle Geschwister zu zählen, werden nur diejenigen gezählt, die zusätzlich dem Selektor S entsprechen. li:nth-child(2n of .featured) zählt ausschließlich die Elemente mit der Klasse featured und wählt davon jedes zweite aus, unabhängig davon, an welchen absoluten Positionen sich diese Elemente innerhalb der gesamten Liste befinden.

Diese Syntax löst ein Problem, das mit klassischem nth-child allein nicht lösbar war: die Positionszählung innerhalb einer gefilterten Teilmenge statt der kompletten Geschwisterliste. Vor der of S Syntax musste man entweder ein zusätzliches Wrapper-Element pro Kategorie einführen oder auf JavaScript zurückgreifen, um beispielsweise jedes zweite hervorgehobene Produkt in einer gemischten Produktliste zu markieren. Der Browser-Support für of S ist mittlerweile in allen aktuellen Evergreen-Browsern gegeben.


/* Count only elements matching .featured, then select every 2nd of those */
li:nth-child(2n of .featured) {
  outline: 2px solid gold;
}

/* First 2 featured items in a mixed list, regardless of absolute position */
li:nth-child(-n+2 of .featured) {
  transform: scale(1.05);
}

6. Rezept: Grid-Layouts mit Zeilenumbruch-Logik

In CSS-Grid-Layouts mit fester Spaltenzahl ist nth-child das Standardwerkzeug, um Elemente am Zeilenanfang oder Zeilenende gezielt zu stylen, etwa um horizontale Trennlinien nur zwischen Zeilen, nicht aber zwischen Spalten einzufügen. Bei einem Grid mit vier Spalten selektiert .item:nth-child(4n+1) immer das erste Element jeder Zeile, was für linksbündige Zusatzstile oder das Entfernen eines linken Randes am Zeilenanfang nützlich ist.

Ein verwandtes Muster betrifft variable Randlinien: .item:not(:nth-child(4n)) fügt einen rechten Rand bei allen Elementen außer dem letzten einer jeden Zeile hinzu, sodass am Zeilenende keine überflüssige Linie entsteht. Diese Technik ist deutlich robuster als das manuelle Setzen von Klassen im Markup, weil sie automatisch mit der tatsächlichen Position im DOM synchron bleibt, selbst wenn sich die Anzahl der Elemente durch dynamisch geladenen Content ändert.

7. nth-child vs. nth-of-type: der entscheidende Unterschied

nth-child zählt alle Geschwisterelemente unabhängig vom Tag-Namen, während nth-of-type nur Geschwister desselben Tag-Namens zählt. Der Unterschied wird relevant, sobald verschiedene Elementtypen gemischt im selben Container stehen: in einem Container mit abwechselnden h3- und p-Elementen zählt p:nth-child(2) die absolute Position unter allen Kindern, während p:nth-of-type(2) das zweite p-Element zählt, unabhängig davon, wie viele h3-Elemente dazwischen liegen.

Dieser Unterschied ist eine häufige Fehlerquelle: Entwickler erwarten oft das Verhalten von nth-of-type, verwenden aber versehentlich nth-child, was bei gemischtem Markup zu falschen Treffern führt. Die Faustregel: nth-of-type nutzen, sobald mehrere unterschiedliche Elementtypen als Geschwister vorkommen und nur ein bestimmter Typ gezählt werden soll, nth-child nutzen, sobald tatsächlich die absolute Geschwisterposition zählt, etwa in einer homogenen Liste aus ausschließlich li-Elementen.

8. Rezept: Paginierungsgruppen und Trennlinien

Ein praxisnahes Rezept für nth-child ist die visuelle Gruppierung von Paginierungs-Buttons oder langen Listen in Blöcke, etwa das Einfügen einer visuellen Trennung nach jeweils fünf Einträgen. li:nth-child(5n)::after { content: ""; display: block; margin-block: 0.5rem; border-bottom: 1px solid #e2e8f0; } fügt automatisch nach jedem fünften Element eine Trennlinie ein, ohne dass die Gruppierung im Markup nachgebildet werden muss.

Für Tabellen mit vielen Zeilen lässt sich dasselbe Prinzip nutzen, um alle fünf oder zehn Zeilen eine dickere Trennlinie einzuziehen und so die Lesbarkeit langer Datensätze zu verbessern, ein Muster, das man aus gedruckten Tabellenkalkulationen kennt. tr:nth-child(10n) markiert jede zehnte Zeile mit einer verstärkten unteren Umrandung, was besonders bei Tabellen mit hunderten Zeilen die Orientierung deutlich erleichtert, ganz ohne zusätzliche Gruppierungs-Logik im Backend.

9. nth-child Formeln im direkten Vergleich

Die folgende Tabelle zeigt gängige Anforderungen und die passende nth-child Formel dafür, als schnelle Referenz für den Projektalltag.

Anforderung Formel Erklärung
Erste drei Elemente :nth-child(-n+3) Negatives A stoppt bei Position drei
Letzte drei Elemente :nth-last-child(-n+3) Zählung vom Ende der Liste
Bereich 4 bis 8 :nth-child(n+4):nth-child(-n+8) Zwei Formeln als Schnittmenge
Jedes dritte gefilterte Element :nth-child(3n of .tag) Zählung nur innerhalb der Teilmenge
Alle außer erstem und letztem :not(:first-child):not(:last-child) Doppelte Negation statt Formel

Die Kombination mehrerer nth-child Selektoren als Schnittmenge, wie im Bereichsbeispiel gezeigt, ist der Schlüssel zu komplexeren Mustern. Statt eine einzelne, komplizierte Formel zu suchen, lassen sich fast alle Anforderungen aus einfachen, gut verständlichen Teilformeln zusammensetzen.

Mironsoft

Grid-Layouts, Listen und Hyvä-Themes ohne unnötiges Markup

Positionsbasiertes Styling ohne zusätzliche Klassen im Markup?

Wir ersetzen manuell gepflegte Positions-Klassen durch präzise nth-child Formeln, für schlankeres Markup und Grid-Layouts, die automatisch mit dynamischem Content mitwachsen.

CSS-Audit

Manuelle Positions-Klassen identifizieren und durch nth-child ersetzen

Grid-Refactoring

Zeilenumbruch-Logik und Trennlinien robust und dynamikfest gestalten

Hyvä-Integration

nth-child Muster sauber in Tailwind- und Alpine-Komponenten einbinden

10. Zusammenfassung

nth-child ist deutlich mehr als odd und even: die zugrunde liegende An+B Formel erlaubt beliebige Schrittweiten, Offsets und über negative Werte auch Bereichsauswahl. nth-last-child zählt dieselbe Formel rückwärts vom Ende der Liste, was Muster ermöglicht, die unabhängig von der Gesamtanzahl der Elemente funktionieren. Die of S Syntax fügt eine gefilterte Zählung hinzu, die Positionsauswahl innerhalb einer Teilmenge statt der kompletten Geschwisterliste erlaubt.

Wer diese Formeln beherrscht, kann Grid-Zeilenumbrüche, Paginierungsgruppen, Bereichsauswahl und Positions-Filterung direkt im Selektor ausdrücken, ohne zusätzliche Klassen im Markup zu pflegen. Der Unterschied zwischen nth-child und nth-of-type bleibt dabei die häufigste Fehlerquelle und sollte bei gemischtem Markup immer bewusst geprüft werden, bevor eine Formel als fertig gilt.

nth-child Formeln: Das Wichtigste auf einen Blick

An+B Grundformel

A bestimmt die Schrittweite, B den Offset. Negatives A ergibt Bereichsauswahl ab Position eins.

nth-last-child

Zählt vom Ende der Liste, ideal für Muster, die unabhängig von der Gesamtanzahl funktionieren sollen.

of S Syntax

Zählt nur Elemente, die zusätzlich einem Filter entsprechen, für Positionsauswahl innerhalb einer Teilmenge.

nth-child vs. nth-of-type

nth-child zählt alle Geschwister, nth-of-type nur solche mit demselben Tag-Namen. Häufige Verwechslung bei gemischtem Markup.

11. FAQ: nth-child Formeln

1Was bedeutet An+B?
A bestimmt die Schrittweite, B einen Offset, für n=0,1,2,... ergibt sich eine Reihe von Positionen.
2Erste drei Elemente auswählen?
Mit nth-child(-n+3), negatives A stoppt bei Position drei.
3Unterschied zu nth-last-child?
Gleiche Formel, aber Zählung vom Ende der Liste statt vom Anfang.
4Bereich 4 bis 8 auswählen?
nth-child(n+4):nth-child(-n+8) bildet die Schnittmenge beider Bedingungen.
5Was macht of S?
Zählt nur Elemente, die zusätzlich einem Filter entsprechen, statt alle Geschwister.
6Unterschied nth-child zu nth-of-type?
nth-child zählt alle Geschwister, nth-of-type nur solche mit demselben Tag-Namen.
7Mittleres Element ohne JavaScript?
li:nth-child(odd):nth-last-child(odd) trifft die exakte Mitte einer ungeraden Liste.
8Erstes Element jeder Grid-Zeile?
Bei vier Spalten trifft nth-child(4n+1) immer das erste Element jeder Zeile.
9Trennlinien alle N Elemente?
Mit li:nth-child(5n) lässt sich nach jedem fünften Element eine Trennung einfügen.
10Wird of S überall unterstützt?
Ja, alle aktuellen Evergreen-Browser unterstützen die of S Syntax vollständig.