CSS nth-child bez tajemnic - jak czytać An+B i nie popełniać błędów

Wyjaśnienie selektora :nth-child() w CSS. Pokazuje przykłady z wartością liczbową, słowem kluczowym i formułą, jak wybrać elementy.

Spis treści

Ten selektor CSS rozwiązuje bardzo praktyczny problem: pozwala wskazać elementy według ich miejsca wśród rodzeństwa, bez dokładania klas do każdego wiersza, kafelka czy akapitu. Dobrze użyty upraszcza arkusz stylów i utrzymuje rytm układu nawet wtedy, gdy treść się zmienia. Poniżej pokazuję, jak czytać zapis An+B, gdzie najłatwiej o pomyłkę i kiedy lepiej wybrać inny wariant.

Co naprawdę liczy ten selektor

  • Indeksy są liczone od 1, więc pierwszy element ma pozycję 1, nie 0.
  • Wzory typu `odd`, `even` i `-n+3` rozwiązują większość codziennych zadań.
  • Liczy się struktura DOM, a nie to, jak element wygląda po stylowaniu.
  • Jeden dodatkowy wrapper albo ukryty element może przesunąć całą numerację.
  • Gdy rodzic ma mieszane tagi, często lepiej sprawdza się selektor liczony po typie.
  • Nowsza składnia z argumentem `of` pomaga, gdy chcesz liczyć tylko część rodzeństwa.

Jak działa wybieranie według pozycji wśród rodzeństwa

W praktyce ta reguła wybiera element nie po klasie, lecz po miejscu zajmowanym wśród rodzeństwa. Jeśli w kontenerze masz pięć kart, trzy akapity albo dziesięć wierszy tabeli, przeglądarka liczy ich kolejność i dopasowuje styl tylko do tych pozycji, które pasują do wzoru. Ja lubię to rozwiązanie, bo pozwala budować rytm układu bez dokładania technicznych klas do każdego powtarzalnego elementu.

Najważniejszy warunek jest prosty: liczą się tylko elementy mające tego samego rodzica. Gdy do środka dołożysz dodatkowy element opakowujący albo wstawisz między elementy inny tag, numeracja przesuwa się natychmiast. To właśnie dlatego ta reguła jest świetna do list, galerii i tabel, ale wymaga odrobinę dyscypliny w HTML.

MDN zwraca uwagę, że indeksy zaczynają się od 1, więc pierwszy element nie ma pozycji 0. To drobiazg, który oszczędza sporo pomyłek przy pierwszych próbach i dobrze przygotowuje do czytania zapisu An+B.

Żeby używać tego świadomie, trzeba jeszcze umieć rozłożyć wzór na części i zrozumieć, co naprawdę oznacza krok oraz punkt startu.

Jak czytać zapis An+B bez zgadywania

Zapis An+B wygląda matematycznie, ale w CSS da się go czytać bardzo dosłownie: `A` mówi, co ile elementów ma łapać wzór, a `B` określa punkt startu. Gdy raz rozbijesz go na te dwie części, większość przykładów staje się oczywista.

Zapis Co wybiera Najprostszy sens
odd 1, 3, 5, 7... Naprzemienne pasy w listach i tabelach
even 2, 4, 6, 8... Drugi element i każdy kolejny co dwa
7 Tylko siódmy element Jedna konkretna pozycja
n+4 4, 5, 6, 7... Od czwartego elementu dalej
-n+3 1, 2, 3 Pierwsze trzy elementy
3n+1 1, 4, 7, 10... Co trzeci element, licząc od pierwszego

Najprościej myśleć o tym jak o prostym liczniku: start plus krok. Gdy wiesz, od którego miejsca zaczynasz i co ile powtarzasz wybór, reszta to już tylko zapis. Tę logikę najlepiej widać na konkretnych przykładach, bo dopiero wtedy selektor przestaje wyglądać jak wzór z notatnika i zaczyna działać jak narzędzie do porządkowania interfejsu.

Wyjaśnienie selektora :nth-child() w CSS, pokazujące użycie wartości liczbowej, słowa kluczowego i formuły do wyboru elementów.

Przykłady, które najłatwiej pokazują działanie selektora

Najczytelniej widać go na powtarzalnych listach. W poniższym przykładzie parzyste i nieparzyste elementy dostają różne tło, a sama reguła pozostaje krótka i odporna na rozrost HTML.

