Wstępnie filtruje zestaw elementów podrzędnych przed zastosowaniem do niego logiki An+B.
Selektory pseudoklas :nth-child() i :nth-last-child()
Za pomocą pseudoklasy :nth-child() można wybierać elementy w DOM według ich indeksu. Za pomocą An+Bmikroskładni możesz precyzyjnie określić, które elementy chcesz wybrać.
:nth-child(2): wybierz drugie dziecko.:nth-child(2n): Wybierz wszystkie parzyste elementy podrzędne (2, 4, 6, 8 itd.).:nth-child(2n+1): wybierz wszystkie nieparzyste elementy podrzędne (1., 3., 5., 7. itd.).:nth-child(5n+1): wybierz 1. (=(5×0)+1), 6. (=(5×1)+1), 11. (=(5×2)+1), … element podrzędny.:nth-child(5n+2): Wybierz 2. (=(5×0)+2), 7. (=(5×1)+2), 12. (=(5×2)+2), … element podrzędny.
Jeśli jednak pominiesz parametr A, możesz dokonać bardziej kreatywnych wyborów. Na przykład:
:nth-child(n+3): Wybierz wszystkie elementy podrzędne od trzeciego w kolejności (3., 4., 5. itd.).:nth-child(-n+5): wybierz każde dziecko do 5. włącznie (1., 2., 3., 4., 5.).
Połącz kilka z tych :nth-child() wyborów, aby wybrać zakresy elementów:
:nth-child(n+3):nth-child(-n+5): wybierz wszystkie elementy podrzędne od 3 do 5 (3, 4, 5).
Za pomocą :nth-last-child() możesz dokonywać podobnych wyborów, ale zamiast liczyć od początku, zaczynasz liczyć od końca.
Wstępne filtrowanie za pomocą składni of S
Nowością w selektorach CSS poziomu 4 jest możliwość opcjonalnego przekazywania listy selektorów do funkcji :nth-child() i :nth-last-child().
:nth-child(An+B [of S]?)
:nth-last-child(An+B [of S]?)
Jeśli podasz wartość of S, logika An+B będzie stosowana tylko do elementów pasujących do podanej listy selektorów S. Oznacza to, że możesz wstępnie odfiltrować dzieci, zanim An+B wykona swoje zadanie.
Browser Support
Przykłady
Na przykład :nth-child(2 of .highlight) wybiera drugi pasujący element, który ma klasę .highlight. Inaczej mówiąc: spośród wszystkich elementów podrzędnych klasy .highlight wybierz drugi.
W przeciwieństwie do selektora .highlight:nth-child(2), który wybiera element z klasą .highlight i będący drugim elementem podrzędnym.
Różnicę tę widać w poniższej wersji demonstracyjnej:
- Element pasujący do
:nth-child(2 of .highlight)ma różowy kontur. - Element pasujący do
.highlight:nth-child(2)ma zielone obramowanie.
Pamiętaj, że S to lista selektorów, co oznacza, że akceptuje wiele selektorów rozdzielonych przecinkami. Na przykład :nth-child(4 of .highlight, .sale) wybiera czwarty element, który jest elementem .highlight lub .sale w zbiorze elementów równorzędnych.
W poniższej wersji demonstracyjnej element pasujący do :nth-child(4 of .highlight, .sale) ma pomarańczowy kontur.
Ponowne spojrzenie na wzór zebry
Klasycznym przykładem użycia kodu :nth-child() jest tworzenie tabeli w paski. Jest to technika wizualna, w której każdy wiersz tabeli ma inny kolor. Zwykle wygląda to tak:
tr:nth-child(even) {
background-color: lightgrey;
}
W przypadku tabel statycznych to rozwiązanie działa dobrze, ale staje się problematyczne, gdy zaczynasz dynamicznie filtrować zawartość tabeli. Jeśli np. wiersz 2 zostanie ukryty, wiersze 1 i 3 będą widoczne i będą miały ten sam kolor tła.
Aby to naprawić, możemy skorzystać z funkcji :nth-child(An+B [of S]?), wykluczając ukryte wiersze z logiki An+B:
tr:nth-child(even of :not([hidden])) {
background-color: lightgrey;
}
Całkiem fajnie, prawda?
Zdjęcie: Markus Spiske, Unsplash