Почему: nth-child () выполняет итерацию с единицы вместо нуля?
Как показано в этом примере . Почему он выбирает первый элемент, а не второй, когда
p :nth-child(1)
Почему: nth-child () выполняет итерацию с единицы вместо нуля?
Как показано в этом примере . Почему он выбирает первый элемент, а не второй, когда
p :nth-child(1)
Ответы:
Если вы считаете своих детей, вы говорите «мой первый ребенок», «мой второй ребенок» и т. Д., А не «мой нулевой ребенок». Это просто, как люди считают. (Примечание: это не мое субъективное мнение. Это буквально, как работают порядковые числа .)
Причина, по которой вы даже задаете вопрос, вероятно, заключается в том, что вы программист, и многие языки программирования индексируют массив и элементы списка от 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 ,
Из спецификации селектора уровня 3 CSS :
6.6.5.2. : nth-child () псевдокласс
:nth-child(an+b)
Псевдо-класс обозначение представляет собой элемент , который имеетan+b-1
брат и сестра перед этим в дереве документа, для любого положительного целого числа или нулевого значенияn
, и имеет родительский элемент. Для значенийa
иb
больше нуля это эффективно делит дочерниеa
элементы на группы элементов (последняя группа берет остаток) и выбираетb
th-й элемент каждой группы. Например, это позволяет селекторам обращаться к каждой строке в таблице и может использоваться для чередования цвета текста абзаца в цикле из четырех. Значенияa
иb
должны быть целыми числами (положительными, отрицательными или нулевыми). Индекс первого дочернего элемента равен 1.
Это входит в гораздо более подробно с примерами. Похоже, что окончательный расчет an+b
должен составить положительное число.
Когда
a
= 0, часть не должна быть включена (еслиb
часть уже не опущена). Еслиan
не включено иb
неотрицательно, знак + передb
(когда это разрешено) также может быть опущен. В этом случае синтаксис упрощается до:nth-child(b)
.Если оба
a
иb
равны нулю, псевдокласс не представляет элемента в дереве документа.
Дополнительное форматирование в последнем абзаце мое, чтобы добавить акцент.
Вероятно, для совместимости с XPath, другим языком обработки XML / HTML. Возникает вопрос: почему XPath использует индексирование на основе 1?
См. Https://stackoverflow.com/questions/3319341/why-do-indexes-in-xpath-start-with-1-and-not-0
Соответствующая (но спорная цитата):
«... логика на основе 1 была правильным выбором для XPath и XSLT ... потому что язык был разработан для пользователей, а не для программистов, и у пользователей все еще есть эта старомодная привычка ссылаться на первую главу книги как Глава Один..."