web-dev-qa-db-ja.com

CSSの:nth-​​child()が0ではなく1から始まるのはなぜですか?

:nth-​​child()がゼロではなく1から繰り返すのはなぜですか?

このように example です。なぜ最初の要素を選択し、2番目の要素を選択しないのですか?

p :nth-child(1)
15
user51349

自分の子供を数える場合、「私のゼロ番目の子供」ではなく、「私の最初の子供」、「私の2番目の子供」などと言います。これは単に人間が数える方法です。 (注:これは私による主観的な意見ではありません。これは文字通り 序数 が機能する方法です。)

あなたが質問をする理由さえ、おそらくあなたがプログラマーであり、多くのプログラミング言語が配列とリスト項目を0からインデックス付けしているためです。これの理由は、Cのような低レベル言語では、配列は実際にはメモリアドレスへのポインターであるためです最初のアイテムとインデックスのオフセットは、このポインターに対するオフセットです。そう array[0]は最初のアイテムのアドレスを意味し、array[1]は、最初のアイテムのアドレスに1アイテムのサイズを加えたもの、つまり2番目のアイテムなどを意味します。

ポインタ演算を直接サポートしない多くの高水準言語は、一貫性と親しみやすさのために0ベースのインデックスを保持しています。たとえば、JavaScriptの配列が完全に異なる方法で実装されている場合でも、JavaScriptを含む、C派生の構文を持つすべての言語。しかし、これはまったく普遍的ではありません-COBOL、Fortran、Lua、一部のBasicのような言語は1ベースのインデックスを使用します。 (Visual Basicは当然、構成可能にすることで両方の世界で最悪のものを選択しました。)したがって、他のすべての言語が0ベースのインデックスを使用するのとはまったく異なります。その価値のために、XPathとXQueryも1ベースのインデックスを使用します。

ほとんどのプログラマーは1と0ベースのインデックス付けの両方に慣れていますが、通常の人は当然1から数えます。CSSはプログラマーだけでなくデザイナーやグラフィックプロフェッショナル向けに設計された言語なので、1ベースのインデックス付けを選択するのが自然です。 。

15
JacquesB

CSSレベル3セレクター仕様 から:

6.6.5.2。 :nth-​​child()疑似クラス

:nth-child(an+b)疑似クラス表記は、nの正の整数またはゼロ値に対して、ドキュメントツリー内でその前に_an+b-1_兄弟があり、親要素を持つ要素を表します。ゼロより大きいabの値の場合、これは要素の子を実際にa要素のグループ(最後のグループが残りの部分をとる)に分割し、各グループのbth要素を選択します。たとえば、これにより、セレクタはテーブル内の1行おきにアドレス指定でき、段落テキストの色を4サイクルで交互に変更できます。 aおよびbの値は整数(正、負、またはゼロ)でなければなりません。要素の最初の子のインデックスは1です。

例を使ってさらに詳しく説明します。 _an+b_の最終的な計算は、正の数になる必要があるようです。

a = 0の場合、(bパーツが既に省略されていない限り)パーツを含める必要はありません。 anが含まれておらず、bが負でない場合、bの前の+記号(許可されている場合)も省略できます。この場合、構文は:nth-child(b)に単純化されます。

abの両方がゼロに等しい場合、疑似クラスはドキュメントツリーの要素を表しません。

最後の段落の追加の書式設定は、強調を加えるためのものです。

7
Adam Zuckerman

おそらく、別のXML/HTML処理言語であるXPathとの整合性のためです。 XPathが1ベースのインデックスを使用するのはなぜですか。

https://stackoverflow.com/questions/3319341/why-do-indexes-in-xpath-start-with-1-and-not- を参照してください

関連する(しかし論争の的になる引用)は:

「... 1ベースのロジックはXPathとXSLTの正しい選択でした...言語はプログラマー向けではなくユーザー向けに設計されたため、ユーザーは本の最初の章を次のように参照するという昔ながらの習慣を持っています第一章..."

0
user949300