Perché: nth-child () in CSS inizia da 1 invece di 0?


15

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)

12
"Gli indici di array dovrebbero iniziare da 0 o 1? Il mio compromesso di 0,5 è stato respinto senza, ho pensato, un'adeguata considerazione." - Stan Kelly-Bootle
Mason Wheeler

1
Dal momento che sospetto che ciò trarrà alcuni voti ravvicinati, lo sto lasciando aperto perché è almeno teoricamente possibile rispondere oggettivamente citando altri esempi di 1-indicizzazione nei CSS e rivendicando coerenza o trovando una dichiarazione pertinente da uno dei le persone che prendono decisioni sugli standard CSS. Non so abbastanza del CSS per farlo da solo, ma fintanto che non votiamo alcuna risposta che renda l'ovvio argomento "è come contano gli umani normali" senza alcuna giustificazione per il motivo per cui tutto il resto è 0-index, allora non c'è nulla di male nel lasciarlo aperto.
Ixrec,

1
@lxrec: Penso che sia un'affermazione secondo cui "tutto il resto è indicizzato 0" che dovrebbe essere giustificato. Non dici la regina Elisabetta Zeroth, il giorno zeroth del Natale, la strada zeroth a sinistra o la parola zeroth sulla pagina.
JacquesB,

@lxrec Nella mia risposta XPath è citato come un precedente per l'indicizzazione basata su 1. Non sono sicuro che sia stato effettivamente un fattore o solo una coincidenza, ma è un altro sistema focalizzato su XML, quindi ha senso.
user949300,

Risposte:


15

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 .



1
sarebbe di aiuto se la tua risposta menzionasse che ritieni che il CSS sia principalmente destinato all'uso da parte di non programmatori (preferibilmente eseguito il backup in qualche modo)
moscerino

1
@gnat C'è qualche punto nella programmazione di un elemento in cui si dice che un bambino è lo zeroth? Poiché il selettore è nth-child, è logico iniziare dal primo.
Sami Kuhmonen,

1
Puoi cancellare tutto tranne l'ultimo paragrafo? Tutto il resto è conoscenza comune su questo SE. "Mentre la maggior parte dei programmatori ...... naturale scegliere l'indicizzazione basata su 1"
0fnt

2
Non sono in disaccordo con la tua risposta, ma molte cose che contiamo non iniziano da 1. Hai 0 anni per il primo anno della tua vita - non inizi da 1. Il giorno non inizia alle 1:00 - inizia alle 0:00 Quando misuro la distanza percorsa da casa mia, inizio da zero. Contare da zero è altrettanto naturale per gli esseri umani come contare da uno - dipende dal contesto, anche se hai ragione che non parleremmo mai del nostro figlio zero :)
Aaron Rasmussen

6

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 ha an+b-1fratelli prima di esso nell'albero del documento, per qualsiasi numero intero positivo o valore zero di n, e ha un elemento padre. Per valori uguali ae bmaggiori di zero, ciò divide efficacemente i figli dell'elemento in gruppi di aelementi (l'ultimo gruppo prende il resto) e seleziona l' belemento 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 valori ae bdevono 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+bdeve totalizzare un numero positivo.

Quando a= 0, non è necessario includere una parte (a meno che la bparte non sia già stata omessa). Quando annon è incluso e bnon è negativo, il segno + prima b(quando consentito) può anche essere omesso. In questo caso la sintassi si semplifica :nth-child(b).

Se entrambi ae bsono uguali a zero, la pseudo-classe non rappresenta alcun elemento nell'albero del documento.

La formattazione aggiuntiva nell'ultimo paragrafo è mia per aggiungere enfasi.


0

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.