CSS nth-child – Zählen und berechnen
Die CSS-Funktion nth-child(n) erreicht jedes n-te Kind eines übergeordneten Eltern-Elements, wobei n eine Zahl, ein Schlüsselword odd oder even (ungerade / gerade) oder eine Formel wie an + b sein kann. :nth-child() ist das Universal-Werkzeug für alles, was sich nach Mustern, Abständen oder Positionen im DOM richtet: Tabellen, Grids und Layouts ohne extra Klassen.
E:nth-child(n)
:nth-child(n) wählt Elemente nach ihrer Position innerhalb des Eltern-Elements. Der Selektor basiert also nicht auf Klassen, IDs oder Inhalt, sondern fragt: »Liegt hier das 1., 2., 3., … Kind von seines Elternelements vor?
:nth-child ist eine Pseudoklasse (einfacher Doppelpunkt) und steht immer am Ende der Selektor-Kette. Runde Klammern kennzeichnen eine CSS-Funktion: Vor der öffnenden runden Klammer darf kein Leerzeichen stehen.
li:nth-child(3) { background:blue }
:nth-child(odd), nth-child(even)
Tabellenzeilen lassen sich mit einem geringen Aufwand abwechselnd einfärben – das verbessert die Lesbarkeit in langen Tabellen.
tr:nth-child(odd) { background: gainsboro; } tr:nth-child(even) { background: ivory; }
Klassen- und Id-Selektoren | Die ältesten und zuverlässigsten Selektoren |
Pseudo-Elemente | Zustände von HTML-Elementen filtern |
CSS Pseudo-Klassen | Besonders interessant für Listen und Tabellen |
Attribut-Selektoren | Filtern HTML-Elemente anhand ihrer Attribute |
Kontext-Selektoren | Wählen HTML-Elemente anhand ihrer relativen Position innerhalb der Struktur |
Formel für nth-child: :nth-child(an + b)
- a Schrittweite (wie oft wiederholt sich das Muster?)
- n Laufvariable (0, 1, 2, …)
- b Startposition (Offset)
Jede vierte Zelle in jeder Zeile einer Tabelle, beginend beim ersten Element (1, 5, 9, 13, 17, …).
.week td:nth-child(4n + 1) { background-color: #efefef }
Mo | 364 | 28 | 27 | Mo | 278 | 27 | 29 | Mo | 217 | 23 | 27 |
Di | 753 | 26 | 28 | Di | 360 | 25 | 29 | Di | 308 | 20 | 26 |
Mi | 186 | 27 | 28 | Mi | 696 | 25 | 29 | Mi | 513 | 19 | 25 |
Do | 209 | 22 | 28 | Do | 706 | 19 | 29 | Do | 566 | 18 | 25 |
Wenn jedes dritte Element einer Reihe gefiltert werden soll, und zwar beginnend mit dem zweiten Element, liefert eine Formel das Element ans CSS.
a + ( n - 1 ) * d ▲ ▲ ▲ | | └-- Abstand (»jedes 3. Element«) | | | └-- Multiplikator | └-- erstes Element (Beispiel beginnt beim 2. Element) a + ( n - 1 ) * d = 2 + ( n - 1 ) * 3 = 2 + ( 3n - 3) = 2 + 3n - 3 = 3n - 1
li:nth-child(3n-1) {
background: red;
}
E:nth-last-child(n)
wie nth-child, aber beginnt am Ende
li:nth-last-child(3) { background: blue }
nth-of-type(n)
:nth-child() bezieht sich immer auf alle Kinder des Elternelements → wenn nur <li>-Elemente angesprochen werden sollen, aber dazwischen ein <span> sitzt, verschiebt sich die Zählung. Dafür gibt’s :nth-of-type(), das nur gleiche Tags berücksichtigt.
Auch hier gilt: n kann entweder eine Zahl für den Index, das Schlüsselwort odd oder even oder eine Formel sein.
p:nth-of-type(odd){
background:orange
}
<div class="dbox"> <ul> <li></li> <li></li> </ul> <p></p> <p></p> <p></p> <p></p> <div></div> <div></div> </div>
- li
- li
p
p
p
p
:nth-of-type() berücksichtigt nur gleiche Elemente und wird sehr mächtig in Kombination mit :not():
li:not(:nth-child(3n)) { color: tomato; }
- Eins
- Zwei
- Drei
- Vier
- Fünf
- Sechs
- Sieben
- Acht
- Neun
nth-last-of-type(n)
wie nth-of-type, aber zählt vom Ende an und wirkt nur bei einem bestimmten Typ von Element. Und natürlich auch hier: n kann entweder eine Zahl für den Index, das Schlüsselwort odd oder even oder eine Formel sein.
p:nth-last-of-type(3) {background:orange}
- li
- li
p
p
p
p