Pourquoi: nth-child () en CSS commence-t-il par 1 au lieu de 0?

15

Pourquoi: nth-child () répète-t-il un au lieu de zéro?

Comme le montre cet exemple . Pourquoi sélectionne-t-il le premier élément et non le second quand

p :nth-child(1)
user51349
la source
12
"Les indices matriciels devraient-ils commencer à 0 ou 1? Mon compromis de 0,5 a été rejeté sans, je pense, une considération appropriée." - Stan Kelly-Bootle
Mason Wheeler
1
Comme je soupçonne que cela attirera quelques votes serrés, je laisse cela ouvert car il est au moins théoriquement possible de répondre objectivement en citant d'autres exemples d'indexation 1 en CSS et en revendiquant la cohérence, ou en trouvant une déclaration pertinente à partir de l'un des les personnes qui prennent les décisions concernant les normes CSS. Je n'en sais pas assez sur CSS pour le faire moi-même, mais tant que nous n'évaluons pas les réponses qui rendent l'argument évident "c'est comment les humains normaux comptent" sans aucune justification pour pourquoi tout le reste est indexé 0, alors il n'y a aucun mal à laisser cela ouvert.
Ixrec
1
@lxrec: Je pense que c'est une affirmation que "tout le reste est indexé 0", ce qui devrait être justifié. Vous ne dites pas la reine Elizabeth Zeroth, le jour zéro de Noël, la rue zéro à gauche ou le mot zéro sur la page.
JacquesB
@lxrec Dans ma réponse, XPath est cité comme un précédent pour l'indexation basée sur 1. Je ne sais pas si c'était réellement un facteur, ou juste une coïncidence, mais c'est un autre système axé sur XML, donc cela a du sens.
user949300

Réponses:

15

Si vous comptez vos propres enfants, vous diriez «mon premier enfant», «mon deuxième enfant» et ainsi de suite, pas «mon enfant zéro». C'est simplement ainsi que les humains comptent. (Remarque: ce n'est pas une opinion subjective de ma part. C'est littéralement comment les nombres ordinaux fonctionnent.)

La raison pour laquelle vous posez même la question est probablement parce que vous êtes un programmeur, et de nombreux langages de programmation indexent les éléments de tableau et de liste à partir de 0. La raison en est que dans les langages de bas niveau comme C, un tableau est vraiment un pointeur vers l'adresse mémoire du premier élément et l'index est un décalage par rapport à ce pointeur. Signifie donc l' array[0]adresse du premier élément, array[1]signifie l'adresse du premier élément plus la taille de 1 élément, c'est-à-dire le deuxième élément, etc.

De nombreux langages de niveau supérieur qui ne prennent pas directement en charge l'arithmétique des pointeurs ont conservé l'indexation basée sur 0 pour des raisons de cohérence et de familiarité. Par exemple, tous les langages avec une syntaxe dérivée de C - y compris JavaScript, même si les tableaux en JavaScript sont implémentés de manière complètement différente. Mais ce n'est pas du tout universel - des langages comme COBOL, Fortran, Lua et certains Basic utilisent l'indexation basée sur 1. (Visual Basic a naturellement choisi le pire des deux mondes en le rendant configurable.) Il n'est donc certainement pas comme tous les autres langages utilisant l'indexation basée sur 0. Pour ce que ça vaut, XPath et XQuery utilisent également l'indexation basée sur 1.

Bien que la plupart des programmeurs connaissent à la fois l'indexation basée sur 1 et 0, les personnes normales compteront naturellement à partir de 1, et CSS est un langage conçu non seulement pour les programmeurs mais aussi pour les concepteurs et les professionnels du graphisme, il est donc naturel de choisir l'indexation basée sur 1 .

JacquesB
la source
1
il serait utile que votre réponse mentionne que vous pensez que CSS est principalement destiné à être utilisé par des non-programmeurs (de préférence sauvegardé d'une manière ou d'une autre)
gnat
1
@gnat Y a-t-il quelque part dans la programmation un élément où un enfant serait le zéro? Puisque le sélecteur est nième enfant, il est logique de commencer par le premier.
Sami Kuhmonen
1
Pouvez-vous tout supprimer sauf le dernier paragraphe? Tout le reste est de notoriété publique sur cette SE. "Alors que la plupart des programmeurs ...... choisissent naturellement l'indexation basée sur 1"
0fnt le
2
Je ne suis pas en désaccord avec votre réponse, mais beaucoup de choses que nous comptons ne commencent pas à 1. Vous avez 0 ans pour la première année de votre vie - vous ne commencez pas à 1. La journée ne commence pas à 1h00 - ça commence à 0h00. Lorsque je mesure la distance parcourue depuis ma maison, je commence à zéro. Compter à partir de zéro est tout aussi naturel pour les êtres humains que compter à partir de un - cela dépend du contexte, bien que vous ayez raison de ne jamais parler de notre zéro enfant :)
Aaron Rasmussen
6

À partir de la spécification du sélecteur CSS niveau 3 :

6.6.5.2. : pseudo-classe nth-child ()

La :nth-child(an+b)notation de pseudo-classe représente un élément qui a des an+b-1frères et sœurs avant lui dans l'arborescence du document, pour tout entier positif ou valeur nulle de n, et qui a un élément parent. Pour les valeurs supérieures aou bégales à zéro, cela divise efficacement les enfants de l'élément en groupes d' aéléments (le dernier groupe prenant le reste) et sélectionne le be élément de chaque groupe. Par exemple, cela permet aux sélecteurs d'adresser toutes les autres lignes d'un tableau et peut être utilisé pour alterner la couleur du texte du paragraphe en un cycle de quatre. Les valeurs aet bdoivent être des entiers (positifs, négatifs ou zéro). L'index du premier enfant d'un élément est 1.

Il va beaucoup plus en détail avec des exemples. Il semble que le calcul final de an+bdoit totaliser jusqu'à un nombre positif.

Lorsque a= 0, la partie an n'a pas besoin d'être incluse (sauf si la bpartie est déjà omise). Lorsque ann'est pas inclus et bn'est pas négatif, le signe + avant b(lorsqu'il est autorisé) peut également être omis. Dans ce cas, la syntaxe se simplifie en :nth-child(b).

Si les deux aet bsont égaux à zéro, la pseudo-classe ne représente aucun élément dans l'arborescence du document.

Le formatage supplémentaire dans le dernier paragraphe est le mien pour ajouter de l'emphase.

Adam Zuckerman
la source
0

Probablement pour la cohérence avec XPath, un autre langage de traitement XML / HTML. Ce qui pose la question, pourquoi XPath utilise-t-il une indexation basée sur 1?

Voir /programming/3319341/why-do-indexes-in-xpath-start-with-1-and-not-0

La citation pertinente (mais controversée) est:

"... La logique basée sur 1 était le bon choix pour XPath et XSLT ... car le langage a été conçu pour les utilisateurs, pas pour les programmeurs, et les utilisateurs ont toujours cette vieille habitude de se référer au premier chapitre d'un livre comme Chapitre un..."

user949300
la source