Dlaczego: nth-child () w CSS zaczyna się od 1 zamiast 0?

15

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)
użytkownik51349
źródło
12
„Czy indeksy tablicowe powinny zaczynać się od 0 czy 1? Mój kompromis 0,5 został odrzucony bez, jak sądzę, odpowiedniego uwzględnienia.” - Stan Kelly-Bootle
Mason Wheeler
1
Ponieważ podejrzewam, że przyciągnie to kilka bliskich głosów, pozostawiam to otwarte, ponieważ przynajmniej teoretycznie możliwe jest udzielenie obiektywnej odpowiedzi na to pytanie, albo przywołując inne przykłady indeksowania 1 w CSS i domagając się spójności, lub znajdując odpowiednie oświadczenie z jednego z ludzie, którzy faktycznie podejmują decyzję w sprawie standardów CSS. Nie wiem wystarczająco dużo o CSS, aby zrobić to sam, ale dopóki nie głosujemy za żadnymi odpowiedziami, które czynią oczywisty argument „to, jak liczą się normalni ludzie” bez żadnego uzasadnienia, dlaczego wszystko inne jest indeksowane na 0, wtedy nie ma nic złego w pozostawieniu tego otwartego.
Ixrec
1
@lxrec: Myślę, że twierdzenie, iż „wszystko inne jest indeksowane według 0”, powinno być uzasadnione. Nie mówisz, że Królowa Elżbieta Zeroth, zerowy dzień Bożego Narodzenia, zerowa ulica po lewej lub zerowe słowo na stronie.
JacquesB
@lxrec W mojej odpowiedzi XPath jest cytowany jako precedens dla indeksowania 1. Nie jestem pewien, czy to rzeczywiście był czynnik, czy tylko zbieg okoliczności, ale to kolejny system skoncentrowany na XML, więc ma sens.
user949300,

Odpowiedzi:

15

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 .

JacquesB
źródło
1
pomogłoby to, gdybyś w odpowiedzi wspomniał, że uważasz, że CSS jest przeznaczony przede wszystkim do użytku przez programistów (najlepiej w jakiś sposób utworzonych kopii zapasowych)
komnata
1
@gnat Czy jest coś w programowaniu dowolnego elementu, w którym mówi się, że dziecko to zero? Ponieważ selektor jest n-dzieckiem, logiczne jest, aby zacząć od pierwszego.
Sami Kuhmonen
1
Czy możesz usunąć wszystko oprócz ostatniego akapitu? Cała reszta jest powszechnie znana na temat tego SE. „Podczas gdy większość programistów ...... naturalnie wybiera indeksowanie 1”
0
2
Nie zgadzam się z twoją odpowiedzią, ale wiele rzeczy, które liczymy, nie zaczyna się od 1. Masz 0 lat w pierwszym roku życia - nie zaczynasz od 1. Dzień się nie zaczyna o 1:00 - zaczyna się o 0:00 Kiedy mierzę odległość przebytą z mojego domu, zaczynam od zera. Liczenie od zera jest tak samo naturalne dla ludzi jak liczenie od jednego - zależy to od kontekstu, chociaż masz rację, że nigdy nie rozmawialibyśmy o naszym dziecku zeroeth :)
Aaron Rasmussen
6

Ze specyfikacji selektora poziomu 3 CSS :

6.6.5.2. : pseudoklasa nth-child ()

:nth-child(an+b)Notacji pseudo-klasa reprezentuje element, który ma an+b-1rodzeństwo przed nim w drzewie dokumentu, dla każdej liczby całkowitej dodatniej lub zerowej wartości ni ma elementu nadrzędnego. W przypadku wartości równych ai bwiększych od zera skutecznie dzieli to dzieci elementu na grupy aelementów (ostatnia grupa bierze resztę) i wybiera bth 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ści ai bmuszą 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+bmoszczu sumuje się do liczby dodatniej.

Gdy a= 0, część nie musi być dołączana (chyba że bczęść została już pominięta). Gdy annie jest uwzględniony i bnie jest ujemny, znak + przed b(jeśli jest dozwolony) może być również pominięty. W takim przypadku składnia upraszcza się :nth-child(b).

Jeśli oba ai bsą równe zeru, to pseudo-klasa reprezentuje żadnego elementu w drzewie dokumentu.

Dodatkowe formatowanie w ostatnim akapicie jest moje, aby podkreślić.

Adam Zuckerman
źródło
0

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..."

użytkownik949300
źródło