S 構文を使用して :nth-child() の選択をより詳細に制御

子要素のセットに An+B ロジックを適用する前に、事前にフィルタする。

:nth-child() 疑似クラス セレクタと :nth-last-child() 疑似クラス セレクタ

:nth-child() 疑似クラス セレクタを使用すると、インデックスで DOM 内の要素を選択できます。An+B マイクロ構文を使用すると、選択する要素を細かく制御できます。

  • :nth-child(2): 2 人目のお子様を選択します。
  • :nth-child(2n): すべての子(2 番目、4 番目、6 番目、8 番目など)を選択します。
  • :nth-child(2n+1): すべての奇数の子(1 番目、3 番目、5 番目、7 番目など)を選択します。
  • :nth-child(5n+1): 1 番目の (=(5×0)+1)、6 番目の (=(5×1)+1)、11 番目の (=(5×2)+1)、... 子を選択します。
  • :nth-child(5n+2): 2 番目の (=(5×0)+2)、7 番目の (=(5×1)+2)、12 番目の (=(5×2)+2)、... 子を選択します。

ただし、A パラメータを省略すると、より多くのクリエイティブを選択できます。例:

  • :nth-child(n+3): 3 番目(3 番目、4 番目、5 番目など)からすべての子を選択します。
  • :nth-child(-n+5): 5 番目までのすべての子を選択します(1 番目、2 番目、3 番目、4 番目、5 番目)

次の :nth-child() 個を組み合わせると、要素の範囲を選択できます。

  • :nth-child(n+3):nth-child(-n+5): 3 番目から 5 番目までのすべての子(3 番目、4 番目、5 番目)を選択します。

:nth-last-child() を使用して同様の選択を行うこともできますが、最初から数え始めるのではなく、最後までカウントします。

of S 構文で選択内容を事前にフィルタリングする

CSS セレクタ レベル 4 では、必要に応じてセレクタリストを :nth-child():nth-last-child() に渡すことができるようになりました。

:nth-child(An+B [of S]?)
:nth-last-child(An+B [of S]?)

of S が指定された場合、An+B ロジックは、指定されたセレクタ リスト S に一致する要素にのみ適用されます。つまり、An+B が処理する前に子を事前にフィルタできます。

対応ブラウザ

  • 111
  • 111
  • 113
  • 9

たとえば、:nth-child(2 of .highlight) と指定すると、.highlight クラスを持つ 2 番目の一致する要素が選択されます。言い換えれば、.highlight クラスを持つすべての子から 2 人目を選択します。

これは、クラス .highlight を持ち、かつ 2 番目の子でもある要素を選択する .highlight:nth-child(2) とは対照的です。

以下のデモでは、この違いを確認できます。

  • :nth-child(2 of .highlight) に一致する要素の枠線はピンク色です。
  • .highlight:nth-child(2) に一致する要素には緑色の枠線が表示されます。

S はセレクタ リストであり、複数のセレクタをカンマで区切って受け入れます。たとえば、:nth-child(4 of .highlight, .sale) と記述すると、兄弟要素のセットから 4 番目の要素(.highlight または .sale)が選択されます。

以下のデモでは、:nth-child(4 of .highlight, .sale) に一致する要素にオレンジ色の枠線が適用されています。

ゼブラストライプの再現

:nth-child() を使用する典型的な例は、ゼブラ ストライプ テーブルを作成する場合です。表の各行の色を視覚的に変えることで、通常は、次のように対応します。

tr:nth-child(even) {
  background-color: lightgrey;
}

これは静的テーブルでは問題ありませんが、テーブル コンテンツを動的にフィルタし始めると問題が生じます。たとえば、行 2 が非表示になると、行 1 と行 3 が表示され、それぞれ同じ背景色が使用されます。

これを解決するには、An+B ロジックから隠し行を除外して、:nth-child(An+B [of S]?) を活用します。

tr:nth-child(even of :not([hidden])) {
  background-color: lightgrey;
}

写真撮影: Markus Spiske(出典: Unsplash