たった一人の子にだけ魔法をかける! `:only-child` 疑似クラスでレイアウトをスマートに
Web制作の世界へようこそ! CSSって、なんだか魔法みたいでワクワクしますよね。でも、時々「あれ? この子だけなんでこんな感じになるんだろう?」って、ちょっとした戸惑いを感じることもあるかもしれません。
特に、リストの項目とか、メニューの項目とか、親玉にぶら下がっている子供たちがたくさんいる場面ってよくありますよね。そんな時、「もし、この子だけしかいないんだったら、特別扱いしてあげよう!」 なんて、優しい気持ちになったりしませんか?
今日は、そんな「たった一人の子」にだけ、特別な魔法をかけられるCSSのテクニック、「`:only-child`」という疑似クラスについて、お菓子作りに例えながら、と〜っても優しく解説していきますね。
`:only-child` って、一体どんな魔法?
「`:only-child`」っていうのは、CSSの世界で「親要素の中に、この子だけしかいない場合に、その子にスタイルを適用してね」っていう命令なんです。
例えるなら、お菓子の詰め合わせ箱を想像してみてください。
- 普通の日: 箱の中にクッキーが5枚入っています。それぞれのクッキーには、みんな同じようなリボンがかけられています。
- 特別の日: あれ? 今日は、箱の中にクッキーが1枚しか入っていません! しかも、そのクッキーは、なんだかいつもよりキラキラしていて、特別に大きなリボンがかかっています。
この「特別の日」の、箱の中でたった一枚しか入っていないクッキーにかけられる「キラキラ」とか「大きなリボン」が、CSSの `:only-child` さんのお仕事なんです。
つまり、親要素の中に兄弟が一人もいない、まさに「一人っ子」の状態の子要素にだけ、特別なデザインを適用できる、ということなんですね。
なんで `:only-child` が便利なの?
「ふーん、一人っ子にだけスタイルを適用できるのは分かったけど、それがどうして便利なの?」って思いますよね。
例えば、こんな場面を想像してみてください。
1. メニュー項目やリストの見た目を調整したい時
ショッピングサイトのヘッダーとか、サイドバーのメニューって、項目がいくつか並んでいますよね。
- 項目が複数ある場合: 項目同士の間には、ほどよい「余白」があった方が見やすいです。
- 項目が一つだけの場合: もし、メニューに項目が一つしかなかったら? その項目だけ、なぜか余白が大きすぎると、ちょっと間が抜けて見えませんか?

