CSS セレクタとは
セレクタはルールの波かっこより前の部分です。宣言をどの要素に適用するかを決めます。
p.note { color: #2563eb; }
/* selector: p.note declaration: color: #2563eb */
実際のスタイルシートのほとんどは、次の 5 つの基本セレクタで書けます:
セレクタの種類一覧
| セレクタ | 例 | 一致するもの |
|---|---|---|
| 全称 | * | すべての要素 |
| 型 | p | すべての <p> |
| クラス | .tip | class="tip" を持つ要素 (他のクラスがあっても可) |
| ID | #main-title | id="main-title" を持つ要素 |
| 属性 | [type="email"] | 属性が一致する要素 |
| 疑似クラス | a:hover, li:first-child | ある状態や位置にある要素 |
| 疑似要素 | p::first-line, .x::before | 要素の一部分 |
| グループ | h1, h2, h3 | リストのいずれかに一致するもの |
| 複合 | p.tip | そのクラスも持つ <p> |
クラスと ID は CSS クラスセレクタ のページで、:nth-child() や :not() などの疑似クラスは 疑似クラスのページ で解説しています。
結合子: 子孫と子
結合子は、HTML ツリー内の関係によって 2 つのセレクタをつなぎます。全部で 4 つあります。
| 結合子 | 書き方 | B が一致する条件 |
|---|---|---|
| 子孫 | A B (スペース) | B が A の内側のどこかにある |
| 子 | A > B | B の親が A |
| 隣接兄弟 | A + B | B が A の直後にあり、親が同じ |
| 一般兄弟 | A ~ B | B が A より後のどこかにあり、親が同じ |
混同されやすいのはスペースと > です。子孫セレクタはどの深さにも届き、子セレクタは 1 階層で止まります:
兄弟結合子: + と ~
兄弟は前方しか見ません。「前の兄弟」を選ぶ結合子はありませんが、:has() で表現できます。h2:has(+ p) は直後に p が続く h2 に一致します。
属性セレクタ
角かっこで、属性とその値に基づいて一致させます:
| セレクタ | 一致するもの |
|---|---|
[disabled] | その属性を持つ (値は何でもよい) |
[type="email"] | 値がちょうど email |
[href^="https"] | 値が https で始まる |
[href$=".pdf"] | 値が .pdf で終わる |
[class*="icon"] | 値のどこかに icon を含む |
[lang|="en"] | 値が en、または en- で始まる |
[data-state="open" i] | 大文字と小文字を区別しない完全一致 |
data-* 属性に対する属性セレクタは、クラス名を考え出さずに、JavaScript が設定する状態をスタイルするきれいな方法です。
セレクタを試してみる
ボックスにセレクタを入力してください。一致したすべての要素にオレンジ色のアウトラインが付き、その下に件数が表示されます。
#demo a、ul > li、h2 ~ *、a[href^="https"]、li:not(.active) を試してみてください。
複合と子孫: スペースが意味を変える
p.note と p .note はスペース 1 つの違いですが、意味が異なります。
ブラウザのセレクタの読み方
複数のルールが同じ要素に一致し、同じプロパティを設定するときは、詳細度の高いセレクタが勝ち、同じなら後のルールが勝ちます。ID はクラスがいくつあっても上回り、クラスは型セレクタがいくつあっても上回ります。詳細度の表の全体は !important のページ にあります。
グループには 1 つ落とし穴があります。通常のリストのうち 1 つでも無効なセレクタがあると、ルール全体が捨てられます。a, b:unknown { } ではリンクさえスタイルされません。リストを :is() で囲むと寛容になり、:is(a, b:unknown) ならリンクはスタイルされます。
よくある間違い
- ドットやハッシュを忘れる。
tip { }はclass="tip"ではなく<tip>要素を対象にします。.tipと書きましょう。 - 複合セレクタにスペースを入れる。
p .noteはp.noteではありません。 >が孫要素にも届くと思う。 どの深さにも届かせるならスペースを使います。- 1 つのタイプミスでグループ全体が壊れる。
h1, h2:hovr, h3では何もスタイルされません。 - 長すぎるセレクタ。
body div.wrapper ul li aは読みにくく、上書きもしにくくなります。ほとんどの場合、クラス 1 つで十分です。
よくある質問
CSS セレクタとは何ですか?
CSS ルールの { より前の部分で、宣言をどの要素に適用するかを指定します。p.note { color: blue; } では、セレクタ p.note がクラス note を持つすべての <p> に一致します。
CSS セレクタのスペースと > の違いは何ですか?
スペースは子孫結合子です。nav a は nav の内側にあるすべてのリンクに、深さに関係なく一致します。> は子結合子です。nav > a は直接の親が nav であるリンクだけに一致します。
CSS の + は何を意味しますか?
+ は隣接兄弟結合子です。h2 + p は、同じ親を持ち <h2> の直後にある <p> に一致します。~ はもっと緩く、h2 ~ p は後ろにあるすべての兄弟の <p> に一致します。
CSS で属性を使って要素を選択するには?
属性を角かっこで囲みます。[disabled] はその属性を持つ要素、[type="email"] は値の完全一致、[href^="https"] は値がその文字列で始まるもの、[href$=".pdf"] は終わるもの、[class*="btn"] は含むものに一致します。
CSS で親要素を選択できますか?
できます。:has() 疑似クラスを使います。現在の Chrome、Firefox、Safari で使えます。li:has(> a.active) は、アクティブなリンクを直接含むリスト項目に一致します。