Чому nth-child () у CSS починається з 1 замість 0?


15

Чому: nth-дитина () повторюється з одного замість нуля?

Як показано в цьому прикладі . Чому він вибирає перший елемент, а не другий, коли

p :nth-child(1)

12
"Чи повинні індекси масиву починатися з 0 або 1? Мій компроміс 0,5 був відхилений без, я вважав, належного розгляду." - Стен Келлі-Бутл
Мейсон Вілер

1
Оскільки я підозрюю, що це призведе до кількох близьких голосів, я залишаю це відкритим, тому що принаймні теоретично можна відповісти на це об'єктивно, цитуючи інші приклади 1-індексації в CSS і заявляючи про послідовність, або знаходячи відповідне твердження одного з люди, які насправді приймають рішення щодо стандартів CSS. Я не знаю майже достатньо про CSS, щоб зробити це самостійно, але поки ми не оприлюднимо жодних відповідей, які дають очевидний аргумент "це, як нормальні люди рахують", без будь-якого обґрунтування того, чому все інше є 0-індексованим, тоді немає жодної шкоди, залишаючи це відкритим.
Іхрек

1
@lxrec: Я думаю, що це твердження, що "все інше є 0-індексом", що має бути виправданим. Ви не кажете королеву Єлизавету Зеротну, нульовий день Різдва, нульову вулицю зліва або нулеве слово на сторінці.
ЖакБ

@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 Чи є в програмуванні будь-який предмет, де дитина, як кажуть, дорівнює нулю? Оскільки селектор є n-дитиною, логічно починати спочатку.
Самі Кухмонен

1
Чи можете ви видалити все, крім останнього абзацу? Все інше є загальновідомим на цьому ПП. "У той час як більшість програмістів ...... природно вибирати індексацію на основі"
0fnt

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

6

З специфікації селектора CSS рівня 3 :

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?

Побачити /programming/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.