:has() selector
従来のCSSでは子要素の状態で親をスタイリングすることが不可能だった。:has() はこの問題を解消し、任意のセレクターを条件として親・前の兄弟要素などを選択できるようにした。
概要
従来のCSSでは子要素の状態で親をスタイリングすることが不可能だった。:has() はこの問題を解消し、任意のセレクターを条件として親・前の兄弟要素などを選択できるようにした。
対応ブラウザ
デスクトップ
Chrome 105+
Edge 105+
Safari 15.4+
Firefox 121+
モバイル
Chrome Android 105+
Safari iOS 15.4+
Firefox Android 121+
基本構文
CSS
/* チェック済み input を持つ label をスタイリング */
label:has(input[type="checkbox"]:checked) {
background: #e0f2fe;
font-weight: bold;
}
figure:has(img) {
border: 2px solid #ddd;
padding: 8px;
}
h2:has(+ p) {
margin-bottom: 4px;
} 実務での使いどころ
-
フォームのバリデーション表示
エラーがある input を持つ .form-group 全体をハイライト。JS不要で包括的なスタイル変更が可能。
-
チェックボックス連動UI
チェック済みの input を持つ親カードの背景・ボーダーを変える。カートやタスクリストで有効。
-
メディア有無によるレイアウト分岐
img がある .card と ない .card で異なるレイアウト。
-
セクション見出しの調整
直後に p が続く h2 だけ margin-bottom を縮める。
注意点
- パフォーマンス — 複雑なセレクターはレイアウト再計算コストが増える。
- Firefox 121未満は動作しない。
- IE 完全非対応。
フォールバック戦略
CSS
@supports not selector(:has(*)) {
.js-fallback { display: block; }
}
@supports selector(:has(*)) {
label:has(input:checked) {
background: #e0f2fe;
}
} アクセシビリティ
- 視覚的なスタイル変更はスクリーンリーダーに伝わらない。aria-checked などを必ず併用。
- フォームのエラー表示は role="alert" でテキストとしても提供する。
- 色のみで状態を伝えず、色+テキストを組み合わせる。