【実務・中級編】 only-child擬似クラスの適用条件 – CSS実践ガイド

`:only-child` の深淵:なぜ「ただ一つの子」という条件が、現場で最強の武器になるのか

フロントエンドの現場でCSSを書いていると、どうしても「要素が1つしかない時だけ特別なスタイルを当てたい」というシチュエーションに出くわす。リストのアイテムが1つなら装飾を消したい、あるいはカード内の画像が唯一の要素なら枠線を広げたい……。

そんな時、初心者はついJavaScriptでDOMの長さを数えてクラスを付与しようとするが、それは少し待ってほしい。CSSには、そのための洗練された武器 `:only-child` が用意されている。今日は、この一見シンプルでいて、実は奥が深い擬似クラスの正体と、現場で「なるほど!」と言わせる使いこなし術について話そう。

—

`:only-child` の仕様とブラウザの裏側

まず定義をはっきりさせておこう。`:only-child` は、「その親要素にとって、兄弟要素が存在しない唯一の子である」場合にのみマッチする。

ここで重要なのは、「テキストノード」や「コメント」は無視されるという点だ。ブラウザがこの擬似クラスを評価する時、DOMツリー上の「要素ノード(Element Node)」の数だけを数えている。つまり、ソースコード上で要素の間に改行やスペースがどれだけ入っていようと、HTMLタグとして定義された要素が1つしかなければ、ブラウザは「よし、お前が唯一の存在だな」と判定を下す。

この処理は非常に高速だ。なぜなら、ブラウザのレンダリングエンジンは、スタイル計算のフェーズで親要素から子要素への参照をすでに持っているからだ。JSでDOMを操作するようなコストは一切かからない。パフォーマンスを気にするなら、迷わずこちらを選ぶべきだ。

—

実務で輝く「唯一の存在」の活用例

例えば、ダッシュボードのウィジェットや、CMSから流し込まれるコンテンツエリアを想像してほしい。中身が1つなのか複数なのか分からない時、レイアウトを崩さないためのガードレールとして `:only-child` は非常に優秀だ。

/ カード内の要素が1つだけの場合の特別なレイアウト /
.card-content > :only-child {
/ 唯一の要素なら余白を削ってダイナミックに配置する /
margin: 0;
padding: 1.5rem;
border-radius: inherit;
}

/ もし兄弟がいれば、通常通りの余白を適用(あえての否定形ではないアプローチ) /
.card-content > + {
margin-top: 1rem;
}

このコードの賢いところは、`:only-child` を使うことで「余計な条件分岐」をCSS内部で完結させている点だ。後から要素が増えた場合でも、スタイルは自然に通常モードへ遷移する。これが宣言的UIの醍醐味だ。

—

よくある落とし穴:`:only-of-type` との違い

中級者でも混同しやすいのが `:only-of-type` だ。これの区別は明確にしておこう。

  • :only-child: 親の中にある「すべての要素の中で」唯一の存在か。
  • :only-of-type: 親の中にある「そのタグの種類の中で」唯一の存在か。

例えば、`

`の中に `

`が1つと、``が1つある場合。

  • `

    `に対して `:only-child` はマッチしない(兄弟に``がいるから)。

  • `

    `に対して `:only-of-type` はマッチする(親の中に`

    `は1つしかないから)。

現場では「とにかく何が入っていても1つなら変えたい」のか、「特定のタグが1つだけ含まれる時を狙い撃ちしたい」のか、要件に合わせて使い分ける必要がある。

—

シニアからのアドバイス:保守性を高めるために

`:only-child` を使う時は、以下の点に注意してほしい。

1. 過度な依存を避ける: 「1つだけなら特別」というロジックは便利だが、UIが複雑になりすぎると、後任者が「なぜスタイルが変わるのか」を追えなくなる。必ずコメントを残すか、クラス名で意図を伝えること。
2. CSSの堅牢性: 兄弟要素が将来的に増える可能性は常に考えておく。もし `:only-child` でレイアウトを大きく変えるなら、それが「壊れにくい設計」になっているか一度立ち止まって自問してほしい。

まとめ

`:only-child` は、単なるセレクタの一つではなく、「DOMの状態をCSSだけでスマートにハンドリングするためのツール」だ。

JavaScriptで`if (children.length === 1)`と書く前に、一度CSSの仕様書を思い出してほしい。ブラウザが標準で提供している機能を最大限に活用することこそ、プロのフロントエンドエンジニアが辿り着く「無駄のない、美しいコード」への近道だ。

現場のコードは、時に泥臭いものだが、こういう小さな武器を一つずつ丁寧に積み重ねていけば、必ず洗練されたアーキテクチャへと昇華できる。今日から君のCSSにも、この「唯一の存在」を活用したロジックを忍ばせてみてくれ。

コメント

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