PorównaniePorównania

:nth-child() vs :nth-of-type()

nth-child() liczy wszystkie elementy rodzica, niezależnie od znacznika. nth-of-type() liczy tylko rodzeństwo z tym samym znacznikiem co wybrany selektor.

Na tej stronie

Porównanie w tabeli

#

Przykład

#
CSS
p:first-child { background: #7c3aed; color: #fff; }
Podgląd

Nic się nie podświetla: pierwszym dzieckiem artykułu jest h4, a nie akapit.

Definicja i zastosowanie

#

Pseudoklasa :nth-child() numeruje wszystkie dzieci rodzica, zaczynając od 1, bez względu na to, jakim znacznikiem są. Przyjmuje konkretną liczbę, słowa odd i even albo wzór An+B, dokładnie tak samo jak jej siostrzana pseudoklasa.

:nth-of-type() działa według tej samej składni argumentu, ale liczy tylko rodzeństwo z tym samym znacznikiem co element po lewej stronie selektora. W rodzicu, w którym akapity przeplatają się z obrazkami, p:nth-of-type(2) wskaże drugi akapit, nawet jeśli przed nim stoją inne elementy.

Klasyczna pułapka to p:first-child, które nie trafi w nic, jeśli przed pierwszym akapitem stoi nagłówek, bo pierwszym dzieckiem rodzica jest właśnie on. Rozwiązuje to p:first-of-type. Z drugiej strony tylko :nth-child() rozumie nowszą składnię of <selektor>, czyli liczenie po klasie, a nie po znaczniku.

Składnia

#
Składnia
:nth-child( <liczba> | odd | even | An+B [of <selektor>]? )
:nth-of-type( <liczba> | odd | even | An+B )

Więcej przykładów

#
nth-of-type naprawia tę pułapkę
CSS
p:first-of-type { background: #7c3aed; color: #fff; }
Podgląd

Teraz podświetla się pierwszy akapit, mimo że w kodzie stoi po nagłówku.

Różny wynik na liście z mieszanymi znacznikami
CSS
span:nth-of-type(even) { background: #7c3aed; color: #fff; }
Podgląd

nth-of-type liczy tylko wśród elementów span (2 i 4), bez oglądania się na em stojące między nimi. nth-child(even) policzyłby zupełnie inne elementy.

Dobre praktyki

#
  • Gdy w rodzicu mieszają się różne znaczniki, :nth-of-type() zwykle daje bardziej przewidywalny wynik niż :nth-child().
  • Tylko :nth-child() rozumie składnię "of selektor", np. :nth-child(2 of .hot), czyli liczenie po klasie.
  • Klasyczna pułapka: p:first-child nie zadziała, jeśli przed pierwszym akapitem stoi nagłówek. Użyj p:first-of-type.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.