こんにちは!フロントエンドの現場で日々コードと格闘しているチーフアーキテクトです。
CSSを学び始めたばかりの皆さん、毎日お疲れ様です。「CSSって、自分の思い通りに動いてくれない!」と頭を抱える瞬間、ありますよね。大丈夫です、私も最初はそうでした。
今日は、そんな皆さんのCSSライフを劇的に楽にする、「CSS界の革命児」こと `:has()` という魔法のセレクタを紹介します。「親要素を操作したいのに、CSSにはそんな機能がない…」と涙を飲んだ夜とも、これでお別れです。
—
1. `:has()` って何? 身近な例えで考えてみよう
これまでのCSSは、「親から子へ」命令を伝えるのは得意でした。「リストの中の文字を赤くして」というのは簡単ですよね。でも、「もしこのリストの中に『おすすめ』っていうアイコンが入っていたら、枠線を金色にして目立たせたい!」というような、「中身を見てから親の見た目を決める」ことは、実はとても大変でした。
ここで登場するのが `:has()` です。これを例えるなら、「中身を覗き込むスパイ」です。
- 「バッグの中にお財布が入っているか確認して、入っていたらバッグを特別に光らせる」
- 「お皿の中にケーキが乗っているか確認して、乗っていたらお皿の縁を可愛く装飾する」
こんなふうに、「中身(子)の状況を見て、親の姿を変える」ことができる。それが `:has()` の正体です。
—
2. なぜこれが「革命」なのか?
今まで、こうした「中身の条件による変化」を実現するには、JavaScriptというプログラミング言語を使って、「中身があるかチェックして、あったらクラス名を付け替えて…」という面倒な準備が必要でした。
でも、`:has()` ならCSSだけで完結します。ブラウザが自動的に「あ、中身が変わったからスタイルも更新しなきゃ!」と頑張ってくれるんです。これ、本当にすごいことなんですよ。
—
3. さっそく書いてみよう!実用的なサンプル
例えば、よくある「カード型レイアウト」で考えてみましょう。「画像があるカードだけ、ちょっと背景色を変えておしゃれにしたい」という場合です。
素敵な風景です
テキストだけのシンプルなカードです
これまではJavaScriptが必要でしたが、今はこう書くだけです。
/ 「imgタグを持っている .card だけ」スタイルを変更する /
.card:has(img) {
border: 2px solid #ffcc00; / 金色の枠線をつける /
background-color: #fffdf0; / 背景をほんのりクリーム色に /
box-shadow: 0 4px 10px rgba(0,0,0,0.1); / 少し浮き上がらせる /
}
たったこれだけ。「もし img があったら…」という条件を `:has()` のカッコの中に入れてあげるだけで、親である `.card` が反応してくれます。どうですか?シンプルすぎて驚きませんか?
—
4. つまずきやすいポイント:焦らなくて大丈夫
`:has()` を使うときに一つだけ覚えておいてほしいことがあります。それは、「まだ対応していないブラウザもあるかも?」という点です。
ただ、今のモダンなブラウザ(Chrome, Edge, Safariなど)はほとんど対応しています。現場でも、「もし対応していなかったらどうしよう?」と不安になることがありますが、そんな時は「もし使えなくても、見た目が少しシンプルになるだけ」というデザインにしておけば、ユーザーは誰も困りません。
「完璧を目指さず、まずはできるところから使ってみる」。これが、プロの現場で生き残るコツですよ。
—
まとめ:あなたの武器を一つ増やそう
`:has()` は、これまでの「CSSの限界」を軽々と飛び越えるツールです。
- 「中身を覗き込んで、親を変える」という直感的な操作ができる。
- JavaScriptを書かなくても、複雑な条件分岐ができる。
- コードがスッキリして、後から見直した時も「何をしたいのか」が一目でわかる。
最初は難しく感じるかもしれませんが、まずは「これ、`:has()` でできるかも?」と頭の片隅に置いておくだけで十分です。CSSは、触れば触るほどあなたの味方になってくれます。
これからも、一緒に少しずつ、CSSの旅を楽しんでいきましょう!応援していますよ。

コメント