Warum beginnt nth-child () in CSS bei 1 statt bei 0?

15

Warum iteriert nth-child () von eins statt von null?

Wie in diesem Beispiel gezeigt . Warum wählt es das erste Element und nicht das zweite, wenn

p :nth-child(1)
user51349
quelle
12
"Sollten Array-Indizes bei 0 oder 1 beginnen? Mein Kompromiss von 0,5 wurde abgelehnt, ohne die richtige Überlegung." - Stan Kelly-Bootle
Mason Wheeler
1
Da ich davon ausgehe, dass dies einige enge Abstimmungen nach sich ziehen wird, lasse ich dies offen, da es zumindest theoretisch möglich ist, dies objektiv zu beantworten, indem entweder andere Beispiele für die 1-Indizierung in CSS angeführt und Konsistenz behauptet werden oder eine relevante Aussage von einer von ihnen gefunden wird die Leute, die tatsächlich die Entscheidung über CSS-Standards treffen Ich weiß fast nicht genug über CSS, um das selbst zu tun, aber solange wir keine Antworten stimmen, die das offensichtliche Argument "Es ist, wie normale Menschen zählen" ohne Begründung dafür, warum alles andere dann 0-indiziert ist Es schadet nicht, dies offen zu lassen.
Ixrec
1
@lxrec: Ich denke, es ist eine Behauptung, dass "alles andere 0-indiziert ist", die gerechtfertigt sein sollte. Du sagst nicht Queen Elizabeth the Zeroth, den nullten Weihnachtstag, die nullte Straße links oder das nullte Wort auf der Seite.
JacquesB
@lxrec In meiner Antwort wird XPath als Präzedenzfall für die 1-basierte Indizierung genannt. Ich bin nicht sicher, ob es tatsächlich ein Faktor oder nur ein Zufall war, aber es ist ein anderes XML-fokussiertes System, also macht es Sinn.
user949300

Antworten:

15

Wenn Sie Ihre eigenen Kinder zählen, würden Sie "mein erstes Kind", "mein zweites Kind" und so weiter sagen, nicht "mein nulltes Kind". So zählt einfach der Mensch. (Hinweis: Dies ist keine subjektive Meinung von mir. So funktionieren Ordnungszahlen buchstäblich .)

Der Grund, warum Sie diese Frage stellen, ist wahrscheinlich, dass Sie ein Programmierer sind und viele Programmiersprachen Array- und Listenelemente von 0 indizieren. Der Grund dafür ist, dass ein Array in einfachen Sprachen wie C wirklich ein Zeiger auf die Speicheradresse ist des ersten Elements und der Index ist ein Offset relativ zu diesem Zeiger. Bedeutet array[0]also die Adresse des ersten Artikels, array[1]bedeutet die Adresse des ersten Artikels plus der Größe von 1 Artikel, dh des zweiten Artikels und so weiter.

Viele übergeordnete Sprachen, die Zeigerarithmetik nicht direkt unterstützen, haben die 0-basierte Indexierung aus Gründen der Konsistenz und Vertrautheit beibehalten. Zum Beispiel alle Sprachen mit C-abgeleiteter Syntax - einschließlich JavaScript, obwohl Arrays in JavaScript auf völlig andere Weise implementiert sind. Dies ist jedoch keineswegs universell - Sprachen wie COBOL, Fortran, Lua und einige Basic verwenden eine 1-basierte Indexierung. (Visual Basic hat natürlich das Schlimmste aus beiden Welten ausgewählt, indem es konfigurierbar gemacht wurde.) Es ist also definitiv nicht so, dass jede andere Sprache eine 0-basierte Indizierung verwendet. XPath und XQuery verwenden auch eine 1-basierte Indizierung.

Während die meisten Programmierer sowohl mit der 1-basierten als auch mit der 0-basierten Indizierung vertraut sind, zählen normale Leute natürlich ab 1, und CSS ist eine Sprache, die nicht nur für Programmierer, sondern auch für Designer und Grafikprofis entwickelt wurde .

JacquesB
quelle
1
Es wäre hilfreich, wenn Sie in Ihrer Antwort erwähnen, dass Sie der Meinung sind, dass CSS in erster Linie für Nicht-Programmierer gedacht ist (vorzugsweise auf irgendeine Weise gesichert)
gnat
1
@gnat Gibt es irgendwo in der Programmierung einen Punkt, bei dem ein Kind als Null bezeichnet wird? Da der Selektor ein n-tes Kind ist, ist es logisch, zuerst zu beginnen.
Sami Kuhmonen
1
Können Sie alles außer dem letzten Absatz löschen? Alles andere ist in dieser SE allgemein bekannt. "Während die meisten Programmierer ...... natürlich 1-basierte Indizierung wählen"
0fnt
2
Ich bin mit Ihrer Antwort nicht einverstanden, aber viele Dinge, die wir zählen, beginnen nicht bei 1. Sie sind für das erste Jahr Ihres Lebens 0 Jahre alt - Sie beginnen nicht bei 1. Der Tag beginnt nicht um 1:00 Uhr - es beginnt um 0:00 Uhr. Wenn ich die von meinem Haus zurückgelegte Distanz messe, fange ich bei Null an. Das Zählen von Null ist für Menschen genauso selbstverständlich wie das Zählen von Eins - es hängt vom Kontext ab, obwohl Sie Recht haben, dass wir niemals von unserem nullten Kind sprechen würden :)
Aaron Rasmussen
6

Aus der CSS Level 3 Selector-Spezifikation :

6.6.5.2. : nth-child () Pseudoklasse

Die :nth-child(an+b)Pseudoklassen-Notation stellt ein Element dar, an+b-1vor dem im Dokumentbaum Geschwister stehen, für jeden positiven Ganzzahl- oder Nullwert von n, und verfügt über ein übergeordnetes Element. Für Werte von aund bgrößer als Null ist , teilt dies effektiv die Kinder in Gruppen von Element - aElemente (die letzte Gruppe , den Rest unter) und das Auswählen bte Element von jeder Gruppe. Auf diese Weise können die Selektoren beispielsweise jede zweite Zeile in einer Tabelle ansprechen und die Farbe des Absatztextes in einem Viertakt abwechseln. Die Werte aund bmüssen Ganzzahlen sein (positiv, negativ oder null). Der Index des ersten untergeordneten Elements eines Elements ist 1.

Es wird viel detaillierter mit Beispielen. Es scheint, dass die endgültige Berechnung von an+bmuss insgesamt eine positive Zahl sein.

Wenn a= 0, muss ein Teil nicht enthalten sein (es sei denn, der bTeil ist bereits weggelassen). Wenn annicht enthalten und bnicht negativ ist, kann das Pluszeichen b(sofern zulässig) auch weggelassen werden. In diesem Fall vereinfacht sich die Syntax zu :nth-child(b).

Wenn beide aund bgleich Null sind, repräsentiert die Pseudoklasse kein Element im Dokumentbaum.

Die zusätzliche Formatierung im letzten Absatz dient der Hervorhebung.

Adam Zuckerman
quelle
0

Wahrscheinlich aus Gründen der Konsistenz mit XPath, einer anderen XML / HTML-Verarbeitungssprache. Was wirft die Frage auf, warum XPath 1-basierte Indizierung verwendet?

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

Das relevante (aber kontroverse Zitat) ist:

"... 1-basierte Logik war die richtige Wahl für XPath und XSLT ..., da die Sprache für Benutzer und nicht für Programmierer entwickelt wurde und Benutzer immer noch die altmodische Angewohnheit haben, auf das erste Kapitel eines Buches als zu verweisen Kapitel eins..."

user949300
quelle