CSS セレクター (特に疑似クラス、特に疑似クラス:not()
の:nth-*()
ファミリー) は「フィルター」として機能しません。ここに少し説明がありますが、振り返ってみると少しぎこちないようです。これがより良い説明です。
シーケンス内の単純なセレクターは、 1 つずつ書き込まれた順序では処理されません。むしろ、スタイルを要素に適用するために要素が一致しなければならない一連の条件であり、要素はこれらすべての条件をそのまま一緒に一致させる必要があります。または、それらを条件と呼ぶ代わりに記述子と呼ぶこともできますが、CSS セレクターに関しては「フィルター」を誤称と見なします。
あなたのセレクターは次のことを意味します:
#element
この要素が次の範囲内にあり、次のすべての条件に一致する場合にのみ、この要素を選択します。
tr
要素です
- クラスを持たない
isotope-hidden
- 親の (2n+1) 番目の子です
そんな意味じゃない:
- の中身を見て
#element
- すべての
tr
要素を選択
isotope-hidden
これらの要素の中でクラスを持たない要素を除外します
- これらのフィルタリングされた要素のすべての (2n+1) 番目の子にスタイルを適用します
フィルターで除外した後にスタイルを「再描画」または再適用できたとしても、とにかく機能しません。これは、要素がisotope-hidden
クラスであるかどうか (またはtr
! であるかどうかにかかわらず)、セレクターは、要素が DOM の親の最初の子である:not(.isotope-hidden)
という事実を変更しないためです。 :nth-child(1)
is:nth-child(2)
は DOM での親の 2 番目の子であり、以降も同様です。
シーケンシャル フィルターが必要な場合、純粋な CSS セレクターではこれを行うことができません。この目的のために設計されたjQueryのフィルターメソッドを使用して、スタイルを適用するために使用できるそれぞれの要素にクラスを追加する必要があります。
$('#element tr').not('.isotope-hidden').filter(':even');
余談ですが、これはフィルター セレクターを使用して、単一の jQuery セレクターとして書き直すこともできます。
$('#element tr:not(.isotope-hidden):even');
ただし、同様の構文にもかかわらず、真の CSS セレクターと jQuery フィルターには大きな違いがあり、この回答で概説されています。