これは、方法:nth-child()
と:nth-of-type()
動作の誤解が原因で発生する非常に一般的な問題です。残念ながら、セレクターは奇数番号、偶数番号、または任意のan+b
where a != 1
やb != 0
。これは、クラスセレクターだけでなく、属性セレクター、否定、および単純なセレクターのより複雑な組み合わせにも拡張されます。
:nth-child()
擬似クラスは間の要素を数え、すべて同じ親の下で彼らの兄弟のを。残りのセレクターに一致する兄弟だけをカウントするわけではありません。同様に、:nth-of-type()
疑似クラスは、同じ要素タイプを共有する兄弟をカウントします。これは、HTMLのタグ名を参照し、残りのセレクターは参照しません。
これはまた、唯一の子であるテーブル本体の場合には、たとえば、同じ親の場合、すべての子どもたちが同じ要素型であることを意味tr
要素またはその唯一の子であるリストの要素li
、その後、要素:nth-child()
と:nth-of-type()
同じように動作します、すなわちすべての値についてan+b
、:nth-child(an+b)
および:nth-of-type(an+b)
要素の同じセットと一致します。
実際、:nth-child()
and などの疑似クラスを含む、特定の複合セレクターのすべての単純なセレクターは、残りのセレクターと一致する要素のサブセットを調べるのではなく、互いに独立して:not()
機能します。
これは、個々の複合セレクター1 内の単純なセレクター間に順序の概念がないことも意味します。たとえば、次の2つのセレクターは同等です。
table.myClass tr.row:nth-child(odd)
table.myClass tr:nth-child(odd).row
英語に翻訳すると、どちらも意味します:
tr
次の独立した条件のすべてに一致する要素を選択します。
- 親の奇数番号の子です。
- クラス「行」があります。そして
- これは
table
、クラス「myClass」を持つ要素の子孫です。
(ここで、順序付けられていないリストを使用していることに気づくでしょう、ポイントを家に帰すためだけです)
現在、純粋なCSSソリューションはないため、スクリプトを使用して要素をフィルタリングし、それに応じてスタイルまたは追加のクラス名を適用する必要があります。たとえば、次はjQueryを使用した一般的な回避策です(tr
テーブル内の要素が入力されている行グループが1つだけであると想定しています)。
$('table.myClass').each(function() {
// Note that, confusingly, jQuery's filter pseudos are 0-indexed
// while CSS :nth-child() is 1-indexed
$('tr.row:even').addClass('odd');
});
対応するCSSを使用:
table.myClass tr.row.odd {
...
}
Seleniumなどの自動テストツールを使用している場合、またはlxmlなどのツールを使用してHTMLを処理している場合、これらのツールの多くではXPathを代替として使用できます。
//table[contains(concat(' ', @class, ' '), ' myClass ')]//tr[contains(concat(' ', @class, ' '), ' row ')][position() mod 2)=1]
異なるテクノロジーを使用する他のソリューションは、読者への課題として残されています。これは、説明のための簡単な、不自然な例です。
価値のあることとして、特定のセレクターに一致するn番目ごとの子を選択するという特定の目的のために、セレクターレベル4に記法の拡張を:nth-child()
追加するという提案があります。2
一致をフィルタリングするセレクタはの引数として提供され:nth-child()
ます。これも、既存のセレクタ構文で指定されているように、セレクタがシーケンス内で互いに独立して動作するためです。したがって、あなたの場合、それは次のようになります:
table.myClass tr:nth-child(odd of .row)
(抜け目のないリーダーはすぐにこれがあるべきことに注意します:nth-child(odd of tr.row)
単純なセレクタから、代わりtr
と:nth-child()
同様に互いに独立して動作します。これは、セレクタを受け入れる機能擬似クラスの問題点の一つは、私は思いますワームの缶ですこの回答の真ん中には開かないでください。代わりに、ほとんどのサイトには、tr
、テーブルボディ内の相互の兄弟要素としてため、どちらのオプションも機能的に同等ます。)
もちろん、まったく新しい仕様のまったく新しい提案であるため、これはおそらく数年後まで実装されません。それまでは、上記のようにスクリプトを使用する必要があります。
1 タイプまたはユニバーサルセレクターを指定する場合は、最初に指定する必要があります。ただし、セレクターの基本的な動作は変わりません。それは構文上の癖に過ぎません。
2 これはもともととして提案され:nth-match()
たものですが、指定されたセレクターに一致する他のすべての要素ではなく、その兄弟にのみ相対的な要素をカウントするため、2014年以降、:nth-child()
代わりに既存の要素の拡張として再利用されています。