LoginSignup
1
1

nth-childのof構文でより高度な指定ができるようになったのでnth-of-typeとの違いを改めて整理してみる

Last updated at Posted at 2023-12-18

これはなに?

CSSプロパティの nth-chlid():nth-last-child() に of構文でより詳細なフィルタリングができる様になりました。
この記事では、その挙動と nth-child()nth-of-type() の違いを理解したいと思います。

nth-child()nth-of-type()の挙動

  • nth-child() は兄弟要素のグループの中での位置に基づいて選択します
  • nth-of-type() は兄弟要素のグループの中で指定された型 (タグ名) の要素の位置に基づいて選択します

例えば、dl,dt, ddで記述した下記のグリッドがあります。
どちらも3つめの要素の背景を変更するCSSを記述しました。

  • dd:nth-child(3) では、dt を含めた3つめの背景をピンクに変更しています
  • dd:nth-of-type(3) では、ddだけの3つめの背景を緑に変更しています

See the Pen nth-child/nth-of-type by gilly135 (@gilly135) on CodePen.

このように、nth-child()nth-of-type()では挙動の違いがあることは広く知られているのではないでしょうか。

n番目の指定

nth-child()nth-of-type()ともに、n番目の指定方法は同じです。

特定の番号の指定(n番目)

例えば3番めの要素の指定は下記のように書きます。

nth-child(3) or nth-child(0n+3)
nth-of-type(3) or nth-of-type(0n+3)

奇数の指定(2n+1)

奇数の要素を指定したいときは、下記のように書きます。

nth-child(2n+1) or nth-child(odd)
nth-of-type(2n+1) or nth-of-type(odd)

偶数の指定(2n)

偶数の要素を指定したいときは、下記のように書きます。

nth-child(2n) or nth-child(even)
nth-of-type(2n) or nth-of-type(even)

倍数(Xn)

例えば3の倍数を指定したいときは下記のように書きます。

nth-child(3n)
nth-of-type(3n)

Y番目以降(n+Y)

例えば5番目以降の要素を指定したいときは下記のように書きます。

nth-child(n+5)
nth-of-type(n+5)

Y番目まで(-n+Y)

例えば5番目までの要素を指定したいときは下記のように書きます。

nth-child(-n+5)
nth-of-type(-n+5)

倍数とY番目の組み合わせ(Xn+Y)

例えば、2番目から3の倍数ごとに指定したいときは下記のように書きます。

nth-child(3n+2)
nth-of-type(3n+2)

n番目以外(:not)

例えば、2番目以外に指定したいときは :not という否定疑似クラスを使って、下記のように書きます。

dd:not(:nth-child(2)) {}
dd:not(:nth-of-type(2)) {}

A番目からB番目まで

複数組み合わせることもできます。
例えば、3番目から5番目を指定したいときは下記のように書きます。

dd:nth-child(n+3):nth-child(-n+5)
dd:nth-of-type(n+3):nth-of-type(-n+5)

その他

他にも特定の指定方法ができるCSSのプロパティがあります。

指定 nth-child nth-of-type
最初 :first-child :first-of-type
最後 :last-child :last-of-type
後ろからn番目 :nth-last-child(n) :nth-last-of-type(n)
1つだけ :only-child :only-of-type

nth-child()のof構文によるフィルタリング

冒頭でも述べましたが、CSSプロパティの nth-chlid():nth-last-child() に of構文でより詳細なフィルタリングができる様になりました。
上記の様にn番目の構文と組み合わせて特定のクラスのフィルタリングができます。

例えば、.pickup というclassがついた要素の3番目の要素にオレンジの枠線をつけるときは下記のように書きます。

dd:nth-child(3 of .pickup) {
  border: 2px solid #fb8c00;
}

nth-of-type()nth-child()のof構文によるフィルタリングの違い

nth-of-type()は特定の型(タグ名)の要素の要素の位置に基づいて選択します。
仮に.pickup:nth-of-type(1) で1番目の .pickup に青色の枠線をつけたかった場合、dl,dt,ddで記述したサンプルのdt,dd.pickupをつけるとどうなるでしょうか。

.pickup:nth-of-type(1) {
  border: 2px solid #1e88e5;
}

出力結果は下記のコードサンプルをご覧いただければと思いますが、<dt class="pickup">Dog</dt>にも、<dd class="pickup">Pomeranian</dd>にも青い枠線が付きました。

複数のタグにも同じようなclass名がついた場合、 nth-child() のof構文でのフィルタリングがわかりやすくなります。
場合によって使い分けて行けると良いと思います。

コードサンプル

See the Pen Untitled by gilly135 (@gilly135) on CodePen.

サポートブラウザ

MDNによるとof構文はすべてのブラウザで利用できるようです。

この記事が誰かのお役に立てると幸いです。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1