CSS 疑似クラス :is() と :where()
CSS の関数疑似クラス :is()
と :where()
の使い方についての覚書です。
作成日:2024年4月2日
:is()
:is()
は、引数に渡されたセレクターのいずれかと一致する全ての要素を選択する関数疑似クラスです。
:is() を使用すると、セレクターの繰り返しを減らすことができます。
例えば、以下の記述は
:is() を使って以下のように記述することができます。
この場合、引数に3つのセレクター(.foo, .bar, .baz)を渡して、それらのいずれかの子要素の button:hover の文字色を設定しているので、上記と同じことになります。
同様に以下は、
:is() を使って以下のように記述することができます。
:is() を組み合わせて使用することもできるので、例えば、以下は
以下と同じことです。
以下は :is() を使って異なる深さの h2 要素にスタイルを適用する例です。
:is() を使わない場合、とても複雑になります(参考元:MDN :is() section セレクターの簡略化)。
詳細度
:is() の詳細度は、引数で与えられたセレクターの中で最も詳細度が高いものになります。
例えば、以下のような HTML があり、
以下の CSS を記述すると、
以下のように表示されます。
text
text
text
CSS を以下のように書き換えると、
:is(p, #qux)
は引数のセレクターに ID セレクター #qux
を持っているので、詳細度が p
や .foo
より高くなるため、p
と .foo
の文字色は plum
になります(#qux
が存在するかどうかは関係なし)。
#bar
は詳細度の高い ID セレクターなのと、:is()
の後に記述されているため、文字色は指定した tomato
になります。もし、:is(p, #qux)
の記述が #bar
の記述の後であれば、文字色は plum
になります。
text
text
text
寛容なセレクター解析
CSS はセレクターリストを使用している(複数のセレクターをカンマ区切りで指定している)場合、その中のセレクターのいずれか1つでも無効な場合、リスト全体が無効とみなされます。
例えば、以下の場合、:abc
という疑似セレクターは存在しないので、セレクター.bar:abc
は無効と解析されて、リスト全体が無効とみなされます。そのため、.foo
に color: red は適用されません。
:is() と次項の :where() は特別で、無効なセレクターが存在してもリスト全体が無効とみなされるのではなく、無効なセレクターは無視され、他のセレクターが使用されます。
以下のように :is() または :where() を使うと、無効なセレクターは無視され、有効なセレクターは機能するので、 .foo
にはスタイルが適用されます。
一部のブラウザでしかサポートされていないセレクタを使用する場合などに利用できそうです。
サポート状況
:is() は2021年1月からすべてのモダンブラウザで利用できるようになっています。現在では多くのデバイスやブラウザのバージョンで動作します。
詳細は以下で確認することができます。
:where()
:where() は :is() と同様、引数に渡されたセレクターのいずれかと一致する全ての要素を選択する関数疑似クラスです。
:where() と :is() の違いは、:is() は引数内で最も詳細度の高いセレクターの詳細度になるのに対して、:where() はセレクター全体の詳細度を高めない(詳細度が常に 0 である)ということだけです。
例えば、以下のような HTML がある場合、
:where() を使って、以下を記述すると、p と .foo 及び .bar にマッチする全ての文字色が cornflowerblue になります。
text (p)
CSS を以下のように書き換えると、
:where() はセレクター全体の詳細度を高めない(詳細度が常に 0 である)ため、詳細度の低いセレクターを使って設定を上書きすることができます。
text (p)
:is() に書き換えると、:is() はセレクターの中の最も高い詳細度になるので、p, div の設定より優先されます。
text (p)
サポート状況
:where() は :is() と同様、2021年1月からすべてのモダンブラウザで利用できるようになっています。現在では多くのデバイスやブラウザのバージョンで動作します。
詳細は以下で確認することができます。