Dlaczego: nth-child () dokonuje iteracji z jednego zamiast zera?
Jak pokazano w tym przykładzie . Dlaczego wybiera pierwszy element, a nie drugi kiedy
p :nth-child(1)
Dlaczego: nth-child () dokonuje iteracji z jednego zamiast zera?
Jak pokazano w tym przykładzie . Dlaczego wybiera pierwszy element, a nie drugi kiedy
p :nth-child(1)
Odpowiedzi:
Jeśli policzysz własne dzieci, powiedziałbyś „moje pierwsze dziecko”, „moje drugie dziecko” i tak dalej, a nie „moje dziecko zerowe”. Tak po prostu liczą się ludzie. (Uwaga: to nie jest jakaś subiektywna opinia. Tak dosłownie działają liczby porządkowe .)
Powodem, dla którego zadajesz to pytanie, jest prawdopodobnie to, że jesteś programistą, a wiele języków programowania indeksuje tablicę i elementy listy od 0. Powodem tego jest to, że w językach niskiego poziomu, takich jak C, tablica jest naprawdę wskaźnikiem do adresu pamięci pierwszego elementu i indeksu jest przesunięciem względem tego wskaźnika. array[0]
Oznacza więc adres pierwszego elementu, array[1]
oznacza adres pierwszego elementu plus rozmiar 1 elementu, tj. Drugiego elementu i tak dalej.
Wiele języków wyższego poziomu, które nie obsługują arytmetyki wskaźników, zachowało indeksowanie oparte na 0 dla spójności i znajomości. Na przykład wszystkie języki ze składnią pochodną C - w tym JavaScript, mimo że tablice w JavaScript są implementowane w zupełnie inny sposób. Ale to wcale nie jest uniwersalne - języki takie jak COBOL, Fortran, Lua i niektóre podstawowe używają indeksowania opartego na 1. (Visual Basic naturalnie wybrał najgorsze z obu światów, umożliwiając jego konfigurację). Więc zdecydowanie nie jest tak, jak w każdym innym języku używającym indeksowania opartego na 0. Dla swojej wartości XPath i XQuery używają również indeksowania 1.
Podczas gdy większość programistów będzie zaznajomiona z indeksowaniem opartym na 1 i 0, normalni ludzie naturalnie będą liczyć od 1, a CSS jest językiem zaprojektowanym nie tylko dla programistów, ale także dla projektantów i grafików, więc naturalne jest wybranie indeksowania opartego na 1 .
Ze specyfikacji selektora poziomu 3 CSS :
6.6.5.2. : pseudoklasa nth-child ()
:nth-child(an+b)
Notacji pseudo-klasa reprezentuje element, który maan+b-1
rodzeństwo przed nim w drzewie dokumentu, dla każdej liczby całkowitej dodatniej lub zerowej wartościn
i ma elementu nadrzędnego. W przypadku wartości równycha
ib
większych od zera skutecznie dzieli to dzieci elementu na grupya
elementów (ostatnia grupa bierze resztę) i wybierab
th element każdej grupy. Na przykład pozwala to selektorom na adresowanie każdego innego wiersza w tabeli i może być użyte do zmiany koloru tekstu akapitu w cyklu czterech. Wartościa
ib
muszą być liczbami całkowitymi (dodatnimi, ujemnymi lub zerowymi). Indeks pierwszego elementu potomnego elementu wynosi 1.
Wchodzi w dużo bardziej szczegółowe przykłady. Wydaje się, że ostateczne obliczenie an+b
moszczu sumuje się do liczby dodatniej.
Gdy
a
= 0, część nie musi być dołączana (chyba żeb
część została już pominięta). Gdyan
nie jest uwzględniony ib
nie jest ujemny, znak + przedb
(jeśli jest dozwolony) może być również pominięty. W takim przypadku składnia upraszcza się:nth-child(b)
.Jeśli oba
a
ib
są równe zeru, to pseudo-klasa reprezentuje żadnego elementu w drzewie dokumentu.
Dodatkowe formatowanie w ostatnim akapicie jest moje, aby podkreślić.
Prawdopodobnie dla spójności z XPath, innym językiem przetwarzania XML / HTML. Co nasuwa pytanie, dlaczego XPath używa indeksowania opartego na 1?
Zobacz /programming/3319341/why-do-indexes-in-xpath-start-with-1-and-not-0
Odpowiedni (ale kontrowersyjny cytat) to:
„... logika oparta na 1 była właściwym wyborem dla XPath i XSLT ... ponieważ język został zaprojektowany dla użytkowników, a nie dla programistów, a użytkownicy nadal mają ten staromodny nawyk odwoływania się do pierwszego rozdziału książki jako Rozdział pierwszy..."