`: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にも、この「唯一の存在」を活用したロジックを忍ばせてみてくれ。

コメント