`:only-child` を使えば、この「項目が一つだけの場合」に、余分な余白をなくしたり、逆に文字を大きくしたり、といった調整がとっても簡単にできるんです。
2. 単一アイテムのレイアウトを最適化したい時
例えば、ブログの記事一覧で、記事が一つだけ表示されているページ。
- 記事が複数ある場合: 各記事の間に、見やすいように少しスペースを空けたいですよね。
- 記事が一つだけの場合: その記事がページいっぱいに表示されて、どーんと存在感を示してくれた方が、見栄えが良いかもしれません。
`:only-child` を使えば、「記事が一つだけ」という状態をCSSで検知して、その記事の幅を広げたり、中央に配置したり、といったレイアウトの最適化が、HTMLの構造を変えずに実現できるんです。
さあ、 `:only-child` を使ってみよう!
理屈は分かった! でも、具体的にどう書けばいいの? って思いますよね。大丈夫、とってもシンプルです。
例1:リストの項目で、一つだけの場合に背景色を変える
まずは、一番わかりやすいリストの例から見てみましょう。
HTML:
CSS:
/ まずは、リストの項目(li)の基本的なスタイル /
.menu-list li {
padding: 10px 20px; / 上下10px、左右20pxの余白 /
border: 1px solid #ccc; / 薄いグレーの線で囲む /
margin-bottom: 10px; / 下に10pxの余白 /
background-color: #f9f9f9; / 薄いグレーの背景色 /
text-align: center; / 文字を中央揃え /
}
/ ここが魔法! /
/ .menu-list の中で、たった一人の子(li)にだけ、 /
/ 背景色を明るい青に変える /
.menu-list li:only-child {
background-color: #e0f7fa; / 明るい水色の背景色 /
border-color: #00bcd4; / 水色の枠線 /
font-weight: bold; / 文字を太字に /
}
解説:
- `.menu-list li` で、すべてのリスト項目に共通のスタイルを当てています。
- そして、`.menu-list li:only-child` の部分で、「`ul.menu-list` の中で、`li` が一つしかない場合、その `li` にだけ、このスタイルを適用してね!」 と指示しているわけです。
このように、`li` が3つあるリストでは、すべての `li` は通常のスタイルが適用されます。しかし、`li` が1つしかないリストでは、その唯一の `li` だけが `:only-child` のスタイル(明るい水色の背景、太字など)を持つようになります。
例2:単一アイテムのカードレイアウトを調整する
次に、カードのような要素が並んでいて、一つだけの場合にレイアウトを変えたいケースです。
HTML:
最新ニュース
今日のニュースをお届けします…
キャンペーン情報
お得なキャンペーン実施中!…
特別なお知らせ
皆様にお伝えしたいことがあります…
CSS:
.card-container {
display: flex; / 横並びにするための設定 /
gap: 20px; / カードとカードの間の余白 /
margin-bottom: 30px; / コンテナの下の余白 /
}
.card {
flex: 1; / カードが均等な幅になるように /
border: 1px solid #ddd; / 薄いグレーの枠 /
padding: 20px; / 内側の余白 /
background-color: #fff; / 白い背景 /
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); / 影をつける /
border-radius: 8px; / 角を丸くする /
}
/ ここで魔法! /
/ .card-container の中で、たった一人の子(.card)にだけ、 /
/ 横並びの余白(gap)をなくし、幅を広げる /
.card-container .card:only-child {
flex: none; / flexの伸び縮みをなくす /
width: 100%; / 親要素いっぱいの幅にする /
margin-left: 0; / 左の余白をなくす (flex-grow: 1 の場合にも有効) /
margin-right: 0; / 右の余白をなくす (flex-grow: 1 の場合にも有効) /
padding: 30px 40px; / 内側の余白を少し増やす /
text-align: center; / 中央揃えにする /
}
解説:
- `.card-container` に `display: flex` を設定して、中の `.card` を横並びにしています。`gap: 20px` でカード間の余白も作っています。
- `.card-container .card:only-child` では、「`card-container` の中に `card` が一つしかない場合」に、`flex: none` で幅が固定されるようにし、`width: 100%` で親要素いっぱいに広がるようにしています。さらに、内側の余白も少し広げて、どっしりとした印象にしています。
こうすることで、カードが複数あるときは横並びで表示され、カードが一つだけの場合は、そのカードがページ幅いっぱいに表示されて、より目立つようにすることができます。
`:only-child` を使う上でのちょっとした注意点
`:only-child` はとっても便利ですが、使う上でいくつか知っておいてほしいことがあります。
- 「兄弟」であることが重要: `:only-child` は、あくまで「親要素の中で、同じ種類の要素(兄弟)が自分だけ」という条件でスタイルを適用します。親要素の中に、`div` と `p` のように、違う種類の要素が混ざっている場合は、たとえ `div` が一つしかなくても、それは `:only-child` にはなりません。
例えば、こんなHTMLがあったとします。
この段落だけ
この段落
このスパン
- `:first-child` や `:last-child` との違い: `:only-child` は、「最初の子」でもあり「最後の子」でもある、つまり「一人っ子」の状態を指します。`:first-child` は「最初の子」、`:last-child` は「最後の子」に適用されるので、要素が複数ある場合でも適用される点が異なります。
まとめ:一人っ子に優しいレイアウトを、もっと自由に!
`:only-child` 疑似クラス、いかがでしたか?
「親要素の中に、たった一人の子しかいない」という、ちょっと特別な状況をCSSで捉えて、それに合わせたレイアウトやデザインを適用できる、とってもパワフルなテクニックです。
リストの項目、メニュー、カード、あるいは画像など、様々な場面で活用できます。HTMLの構造を無理に変えることなく、見た目をスマートに調整できるのが、CSSの面白いところですよね。
今日から、あなたも `:only-child` を使って、一人っ子に優しい、もっと自由で洗練されたレイアウト作りに挑戦してみてください!きっと、Webサイトを見るのがもっと楽しくなりますよ。
もし、CSSで「あれ?」って思うことがあったら、いつでも思い出してくださいね。また、一緒に魔法をかけましょう!

コメント