Perché: nth-child () scorre da uno invece di zero?
Come mostrato in questo esempio . Perché seleziona il primo elemento e non il secondo quando
p :nth-child(1)
Perché: nth-child () scorre da uno invece di zero?
Come mostrato in questo esempio . Perché seleziona il primo elemento e non il secondo quando
p :nth-child(1)
Risposte:
Se conti i tuoi figli, diresti "il mio primo figlio", "il mio secondo figlio" e così via, non "il mio figlio Zeroth". Questo è semplicemente il modo in cui gli umani contano. (Nota: questa non è un'opinione soggettiva da parte mia. Questo è letteralmente come funzionano i numeri ordinali .)
Il motivo per cui fai anche la domanda è probabilmente perché sei un programmatore e molti linguaggi di programmazione indicizzano gli array e elencano gli elementi da 0. Il motivo di ciò è che in linguaggi di basso livello come C, un array è davvero un puntatore all'indirizzo di memoria del primo elemento e l'indice è un offset relativo a questo puntatore. Quindi array[0]
significa indirizzo del primo articolo, array[1]
indica l'indirizzo del primo articolo più la dimensione di 1 articolo, ovvero il secondo articolo e così via.
Molti linguaggi di livello superiore che non supportano direttamente l'aritmetica del puntatore hanno conservato l'indicizzazione basata su 0 per coerenza e familiarità. Ad esempio tutti i linguaggi con sintassi derivata dal C, incluso JavaScript, anche se gli array in JavaScript sono implementati in un modo completamente diverso. Ma questo non è affatto universale - linguaggi come COBOL, Fortran, Lua e alcuni di base usano l'indicizzazione basata su 1. (Visual Basic ha naturalmente scelto il peggio di entrambi i mondi rendendolo configurabile.) Quindi non è assolutamente come ogni altra lingua usa l'indicizzazione basata su 0. Per quello che vale, XPath e XQuery usano anche l'indicizzazione basata su 1.
Mentre la maggior parte dei programmatori avrà familiarità con l'indicizzazione basata su 1 e 0, le persone normali contano naturalmente da 1 e CSS è un linguaggio progettato non solo per i programmatori ma per i progettisti e i professionisti della grafica, quindi è naturale scegliere l'indicizzazione basata su 1 .
Dalla specifica del selettore CSS livello 3 :
6.6.5.2. : pseudo-classe nth-child ()
La
:nth-child(an+b)
notazione di pseudo-classe rappresenta un elemento che haan+b-1
fratelli prima di esso nell'albero del documento, per qualsiasi numero intero positivo o valore zero din
, e ha un elemento padre. Per valori ugualia
eb
maggiori di zero, ciò divide efficacemente i figli dell'elemento in gruppi dia
elementi (l'ultimo gruppo prende il resto) e seleziona l'b
elemento th di ciascun gruppo. Ad esempio, ciò consente ai selettori di indirizzare ogni altra riga in una tabella e potrebbe essere utilizzato per alternare il colore del testo del paragrafo in un ciclo di quattro. I valoria
eb
devono essere numeri interi (positivi, negativi o zero). L'indice del primo figlio di un elemento è 1.
Entra in molti più dettagli con esempi. Sembra che il calcolo finale di an+b
deve totalizzare un numero positivo.
Quando
a
= 0, non è necessario includere una parte (a meno che lab
parte non sia già stata omessa). Quandoan
non è incluso eb
non è negativo, il segno + primab
(quando consentito) può anche essere omesso. In questo caso la sintassi si semplifica:nth-child(b)
.Se entrambi
a
eb
sono uguali a zero, la pseudo-classe non rappresenta alcun elemento nell'albero del documento.
La formattazione aggiuntiva nell'ultimo paragrafo è mia per aggiungere enfasi.
Probabilmente per coerenza con XPath, un altro linguaggio di elaborazione XML / HTML. Il che pone la domanda, perché XPath utilizza l'indicizzazione basata su 1?
Vedi /programming/3319341/why-do-indexes-in-xpath-start-with-1-and-not-0
La citazione pertinente (ma controversa) è:
"... la logica basata su 1 era la scelta giusta per XPath e XSLT ... perché il linguaggio era progettato per gli utenti, non per i programmatori, e gli utenti hanno ancora questa abitudine all'antica di riferirsi al primo capitolo di un libro come Capitolo primo..."