`:first-child` でスマートなCSSレイアウト:Webデザインをレベルアップ


CSS セレクタ :first-child は、要素の子要素の中でも最初の要素のみを選択するための強力なツールです。このガイドでは、:first-child の仕組み、構文、スタイリングへの応用例、そして注意点について詳しく解説します。

:first-child の仕組み

:first-child は、擬似クラスと呼ばれる特殊なセレクタの一種です。擬似クラスは、要素の本来の属性や構造とは別に、特定の状態や位置づけに基づいて要素を選択することができます。

:first-child の場合、親要素の子要素全てを対象とし、その先頭に位置する要素のみを抽出します。つまり、兄弟要素同士の順番を基準に、最初の要素のみを選択する機能を提供します。

:first-child の構文

:first-child の基本的な構文は以下の通りです。

親要素 セレクタ :first-child {
  /* スタイル定義 */
}

この例では、親要素 内の最初の 子要素 に対してのみスタイルが適用されます。

:first-child のスタイリング例

:first-child を活用することで、様々なスタイリングを実現できます。以下に、いくつか例を挙げます。

  • 最初の段落のみ太字にする
p:first-child {
  font-weight: bold;
}
  • 最初のリストアイテムのみ左余白を設定する
li:first-child {
  margin-left: 20px;
}
  • 最初の画像にのみボーダーを追加する
img:first-child {
  border: 3px solid red;
}
  • :first-child は、他の擬似クラスやセレクタと組み合わせて使用することができます。
  • 擬似クラスは、要素の属性を変更するものではありません。あくまでも、スタイルを適用する対象を絞り込む役割を果たします。
  • :first-child は、直接の子要素のみを対象とします。つまり、孫要素さらに深い階層の子要素には適用されません。
  • より柔軟な子要素の選択には、:nth-child() 擬似クラスが役立ちます。こちらは、インデックスを用いて、特定の順番の子要素を選択することができます。
  • :first-child と同様の機能を持つ擬似クラスとして、:last-child があります。こちらは、親要素の子要素最後に位置する要素のみを選択します。


基本的な例

以下のコードは、ul 要素内の最初の li 要素のみを赤色に背景色を変更します。

<ul>
  <li>1番目のリストアイテム</li>
  <li>2番目のリストアイテム</li>
  <li>3番目のリストアイテム</li>
</ul>
ul li:first-child {
  background-color: red;
}

疑似要素と組み合わせる例

以下のコードは、h1 要素の最初の文字のみを太字にします。

<h1>見出し</h1>
h1:first-child::first-letter {
  font-weight: bold;
}

属性と組み合わせる例

以下のコードは、img 要素の中で alt 属性を持つ最初の要素のみを枠線で囲みます。

<img src="image1.jpg" alt="画像の説明1">
<img src="image2.jpg">
<img src="image3.jpg" alt="画像の説明3">
img[alt]:first-child {
  border: 2px solid blue;
}

nth-child() と組み合わせる例

以下のコードは、p 要素内の偶数番目の段落のみマージンを設定します。

<p>段落1</p>
<p>段落2</p>
<p>段落3</p>
<p>段落4</p>
p:nth-child(2n):first-child {
  margin: 10px 0;
}

上記以外にも、first-child は様々な場面で活用することができます。例えば、以下のようなことができます。

  • ナビゲーションメニューの最初の項目にマージンを設定する
  • フォームの最初の入力欄にフォーカスを当てる
  • テーブルの最初の行のみを強調する
  • 最新のCSS仕様に関する情報は、MDN Web Docsなどのドキュメントを参照することをおすすめします。
  • 複雑なレイアウトを組む場合は、first-child と他のセレクタを組み合わせて使用する方が柔軟に対応できます。


nth-child(1) を使用する

最も基本的な代替方法は、nth-child(1) を使用する方法です。これは、first-child と同じように、親要素の子要素最初の要素のみを選択します。構文は以下の通りです。

親要素 セレクタ nth-child(1) {
  /* スタイル定義 */
}

利点:

  • 他の nth-child() セレクタと組み合わせやすい
  • シンプルで分かりやすい構文

欠点:

  • 誤解を招きやすい可能性がある(nth-child(1)1番目の要素を意味するため、0番目の要素ではないことに注意が必要)
  • first-child と比べて記述量がやや増える

:first-of-type を使用する

:first-of-type は、親要素の子要素最初同じタイプの要素のみを選択します。つまり、兄弟要素の種類が異なる場合でも、最初の要素のみを選択することができます。構文は以下の通りです。

親要素 セレクタ :first-of-type {
  /* スタイル定義 */
}
  • first-child よりも汎用性が高い
  • 兄弟要素の種類が異なる場合でも、最初の要素のみを選択できる
  • 一部の古いブラウザではサポートされていない可能性がある
  • first-child と比べて認知度が低い

JavaScript を使用する

JavaScript を利用すれば、より柔軟な方法で最初の要素を選択することができます。例えば、以下のようなコードで、最初の要素のみをスタイル設定できます。

const elements = document.querySelectorAll('parent-selector selector');
elements[0].style.cssText = '/* スタイル定義 */';
  • 動的にスタイルを適用できる
  • 非常に柔軟な選択が可能
  • 他の方法と比べて処理速度が遅くなる可能性がある
  • JavaScript の知識が必要

上記以外にも、状況によっては以下のような方法も検討できます。

  • 第一子のみに固有のスタイルがある場合は、CSSフレームワークやライブラリを活用する
  • 特定の属性を持つ最初の要素を選択する場合は、[attribute-name]:first-child を使用する
  • 特定のクラスを持つ最初の要素を選択する場合は、[class-name]:first-child を使用する

適切な代替方法を選択する

どの代替方法が適切かは、状況によって異なります。以下のような点を考慮して選択しましょう。

  • 柔軟性: 動的にスタイルを適用したり、複雑な条件で最初の要素を選択する必要がある場合は、JavaScript が最適です。
  • 汎用性: 兄弟要素の種類が異なる場合や、将来的に要素構造が変更される可能性がある場合は、:first-of-type や JavaScript を使用するのが良いでしょう。
  • シンプルさ: コードの可読性やメンテナンス性を重視する場合は、nth-child(1):first-of-type のようなシンプルな方法がおすすめです。