親セレクタ :has() を活用したコンテキスト依存スタイリングガイド

css
目次

CSSの新機能 :has() とは|親要素を直接スタイルできるセレクタ

CSS Selectors Level 4で定義された :has() 擬似クラスは、「子要素や兄弟要素の状態によって親要素へスタイルを適用できる」革新的な機能です。
これによりJavaScript不要で、よりメンテナブルなUIを実装できます。

具体例: 子inputがfocus状態のとき親labelにスタイル適用

label:has(input:focus) {
  color: #0066cc;
}

:has() 擬似クラスの仕様と書き方(A要素がBを含む場合)

A:has(B) {
  /* AがBに関係する場合に適用 */
}

主な特徴

  • 親要素への条件付きスタイル適用が可能
  • 子孫要素だけでなく兄弟関係にも適用可能
  • CSSのみでUIの状態管理が可能

対応ブラウザ状況(2025年時点)

ブラウザ対応
Chrome / Edge
Safari / iOS Safari
Firefox
Android Chrome
Internet Explorer

現代ブラウザであればほぼ利用可能です。

動作確認できる :has() サンプルコード集

サンプル1|フォームバリデーションをCSSだけで実装

子inputがinvalid状態なら、.form-groupを赤枠に変更します。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>CSS :has() Form Validation</title>
<style>
.form-group {
  padding: 8px;
  margin-bottom: 12px;
  border: 1px solid #ccc;
  border-radius: 4px;
}

/* 子inputがinvalidの場合に枠線強調 */
.form-group:has(input:invalid) {
  border-color: #e63946;
}
</style>
</head>
<body>
<h2>入力チェック例</h2>
<div class="form-group">
  <label>メールアドレス</label><br>
  <input type="email" required placeholder="email@example.com">
</div>

<div class="form-group">
  <label>必須入力</label><br>
  <input required placeholder="テキストを入力">
</div>
</body>
</html>

サンプル2|空状態(Empty State)メッセージをCSSのみで表示

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>CSS :has() Empty State</title>
<style>
.list {
  padding: 0;
  min-height: 50px;
}

/* liがない場合にメッセージ表示 */
.list:not(:has(li))::before {
  content: "アイテムがありません";
  color: #666;
}
</style>
</head>
<body>
<h2>空リストの例</h2>
<ul class="list"></ul>
</body>
</html>

サンプル3|チェック状態に応じたTODOリストUI改善

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>CSS :has() Todo UI</title>
<style>
.todo-item {
  display: flex;
  gap: 8px;
  align-items: center;
  margin-bottom: 6px;
}

/* チェック時に完了スタイル */
.todo-item:has(input:checked) {
  opacity: 0.5;
  text-decoration: line-through;
}
</style>
</head>
<body>
<h2>TODO管理例</h2>
<div class="todo-item">
  <input type="checkbox">
  <span>牛乳を買う</span>
</div>
<div class="todo-item">
  <input type="checkbox">
  <span>メール返信</span>
</div>
</body>
</html>

CSS :has() がUI/UX改善に役立つ理由

利点説明
JavaScript削減クラス操作やイベント監視が不要
メンテナンス性向上スタイルロジックをCSSで完結
高い可読性意図がCSSセレクタに直接反映
アクセシビリティ向上状態管理がHTML構造に準拠

フォーム、アコーディオン、ナビゲーションUIなどで特に効果的です。

まとめ|:has()は今すぐ導入すべきCSS最新仕様

  • CSSだけで親セレクタ的操作を実現
  • フォームバリデーション空表示UIなど複数ケースで実用可能
  • 主要ブラウザ対応済みで安心して利用できる
  • JS依存を減らし、保守性とパフォーマンスを向上

CSS設計の新しいスタンダードになりつつある機能です。

参考資料

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

新卒4年目です。spring boot, jquery, vue を使ってフロントエンド開発、quarkus、azure kubernetesを使ってバックエンドを作ってました。 今は、UXデザイナーを目指して勉強中です! よろしくお願いします。

コメント

コメントする

CAPTCHA


目次