Почему: nth-child () в CSS начинается с 1 вместо 0?


15

Почему: nth-child () выполняет итерацию с единицы вместо нуля?

Как показано в этом примере . Почему он выбирает первый элемент, а не второй, когда

p :nth-child(1)

12
«Должны ли индексы массива начинаться с 0 или 1? Мой компромисс в 0,5 был отклонен без надлежащего рассмотрения». - Стэн Келли-Бутл
Мейсон Уилер

1
Поскольку я подозреваю, что это соберет несколько близких голосов, я оставляю это открытым, потому что по крайней мере теоретически возможно ответить на это объективно, либо приведя другие примеры 1-индексации в CSS и заявив о согласованности, либо найдя соответствующее утверждение от одного из люди, которые на самом деле принимает решение по стандартам CSS. Я не знаю почти достаточно о CSS, чтобы сделать это сам, но пока мы не приводим никаких ответов, которые приводят очевидный аргумент «это то, как нормальные люди считают» без какого-либо обоснования того, почему все остальное индексируется 0, тогда нет ничего плохого в том, чтобы оставить это открытым.
Ixrec

1
@lxrec: Я думаю, это утверждение, что «все остальное 0-проиндексировано», что должно быть оправдано. Вы не говорите «Королева Елизавета Зерот», «Нулевой день Рождества», «Нулевая улица слева» или «Нулевое слово на странице».
JacquesB

@lxrec В моем ответе XPath упоминается как прецедент для индексации на основе 1. Не уверен, действительно ли это был фактор или просто совпадение, но это другая сфокусированная на XML система, поэтому она имеет смысл.
user949300

Ответы:


15

Если вы считаете своих детей, вы говорите «мой первый ребенок», «мой второй ребенок» и т. Д., А не «мой нулевой ребенок». Это просто, как люди считают. (Примечание: это не мое субъективное мнение. Это буквально, как работают порядковые числа .)

Причина, по которой вы даже задаете вопрос, вероятно, заключается в том, что вы программист, и многие языки программирования индексируют массив и элементы списка от 0. Причина в том, что в языках низкого уровня, таких как C, массив действительно является указателем на адрес памяти первого элемента и индекс является смещением относительно этого указателя. Таким образом, array[0]означает адрес первого элемента, array[1]означает адрес первого элемента плюс размер 1 элемента, то есть второго элемента и так далее.

Многие языки более высокого уровня, которые напрямую не поддерживают арифметику указателей, сохранили индексирование на основе 0 для согласованности и знакомства. Например, все языки с синтаксисом, производным от C, включая JavaScript, хотя массивы в JavaScript реализованы совершенно по-другому. Но это вовсе не универсально - языки, такие как COBOL, Fortran, Lua и некоторые Basic, используют индексирование на основе 1. (Visual Basic, естественно, выбрал худшее из обоих миров, сделав его настраиваемым.) Таким образом, он определенно не похож на любой другой язык, использующий индексацию на основе 0. Для чего стоит XPath и XQuery также используют индексирование на основе 1.

В то время как большинство программистов знакомы с индексированием на основе 1 и 0, нормальные люди, естественно, будут считать от 1, а CSS - это язык, разработанный не только для программистов, но и для дизайнеров и специалистов по графике, поэтому естественно выбрать индексирование на основе 1 ,



1
было бы полезно, если бы в вашем ответе упоминалось, что вы считаете, что CSS в первую очередь предназначен для использования непрограммистами (желательно с резервным копированием)
gnat

1
@gnat Есть ли где-нибудь в программировании какой-либо предмет, где ребенок считается нулевым? Поскольку селектор является nth-child, логично начать с первого.
Сами Кухмонен

1
Можете ли вы удалить все, кроме последнего абзаца? Все остальное общеизвестно на этом SE. «В то время как большинство программистов ...... естественно выбрать индексирование на основе 1»
0

2
Я не согласен с вашим ответом, но многие вещи, которые мы считаем, не начинаются с 1. Вам 0 лет в течение первого года вашей жизни - вы не начинаете с 1. День не начинается в 1:00 утра - начинается в 0:00 утра. Когда я измеряю расстояние, пройденное от моего дома, я начинаю с нуля. Подсчет с нуля столь же естественен для человека, как и подсчет с одного - это зависит от контекста, хотя вы правы, что мы никогда не будем говорить о нашем нулевом ребенке :)
Аарон Расмуссен

6

Из спецификации селектора уровня 3 CSS :

6.6.5.2. : nth-child () псевдокласс

:nth-child(an+b)Псевдо-класс обозначение представляет собой элемент , который имеет an+b-1брат и сестра перед этим в дереве документа, для любого положительного целого числа или нулевого значения n, и имеет родительский элемент. Для значений aи bбольше нуля это эффективно делит дочерние aэлементы на группы элементов (последняя группа берет остаток) и выбирает bth-й элемент каждой группы. Например, это позволяет селекторам обращаться к каждой строке в таблице и может использоваться для чередования цвета текста абзаца в цикле из четырех. Значения aи bдолжны быть целыми числами (положительными, отрицательными или нулевыми). Индекс первого дочернего элемента равен 1.

Это входит в гораздо более подробно с примерами. Похоже, что окончательный расчет an+bдолжен составить положительное число.

Когда a= 0, часть не должна быть включена (если bчасть уже не опущена). Если anне включено и bнеотрицательно, знак + перед b(когда это разрешено) также может быть опущен. В этом случае синтаксис упрощается до :nth-child(b).

Если оба aи bравны нулю, псевдокласс не представляет элемента в дереве документа.

Дополнительное форматирование в последнем абзаце мое, чтобы добавить акцент.


0

Вероятно, для совместимости с XPath, другим языком обработки XML / HTML. Возникает вопрос: почему XPath использует индексирование на основе 1?

См. Https://stackoverflow.com/questions/3319341/why-do-indexes-in-xpath-start-with-1-and-not-0

Соответствующая (но спорная цитата):

«... логика на основе 1 была правильным выбором для XPath и XSLT ... потому что язык был разработан для пользователей, а не для программистов, и у пользователей все еще есть эта старомодная привычка ссылаться на первую главу книги как Глава Один..."

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.