¿Por qué: nth-child () itera desde uno en lugar de cero?
Como se muestra en este ejemplo . ¿Por qué selecciona el primer elemento y no el segundo cuando
p :nth-child(1)
¿Por qué: nth-child () itera desde uno en lugar de cero?
Como se muestra en este ejemplo . ¿Por qué selecciona el primer elemento y no el segundo cuando
p :nth-child(1)
Respuestas:
Si cuenta a sus propios hijos, diría "mi primer hijo", "mi segundo hijo" y así sucesivamente, no "mi hijo zeroth". Así es simplemente como los humanos cuentan. (Nota: esta no es una opinión subjetiva de mi parte. Así es literalmente cómo funcionan los números ordinales ).
La razón por la que incluso hace la pregunta es probablemente porque es un programador, y muchos lenguajes de programación indexan la matriz y enumeran elementos desde 0. La razón de esto es que en lenguajes de bajo nivel como C, una matriz es realmente un puntero a la dirección de memoria del primer elemento y el índice es un desplazamiento relativo a este puntero. Entonces, array[0]
significa la dirección del primer elemento, array[1]
significa la dirección del primer elemento más el tamaño de 1 elemento, es decir, el segundo elemento, etc.
Muchos lenguajes de nivel superior que no admiten la aritmética de punteros han retenido directamente la indexación basada en 0 por coherencia y familiaridad. Por ejemplo, todos los lenguajes con sintaxis derivada de C, incluido JavaScript, aunque las matrices en JavaScript se implementan de una manera completamente diferente. Pero esto no es del todo universal: los lenguajes como COBOL, Fortran, Lua y algunos Basic utilizan la indexación basada en 1. (Visual Basic, naturalmente, eligió lo peor de ambos mundos al hacerlo configurable). Por lo tanto, definitivamente no es como cualquier otro idioma usar indexación basada en 0. Por lo que vale, XPath y XQuery también usan indexación basada en 1.
Si bien la mayoría de los programadores estarán familiarizados con la indexación basada en 1 y 0, las personas normales contarán naturalmente desde 1, y CSS es un lenguaje diseñado no solo para programadores sino también para diseñadores y profesionales gráficos, por lo que es natural elegir la indexación basada en 1 .
De la especificación del selector de nivel 3 de CSS :
6.6.5.2. : pseudo-clase nth-child ()
La
:nth-child(an+b)
notación de pseudo-clase representa un elemento que tienean+b-1
hermanos antes en el árbol del documento, para cualquier entero positivo o valor cero den
, y tiene un elemento padre. Para valores dea
yb
mayores que cero, esto divide efectivamente a los elementos secundarios del elemento en grupos dea
elementos (el último grupo toma el resto) y selecciona elb
elemento th de cada grupo. Por ejemplo, esto permite que los selectores se dirijan a cualquier otra fila de una tabla, y podrían usarse para alternar el color del texto del párrafo en un ciclo de cuatro. Los valoresa
yb
deben ser enteros (positivo, negativo o cero). El índice del primer hijo de un elemento es 1.
Entra en muchos más detalles con ejemplos. Parece ser que el cálculo final de an+b
debe totalizar a un número positivo.
Cuando
a
= 0, no es necesario incluir una parte (a menos que lab
parte ya se haya omitido). Cuandoan
no está incluido yb
no es negativo, el signo + antesb
(cuando está permitido) también puede omitirse. En este caso, la sintaxis se simplifica a:nth-child(b)
.Si ambos
a
yb
son iguales a cero, la pseudoclase no representa ningún elemento en el árbol del documento.
El formato adicional en el último párrafo es mío para agregar énfasis.
Probablemente por coherencia con XPath, otro lenguaje de procesamiento XML / HTML. Lo que plantea la pregunta, ¿por qué XPath utiliza la indexación basada en 1?
Ver /programming/3319341/why-do-indexes-in-xpath-start-with-1-and-not-0
La cita relevante (pero controvertida) es:
"... la lógica basada en 1 fue la elección correcta para XPath y XSLT ... porque el lenguaje fue diseñado para usuarios, no para programadores, y los usuarios todavía tienen este hábito anticuado de referirse al primer capítulo de un libro como Capítulo uno..."