CSSの:has()がブラウザで使用できるかを@supportsで検出するには、:has(*)ではなく、:has(+ *)にする必要がある

CSSの:has()がブラウザで使用できるかどうかを@supports selector()で検出するには、:has(*)ではなく、:has(+ *)が必要です。

これは2023年現在、:has()はFirefoxを除くすべての主要ブラウザでサポートされていますが、Firefoxで実験的な機能としてサポートされているためです。

CSSの:has()がブラウザで使用できるかどうかを@supportsで検出するには、:has(*)ではなく、:has(+ *)にする必要がある

CSS :has() feature detection with @supports(selector(…)): You want :has(+ *), not :has(*)
by @Bramus

下記は各ポイントを意訳したものです。
※当ブログでの翻訳記事は、元サイト様にライセンスを得て翻訳しています。

はじめに

CSSの:has()を@supports selector()で検出するには:has(*)ではなく、:has(+ *)が必要です。

:has(+ *)に注目!

:has(+ *)に注目!

CSSの:has()を検出するには

CSSの:has()セレクタをブラウザで使用できるか検出するには、@supports(selector(…))を使用することができます。その際、引数に有効なセレクタを含めることが重要です。

以前にもツイートしましたが、機能クエリで使用する場合は*などのセレクタを:has()に渡す必要があります。

💁‍♂️ 当初このセレクタの要件はSafariだけのものでしたが、仕様レベルで調整され、他のすべてのブラウザの要件となりました。

私はこのテクニックを使用して、:has()を使用した条件付きでメッセージを表示するデモを作成しました。

:has()をブラウザがサポートしていない場合、そのことを伝えるメッセージが表示されます。下記はFirefoxの場合で、2023年1月現在Firefoxはまだ:has()をサポートしていません。

サイトのキャプチャ

Firefoxでデモページを表示

Firefoxは:has()をサポートしてないため、デモを表示するとメッセージが表示されます。

:has(*)を使用した場合の問題点

前述の方法で:has()を機能的に検出することはできますが、100%ではありません。その犯人はFirefoxで、実験的な機能でサポートされているからです。

Firefoxでlayout.css.has-selector.enabledのフラグをオンにすると、@supports selector(:has(*))を使用したときにサポートされていると主張します。しかし、この実験的な実装では相対セレクタの解析が(まだ)サポートされていないという事実は説明されていません。

前述のデモでは:has()内で相対セレクタを使用しているので、フラグがオンになっている場合でもメッセージを表示させたいと考えます。そのための解決策は:has()の引数に+ *のような相対セレクタを記述することです。

デモとコード

デモで使用している完全コードは、下記の通りです。この記述で両方のレベルのサポートを検出することができ、またサポートが要求された場合には特定のボックスを表示することもできます。

まずは、メッセージのHTML。

メッセージのスタイルと:has()の検出方法のCSS。

終わりに

@supportsを使用して:has()の機能を検出する場合、セレクタを:has()に渡す必要があります。引数は*でもかまいませんが、:has()内で使用される相対セレクタに依存している場合は、@supports selector(:has(+ *))を使用してください。これは2023年1月現在相対セレクタのサポートがない:has()実験的なサポートをオンにしたFirefoxを除外するために行う必要があります。

sponsors

top of page

©2024 coliss