:has()関係擬似クラス
強力な:has()関係擬似クラスを使い、子要素に基づいて親要素を選択します。
「:has()関係擬似クラス」はCoddyKit上の無料CSS Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCSS Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 CSS Academyコースには全4レッスンが含まれています。
:has()とは
:has()疑似クラスは、引数に一致する子孫要素を含む要素を選択します。「親セレクター」と呼ばれることも多く、子要素に基づいて親要素をスタイリングできます。これは、これまでCSSにはなかった機能です。
基本構文
.card:has(img)は、imgの子孫要素を含むすべての.card要素を選択します。引数は相対セレクターリストであり、対象要素を基準にした要素を表す有効なCSSセレクターを記述します。
親要素のスタイリング
無効な入力欄を含むフォームコンテナをスタイリングできます:form:has(:invalid) { border-color: red; }。見出しを含むセクションもスタイリングできます:section:has(h2) { padding-top: 2rem; }。子要素の状態に応じて、親要素の見た目を変更できます。
兄弟要素の選択
:has()を使うと、+や~ではできない先行する兄弟要素の選択も可能です。h2:has(+ p)は、直後にpが続くh2要素を選択します。li:has(~ .active)は、後続する兄弟要素に.activeを持つli要素を選択します。
フォーム状態のスタイリング
JavaScriptを使わずに、ネイティブのフォームの有効性に応じてスタイルを変更できます。input:has(~ .error-msg)は、兄弟要素としてエラーメッセージを持つ入力欄をスタイリングします。label:has(+ input:required)は、対応する入力欄が必須であるラベルをスタイリングします。すべてCSSだけで実現できます。
ナビゲーションの状態
アクティブな子要素に基づいてナビゲーションコンテナを強調表示できます。nav:has(.active)は、子要素のいずれかがactiveクラスを持つとき、nav全体にスタイルを適用します。コンテナのレベルで、現在のナビゲーションセクションを示すのに便利です。
他の疑似クラスとの組み合わせ
.grid:has(.card:focus-within)は、いずれかのカードがキーボードフォーカスを受け取ったとき、グリッド全体をスタイリングします。.dropdown:has(:hover)は、子孫要素のいずれかにホバーしている間、ドロップダウンを開いたままにします。複雑な兄弟コンビネータの連鎖よりもすっきりと記述できます。
CSSにおけるメディアクエリ相当
.sidebar:has(nav)は、.sidebar:not(:has(nav))とは異なるレイアウトを適用します。JavaScriptを使わずに条件付きレイアウトを実現できます。特定の子要素の有無によって親要素のレイアウトが決まり、真に適応的でコンテンツを認識するCSSが可能になります。
パフォーマンスに関する考慮事項
広範な引数セレクター(例::has(*))を使った:has()は、ブラウザがすべての要素を確認する必要があるため、処理コストが高くなることがあります。:has()の引数は具体的にしてください。可能な場合は、:has(.specific-child)(任意の子孫要素)よりも:has(> .specific-child)(直接の子要素)を優先します。
ブラウザ対応
:has()は、Chrome 105以降、Safari 15.4以降、Firefox 121以降でサポートされています。2023年後半から完全なBaseline対応になっています。ポリフィルは存在しません(JavaScriptによるシミュレーションが必要になるためです)。古いブラウザでは機能が必須でない場合に、Progressive Enhancementとして使用してください。
JavaScriptパターンの置き換え
以前はJSのイベントリスナーが必要だった「子要素にフォーカスがあるときに親要素へクラスを追加する」「modal-triggerが存在するときにオーバーレイを表示する」「項目がちょうど3つあるときにグリッドのスタイルを変更する」といったパターンを、:has()で扱えます。これらをすべて宣言的に記述できます。
理解度チェック
:has()は、+や~のような既存のCSSコンビネータと比べて、何が特徴的ですか?
まとめ
:has()は、CSSで初めての真の関係性疑似クラスであり、親要素や先行する兄弟要素を選択できます。コンテンツ主導のスタイリング、フォーム状態への反応、ナビゲーションの強調表示などを実現し、これまでJavaScriptによるDOM操作が必要だった多くのパターンを、CSSだけで宣言的に記述できます。
よくある質問
「:has()関係擬似クラス」レッスンは無料ですか?
はい。「:has()関係擬似クラス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、CSS Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 CSS Academyコースには全4レッスンが含まれています。
「:has()関係擬似クラス」で何を学びますか?
強力な:has()関係擬似クラスを使い、子要素に基づいて親要素を選択します。 ブラウザで直接実行するハンズオンコードでCSS Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
CSS Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCSS Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「:has()関係擬似クラス」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCSS Academyレッスンでコードを書いて実行できますか?
はい。すべてのCSS Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。