【実務・中級編】 :nth-last-child() 擬似クラス – CSS実践ガイド

CSSの「後ろから数える」魔術:`:nth-last-child()`を現場で使いこなす極意

やあ。コードレビューをしていてよく思うんだが、CSSの擬似クラスを「なんとなく」で使っていないか? 特に `:nth-child()` はみんなよく使うが、その兄弟分である `:nth-last-child()` を使いこなせているエンジニアは意外と少ない。

「最後から数える」というシンプルな機能だが、これを使いこなすだけで、リストの可変長問題やCSSのみによる動的なUI制御の幅が劇的に広がる。今日は、現場の泥臭い実装で得た知見を交えて、この擬似クラスの真髄を話そう。

—

`:nth-last-child()` の正体とブラウザの裏側

まず、仕様を正しく理解しておこう。`:nth-last-child(an+b)` は、親要素の最後の子要素から数えて順序を決定する。

ここで重要なのは、ブラウザがこれをどう処理しているかだ。DOMツリーがレンダリングされる際、ブラウザは「最初の子」を起点にするよりも、「最後の子」を起点にする方が、実はメモリや計算コストの面で少しだけ工夫が必要になる。だが、モダンブラウザの最適化技術は凄まじいので、パフォーマンスを過度に恐れる必要はない。

ただし、「DOM構造が動的に変わる場合」に注意が必要だ。例えば、JavaScriptで要素を頻繁に追加・削除するようなUIでは、`:nth-last-child()` を使ったスタイルが、DOM更新のたびに再計算される。この「再計算」がレイアウトシフト(CLS)を引き起こさないよう、親要素の高さが確定しているか、あるいはコンテナの設計を堅牢にしておくことが、シニアレベルのフロントエンドには求められる。

—

実践:現場で使う「最後から〇番目」のパターン

よくあるのが、「リストの最後から2番目までにはボーダーを引きたいが、最後には引きたくない」というケースだ。これをJSでやるなんてナンセンス。CSSだけで完結させよう。

/ 最後の要素を除いた全要素にボーダーを引く(定番テクニック) /
.list-item:not(:last-child) {
border-bottom: 1px solid #ccc;
}

/ もっとエレガントに:最後から2番目までを指定する /
/ 実務ではこちらの方が拡張性がある /
.list-item:nth-last-child(n+2) {
border-bottom: 1px solid #ccc;
}

この `:nth-last-child(n+2)` は、「2番目以降(最後から数えて)」という意味だ。つまり、最後の一つ以外すべてにスタイルを当てる。これは `:not(:last-child)` と結果は似ているが、セレクタの重み付け(詳細度)や複雑な条件指定において、こちらの方が柔軟に制御できる場合が多い。

—

応用編:要素数に応じてスタイルを変える「神業」

これが `:nth-last-child()` の真骨頂だ。「要素が3つ以上あるときだけ、特定のレイアウトを適用したい」という実装、君ならどうする?

/ 3つ以上の要素がある場合、最後の3つの要素にスタイルを適用 /
/ 3つ以上ある場合のみ、横並びの挙動を変えたり、余白を調整したりする /
.item:nth-last-child(n+3),
.item:nth-last-child(n+3) ~ .item {
/ ここに3つ以上ある時のレイアウトを書く /
flex-basis: 30%;
}

この `~`(兄弟結合子)と組み合わせるテクニックは、UIのレスポンシブ対応で死ぬほど役に立つ。要素数という「状態」をクラス名の付け替えなしでCSSだけで検知する。これぞ、我々が目指すべき「ロジカルなCSS設計」だ。

—

現場の先輩からのアドバイス:注意すべき罠

最後に、現場でハマりやすいポイントを2つだけ伝えておく。

1. 要素の種類を混在させない:
`:nth-last-child()` はあくまで「子要素の順番」を見る。もしリストの中に `

` や `` が混ざっていると、カウントが狂って意図しないスタイルが当たる。「種類」まで厳密に指定したいなら `:nth-last-of-type()` を使うのが正解だ。

2. 可読性を犠牲にするな:
`nth-last-child(3n+1)` のような数式は、複雑になればなるほど後から来るメンバーが解読不能になる。「なぜこうなっているか」をコメントに残すのは、チーム開発における最低限のマナーだ。

CSSは、ただ見た目を整える道具じゃない。ブラウザというエンジンをどう回すかという、立派なプログラミングだ。`:nth-last-child()` を使いこなせば、君の書くコードはより洗練され、不必要なJSのロジックが減っていくはずだ。

さあ、今日からコードを少しずつ「引き算」していこうぜ。応援している。

コメント

タイトルとURLをコピーしました