[CSS] :has()が使えない時の対応方法
2023年10月現時点で、:has()セレクタが対応していないメジャーブラウザは、Firefoxのみです。
でも、このブラウザを無視することもできないので、以前からライブラリを作ろうかとか、対応方法を考えたりしていて、とりあえず現在の簡易な対応策を記載しておきます。
非対応ブラウザの場合の別表示方法
cssの@supportクエリで、以下のように記述すると、非サポートの場合のセレクタを書くことができます。@supports selector(:has(+ *)) {
.no-support {
display: none;
}
}
残念ながら、個別に対応を書かなければいけないのと、:has()を自動検出するのではなく、クラス名などを追記しておく必要があるので、あまり効率的とは言えないが、暫定作としては悪くはない。
裏技っぽい感じだが、知っておいて損はないやりかたかも。
Javascriptでハックプログラム制作中
個人的には、:has()は、とても使いやすい機能なので、是非ともFirefoxで正規採用してもらいたいが、機能インされたとて、アップデートされていないユーザーがいたら公開サーバーでは、すぐには使えないのが現状。 そこで、現在、Javascriptで、Firefoxで:has()を自動検知して、表示再現をするライブラリを構築中。 簡単な技術フローを記載しておく。1. styleタグ、または、linkタグを辿って、読み込むcssの文字列一覧を取得(cdnなどから大量になりそうな場合は、特定ファイルに限定する機能の想定) - この時、@importでの読み込みファイルにも対応予定 - document.stylesheetsを使っても、Firefoxでは、:has()セレクタが除外されてしまうので、仕方なく文字列取得を行う。 2. 読み込んだcss文字列から、正規表現で、:has(.+?){...}を取得する。 - これで、:has()の条件と、それに関連する対象のセレクタが取得できる。 - 条件に基づいたFirefox用のスタイルシート(セレクタ)を新規構築して追加(正規表現でヒットした同じ設定) - data-has="true"などの属性を付与したセレクタを構築 3. :has()の条件をjavascriptのobserverで監視 - 監視しながら、:has()の条件にマッチした場合に、新規作成したセレクタに適用する属性を付与する。 - 監視で、アンマッチになった場合は、属性を削除する。