CSSにもついに“親要素を条件で選べる”時代がやってきました。
そう、:has()擬似クラスです。
これまでJavaScriptでしか実現できなかった「親要素が子要素の状態を参照する」ような条件分岐が、CSSだけで完結できるようになったのです。
まさにCSSの世界における「親セレクタ降臨」!
本記事では、:has()の基本的な使い方から、実際に役立つ具体例までを紹介します。
CSSの:has()擬似クラスは、「要素が特定の子要素や状態を持っているかどうか」を判定できる親セレクタです。
つまり、「中に○○があったら、この親要素にスタイルを当てる」という指定ができます。
/ 例:子要素に画像があるdivに枠線をつける /
div:has(img) {
border: 2px solid #00bcd4;
}
2025年現在、モダンブラウザ(Chrome、Edge、Safari、Firefox)では基本的に対応しています。
※古いバージョンのIEや、レガシー環境では非対応の可能性があるので、使用前にサポート状況を確認しましょう。
1:入力があるフォームだけ目立たせる
form:has(input:focus) {
outline: 2px solid #2196f3;
}
→ ユーザーが操作しているフォームにだけスタイルを付けられます。
2:チェックボックスがONのとき、ラベルの色を変える
label:has(input:checked) {
background-color: #4caf50;
color: white;
}
→ JavaScriptなしでトグルっぽいUIが作れる!
3:空じゃないフィールドにだけ枠線を付ける
input:has([value]) {
border: 1px solid green;
}
※厳密には:has()より:not(:placeholder-shown)のほうが向いているケースもあります。
4:子にエラー要素があるフォームだけ赤くする
form:has(.error) {
border: 1px solid red;
}
→ フォームバリデーションの見た目をCSSで完結!
5:リストの中に特定のアイテムがある場合の装飾
ul:has(li.special) {
background-color: #ffeb3b;
}
→ 特定の条件を満たすコンテンツがある場合の強調に便利。
6:画像が含まれていない記事だけにデフォルトの背景をつける
article:not(:has(img)) {
background-color: #f9f9f9;
}
→ 記事に画像が入っていないときだけ、視認性を上げる目的で背景を変えることができます。
:has()は、CSSでの表現力を一気に拡張してくれる強力なツールです。
「JavaScriptでやってたあれ」がCSSで書ける時代、もう来てます。
まずは小さなUI改善から、ぜひ使ってみてください!
山口県育ちの音楽大好きおっちゃんです。10年ほど関東にいましたが、Uターンで地元山口に帰ってきました。山口のことや、Webのことなど、さまざまな情報を共有していければと思います。どうぞ何卒よろしくお願いいたします。
REC.