¿Por qué: nth-child () en CSS comienza desde 1 en lugar de 0?

15

¿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)
usuario51349
fuente
12
"¿Deberían los índices de matriz comenzar en 0 o 1? Mi compromiso de 0.5 fue rechazado sin la consideración adecuada", pensé. - Stan Kelly-Bootle
Mason Wheeler
1
Como sospecho que esto generará algunos votos cerrados, lo dejo abierto porque es al menos teóricamente posible responder esto objetivamente ya sea citando otros ejemplos de indexación 1 en CSS y reclamando consistencia, o encontrando una declaración relevante de uno de las personas que realmente toman la decisión de los estándares CSS. No sé lo suficiente sobre CSS como para hacerlo yo mismo, pero siempre y cuando no votemos por ninguna respuesta que haga el obvio argumento de "cómo los humanos normales cuentan" sin ninguna justificación de por qué todo lo demás está indexado a 0, entonces no hay daño en dejar esto abierto.
Ixrec
1
@lxrec: Creo que es una afirmación de que "todo lo demás está indexado en 0", lo que debería estar justificado. No dices la reina Isabel Zeroth, el día zeroth de Navidad, la calle zeroth a la izquierda o la palabra zeroth en la página.
JacquesB
@lxrec En mi respuesta, XPath se cita como un precedente para la indexación basada en 1. No estoy seguro de si realmente fue un factor, o simplemente una coincidencia, pero es otro sistema centrado en XML, por lo que tiene sentido.
user949300

Respuestas:

15

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 .

JacquesB
fuente
1
que ayudaría si su mención respuesta que usted cree CSS está destinado principalmente para su uso por los no programadores (preferiblemente una copia de seguridad de alguna manera)
mosquito
1
@gnat ¿Hay algún lugar en la programación de algún elemento donde se dice que un niño es el cero? Como el selector es nth-child, es lógico comenzar desde el principio.
Sami Kuhmonen
1
¿Puedes borrar todo excepto el último párrafo? Todo lo demás es de conocimiento común en este SE. "Mientras que la mayoría de los programadores ... es natural elegir una indexación basada en 1"
0fnt
2
No estoy en desacuerdo con tu respuesta, pero muchas cosas que contamos no comienzan en 1. Tienes 0 años durante el primer año de tu vida, no comienzas en 1. El día no comienza a la 1:00 am - comienza a las 0:00 am Cuando mido la distancia recorrida desde mi casa, comienzo a cero. Contar desde cero es tan natural para los seres humanos como contar desde uno: depende del contexto, aunque tienes razón en que nunca hablaríamos de nuestro hijo número cero :)
Aaron Rasmussen
6

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 tiene an+b-1hermanos antes en el árbol del documento, para cualquier entero positivo o valor cero de n, y tiene un elemento padre. Para valores de ay bmayores que cero, esto divide efectivamente a los elementos secundarios del elemento en grupos de aelementos (el último grupo toma el resto) y selecciona el belemento 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 valores ay bdeben 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+bdebe totalizar a un número positivo.

Cuando a= 0, no es necesario incluir una parte (a menos que la bparte ya se haya omitido). Cuando anno está incluido y bno es negativo, el signo + antes b(cuando está permitido) también puede omitirse. En este caso, la sintaxis se simplifica a :nth-child(b).

Si ambos ay bson 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.

Adam Zuckerman
fuente
0

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

user949300
fuente