Menu

CSS セレクタ一覧: 種類、結合子、属性セレクタ

CSS セレクタは、ルールがスタイルを当てる要素を選びます。すべてのセレクタの種類、4 つの結合子 (子孫、子、隣接兄弟、一般兄弟)、属性セレクタ、グループ化を解説し、セレクタをその場で試せます。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

CSS セレクタとは

セレクタはルールの波かっこより前の部分です。宣言をどの要素に適用するかを決めます。

p.note { color: #2563eb; }
/* selector: p.note    declaration: color: #2563eb */

実際のスタイルシートのほとんどは、次の 5 つの基本セレクタで書けます:

セレクタの種類一覧

セレクタ例一致するもの
全称*すべての要素
型pすべての <p>
クラス.tipclass="tip" を持つ要素 (他のクラスがあっても可)
ID#main-titleid="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 > BB の親が A
隣接兄弟A + BB が A の直後にあり、親が同じ
一般兄弟A ~ BB が 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) は、アクティブなリンクを直接含むリスト項目に一致します。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める