Por que: nth-child () itera de um em vez de zero?
Como mostrado neste exemplo . Por que ele seleciona o primeiro elemento e não o segundo quando
p :nth-child(1)
Por que: nth-child () itera de um em vez de zero?
Como mostrado neste exemplo . Por que ele seleciona o primeiro elemento e não o segundo quando
p :nth-child(1)
Respostas:
Se você contar seus próprios filhos, diria "meu primeiro filho", "meu segundo filho" e assim por diante, não "meu filho zeroth". É assim que os humanos contam. (Nota: esta não é uma opinião subjetiva minha. É literalmente como os números ordinais funcionam.)
O motivo pelo qual você faz a pergunta é provavelmente porque você é um programador, e muitas linguagens de programação indexam itens de matriz e lista de 0. O motivo é que, em linguagens de baixo nível como C, uma matriz é realmente um ponteiro para o endereço de memória do primeiro item e o índice é um deslocamento em relação a esse ponteiro. Então array[0]
significa endereço do primeiro item, array[1]
significa endereço do primeiro item mais o tamanho de 1 item, ou seja, o segundo item e assim por diante.
Muitos idiomas de nível superior que não oferecem suporte à aritmética de ponteiros mantiveram a indexação baseada em 0 para consistência e familiaridade. Por exemplo, todos os idiomas com sintaxe derivada de C - incluindo JavaScript, mesmo que as matrizes em JavaScript sejam implementadas de uma maneira completamente diferente. Mas isso não é universal - linguagens como COBOL, Fortran, Lua e alguns do Basic usam indexação baseada em 1. (O Visual Basic naturalmente escolheu o pior dos dois mundos, tornando-o configurável.) Portanto, definitivamente não é como todos os outros idiomas que usam indexação baseada em 0. Quanto vale, XPath e XQuery também usam indexação baseada em 1.
Embora a maioria dos programadores esteja familiarizada com a indexação baseada em 1 e 0, as pessoas normais contam naturalmente a partir de 1, e o CSS é uma linguagem projetada não apenas para programadores, mas também para designers e profissionais gráficos, por isso é natural escolher a indexação baseada em 1. .
Na especificação do seletor de nível 3 do CSS :
6.6.5.2 : pseudo classe nth-child ()
A
:nth-child(an+b)
notação de pseudo-classe representa um elemento que possuian+b-1
irmãos à frente na árvore de documentos, para qualquer número inteiro positivo ou valor zero igual an
, e possui um elemento pai. Para valores dea
eb
superior a zero, este divide eficazmente as crianças do elemento em grupos dea
elementos (o último grupo restante tomando a), e seleccionando ob
elemento po de cada grupo. Por exemplo, isso permite que os seletores tratem todas as outras linhas de uma tabela e podem ser usados para alternar a cor do texto do parágrafo em um ciclo de quatro. Os valoresa
eb
devem ser números inteiros (positivo, negativo ou zero). O índice do primeiro filho de um elemento é 1.
Ele entra em muito mais detalhes com exemplos. Parece que o cálculo final de an+b
deve totalizar um número positivo.
Quando
a
= 0, a peça a não precisa ser incluída (a menos que ab
peça já esteja omitida). Quandoan
não está incluído eb
não é negativo, o sinal + antesb
(quando permitido) também pode ser omitido. Nesse caso, a sintaxe simplifica para:nth-child(b)
.Se ambos
a
eb
forem iguais a zero, a pseudo-classe não representa nenhum elemento na árvore de documentos.
Formatação adicional no último parágrafo é minha para adicionar ênfase.
Provavelmente por consistência com o XPath, outra linguagem de processamento XML / HTML. O que sugere a pergunta: por que o XPath usa a indexação baseada em 1?
Consulte /programming/3319341/why-do-indexes-in-xpath-start-with-1-and-not-0
A relevante (mas controversa citação) é:
"... a lógica baseada em 1 foi a escolha certa para XPath e XSLT ... porque a linguagem foi projetada para usuários, não para programadores, e os usuários ainda têm esse hábito antiquado de se referir ao primeiro capítulo de um livro como Capítulo um..."