li:nth-child(odd) {
  background: #f6f7f9;
}

li:nth-child(even) {
  background: #ffffff;
}

Ten sam wzór dobrze działa też na kartach w siatce, akapitach w artykule czy wierszach tabel. Gdy chcę podkreślić kilka pierwszych pozycji, zwykle sięgam po kombinację kroku i ujemnego startu, bo pozwala objąć pierwszy, drugi i trzeci element bez ręcznego dopisywania klas. W praktyce to jeden z tych zapisów, które szybko zaczynają oszczędzać czas przy bardziej rozbudowanych widokach.

Warto też pamiętać, że taki sposób stylowania najlepiej sprawdza się tam, gdzie kolejność elementów ma znaczenie sama w sobie. Jeśli układ ma dużo wyjątków, bardziej opłaca się wrócić do prostszej struktury niż walczyć z coraz dłuższym selektorem.

Właśnie przy wyjątkach najłatwiej o błąd, dlatego następna rzecz, którą zawsze sprawdzam, to wpływ DOM na numerację.

Najczęstsze błędy, które przesuwają numerację

Najczęstszy problem nie leży w samej składni, tylko w strukturze DOM, czyli drzewie dokumentu. Gdy pod rodzicem pojawia się dodatkowy nagłówek, separator albo ukryty element, indeksy zmieniają się i nagle styl trafia w inny wiersz niż zakładałeś.

  • Mylenie kolejności wizualnej z DOM - CSS liczy elementy w strukturze, a nie to, jak układ wygląda po stylowaniu.
  • Zakładanie, że ukryty element „znika” z licznika - jeśli nadal jest w drzewie dokumentu, może wpływać na pozycje sąsiadów.
  • Pomijanie dodatkowego opakowania - jeden nowy wrapper potrafi przesunąć całą serię selektorów.
  • Stylowanie tabel bez sprawdzenia struktury - w praktyce często trzeba uwzględnić `tbody`, bo przeglądarka może go wstawić automatycznie.

Ja zawsze sprawdzam strukturę w narzędziach deweloperskich, zanim uznam regułę za błędną. To zwykle oszczędza czas, bo problemem bywa nie selektor, tylko nieoczekiwany element pośredni. Skoro już wiadomo, gdzie najłatwiej o wpadkę, warto porównać tę technikę z jej najbliższymi odpowiednikami.

Czym różni się od podobnych selektorów

Najwięcej pomyłek bierze się z mylenia tej reguły z innymi selektorami pozycyjnymi. Różnice są niewielkie w zapisie, ale duże w działaniu, dlatego dobrze mieć je obok siebie.

Selektor Co liczy Kiedy użyć
:first-child Pierwszy element wśród wszystkich rodzeństwa Gdy chcesz wyróżnić początek listy
:last-child Ostatni element Gdy ma się różnić końcówka układu
:nth-of-type() Pozycję wśród elementów tego samego typu Gdy rodzeństwo ma różne tagi i chcesz liczyć tylko jeden z nich
:nth-last-child() Pozycję od końca Gdy potrzebujesz ostatnich kilku elementów albo końcówki serii
:only-child Jedyny element u rodzica Gdy chcesz obsłużyć pojedynczy przypadek bez dodatkowych warunków

Najpraktyczniejsza różnica jest taka: selektor liczony po typie bywa bezpieczniejszy, gdy w jednym kontenerze mieszają się nagłówki, akapity, obrazy i linki, a reguła po pozycji ogólnej sprawdza się wtedy, gdy naprawdę interesuje cię cały zestaw rodzeństwa. Jeśli wiem, że struktura będzie się zmieniała, zwykle wybieram prostsze rozwiązanie, bo łatwiej je utrzymać. Gdy jednak potrzebuję filtrować tylko część rodzeństwa, przydaje się nowsza składnia z argumentem `of`.

Kiedy wariant z argumentem of daje lepszy efekt

To jest ten moment, w którym CSS przestaje liczyć wszystko po kolei, a zaczyna liczyć tylko elementy spełniające dodatkowy warunek. W specyfikacji Selectors Level 4 ten mechanizm został opisany właśnie po to, żeby wzory były stabilniejsze przy filtrowaniu, ukrywaniu lub selekcji części rodzeństwa.

