:contains() 疑似クラスで「foo が bar を含む」セレクターを作成
CSSセレクター「foo が bar を含む」
この解説では、HTML要素 foo
が文字列 bar
を含む場合に適用されるCSSセレクターについて説明します。いくつかの方法があり、それぞれ異なる利点と欠点があります。
方法 1: :contains() 疑似クラス
最も簡単な方法は、:contains()
疑似クラスを使用するものです。
.foo:contains(bar) {
/* スタイル */
}
このセレクターは、foo
要素内のテキストノード全体を検索し、bar
文字列を含む要素にスタイルを適用します。部分一致だけでなく完全一致にも対応します。
利点:
- シンプルで分かりやすい
- 部分一致と完全一致の両方に対応
- パフォーマンスが遅い可能性がある
- ネストされた要素には適用されない
- 大文字と小文字を区別しない
より複雑な条件を設定するには、:matches()
疑似クラスを使用できます。
.foo:matches(:contains(bar), .bar) {
/* スタイル */
}
このセレクターは、foo
要素が bar
文字列を含むか、bar
クラスを持つ場合にスタイルを適用します。
- 複数の条件を組み合わせられる
- 少し複雑
方法 3: ::text 疑似要素
大文字と小文字を区別したい場合は、::text
疑似要素を使用できます。
.foo::text:contains(bar) {
/* スタイル */
}
- 部分一致には対応しない
HTML:
<div class="foo">
<h1>タイトル</h1>
<p>本文にbarが含まれています</p>
<span class="bar">bar</span>
</div>
CSS:
/* 方法 1: :contains() 疑似クラス */
.foo:contains(bar) {
color: red;
}
/* 方法 2: :matches() 疑似クラス */
.foo:matches(:contains(bar), .bar) {
background-color: yellow;
}
/* 方法 3: ::text 疑似要素 */
.foo::text:contains(bar) {
font-weight: bold;
}
結果:
- 方法 1:
foo
要素内のすべてのテキストが赤色になります。 - 方法 2:
foo
要素内のbar
文字列とbar
クラスを持つ要素が黄色になります。
このコードを参考に、目的に合ったCSSセレクターを作成してください。
他の方法
:has()
疑似クラスは、特定の子要素を持つ要素を選択できます。
.foo:has(:text(bar)) {
/* スタイル */
}
- ブラウザの対応状況がまだ限定的
:is()
疑似クラスは、複数のセレクターを組み合わせて、1つのセレクターとして使用できます。
.foo:is(:contains(bar), .bar) {
/* スタイル */
}
上記2つの方法は、まだブラウザの対応状況が限定的ですが、将来的には主流になる可能性があります。
css css-selectors