tr:nth-last-child(even of :not([hidden])) {
  background: #eef2f6;
}

W praktyce taki zapis ma sens wtedy, gdy część wierszy lub kart bywa ukryta, a ty chcesz zachować czytelny rytm kolorów. Bez tego pas kolorystyczny potrafi się rozjechać, bo liczenie obejmuje także elementy, które użytkownik finalnie nie widzi. To drobna różnica w składni, ale w interfejsie robi zauważalną różnicę.

Ja traktuję ten wariant jako narzędzie do sytuacji, w których zwykłe liczenie przestaje być odporne na zmiany treści. Jeśli elementy są dynamiczne, filtr z `of` pomaga utrzymać porządek bez dokładania skryptu tylko po to, by naprawić estetykę układu.

Jak używać go oszczędnie, żeby CSS pozostał czytelny

Najlepiej traktuję ten mechanizm jako narzędzie do rytmu, a nie do nadrabiania braków w HTML. Jeżeli reguła zaczyna być pełna wyjątków, zwykle lepiej wrócić do prostszej struktury albo dodać klasę, zamiast dokładać kolejne warunki.

  • Używaj prostych wzorów, gdy tylko się da - `odd`, `even` i krótkie zakresy są czytelniejsze niż rozbudowane wyrażenia.
  • Sprawdzaj wpływ dodatkowych elementów - nagłówki, separatory i wrappery potrafią przesunąć numerację.
  • Porównuj z :nth-of-type() - gdy rodzeństwo ma różne tagi, to często lepszy wybór.
  • Nie bój się klas, jeśli reguła opisuje stan, a nie strukturę - CSS strukturalny ma sens wtedy, gdy naprawdę wynika z układu.

Jeśli trzymasz się tej zasady, selektor pozostaje wygodny także w większych projektach: stylujesz układ, a nie walczysz z nim. I właśnie w tym tkwi jego największa wartość - daje porządek tam, gdzie powtarzalność elementów jest częścią projektu, a nie przypadkiem.

FAQ - Najczęstsze pytania

A określa krok, a B punkt startu. `odd` daje 1, 3, 5..., `even` 2, 4, 6..., `-n+3` wybiera pierwsze trzy elementy, a `n+4` zaczyna od czwartego.

Bo ten selektor liczy rzeczywiste rodzeństwo pod tym samym rodzicem, a nie wygląd po stylowaniu. Każdy dodatkowy wrapper, nagłówek albo element pośredni może przesunąć numerację.

Gdy w jednym kontenerze mieszają się różne tagi. `nth-of-type()` liczy tylko elementy tego samego typu, więc bywa bezpieczniejszy przy nagłówkach, akapitach, obrazach i linkach.

Pozwala liczyć tylko elementy spełniające warunek, na przykład tylko niewidoczne nie są brane pod uwagę. To przydatne, gdy część wierszy lub kart jest ukryta i chcesz utrzymać równy rytm kolorów.

Oceń artykuł

Ocena: 0.00 Liczba głosów: 0

Tagi:

dom tabele nth-child nth-of-type pseudo-klasy

Udostępnij artykuł

Kazimierz Ziółkowski

Kazimierz Ziółkowski

Nazywam się Kazimierz Ziółkowski i od 7 lat zajmuję się technologiami, które nieustannie fascynują mnie swoją dynamiką i innowacyjnością. Moje zainteresowanie światem technologii zaczęło się już w młodości, gdy odkryłem, jak wiele możliwości niesie ze sobą cyfrowa rewolucja. Piszę o różnych aspektach technologii, starając się przybliżyć czytelnikom zarówno najnowsze trendy, jak i praktyczne zastosowania codziennych narzędzi. W mojej pracy stawiam na rzetelność i przystępność informacji. Zawsze dokładam starań, aby moje teksty były oparte na wiarygodnych źródłach, a skomplikowane zagadnienia tłumaczone w sposób zrozumiały. Lubię dzielić się wiedzą, pomagając innym zrozumieć, jak technologia może ułatwić życie i jak z niej mądrze korzystać. Moim celem jest dostarczanie aktualnych i użytecznych informacji, które będą inspiracją do dalszego zgłębiania tematu.

Napisz komentarz