セレクターズ レベル4

W3C ワーキングドラフト,

この文書についての詳細
このバージョン:
https://www.w3.org/TR/2026/WD-selectors-4-20260122/
最新版公開バージョン:
https://www.w3.org/TR/selectors-4/
編集者草案:
https://drafts.csswg.org/selectors/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/selectors-4/
フィードバック:
CSSWG イシューレポジトリ
仕様内でインライン
編集者:
Elika J. Etemad / fantasai (Apple)
Tab Atkins Jr. (Google)
以前の編集者:
Tantek Çelik
Daniel Glazman
Ian Hickson
Peter Linss
John Williams
この仕様の編集提案:
GitHub エディタ
テストスイート:
https://wpt.fyi/results/css/selectors/

概要

セレクターはツリー内の要素に一致するパターンであり、したがってドキュメント内のノードを選択するために使用できるいくつかの技術の一つを構成します。セレクターはHTMLやXMLでの使用に最適化されており、パフォーマンスが重要なコード内でも利用可能になるように設計されています。セレクターはCSS(カスケーディング・スタイル・シート)のコアコンポーネントであり、CSSはセレクターを用いてスタイルプロパティをドキュメント内の要素にバインドします。Selectors Level 4は、すでに[SELECT]で存在するセレクターについて記述しており、さらにCSSおよびその他の言語向けに新たなセレクターを導入しています。

CSSは、構造化ドキュメント(HTMLやXMLなど)の画面上、印刷上などでのレンダリングを記述するための言語です。

この文書のステータス

このセクションは、本書が公開された時点でのステータスについて記述しています。 現在のW3C出版物の一覧と、この技術報告書の最新リビジョンは W3C標準とドラフトのインデックスから閲覧可能です。

この文書はCSS作業部会によって勧告トラックを使用してワーキングドラフトとして公開されました。 ワーキングドラフトとしての公開は、W3Cおよびメンバーによる承認を意味しません。

これはドラフト文書であり、 今後いつでも他の文書によって更新、差し替え、 あるいは廃止される可能性があります。 本文書を作業途中のもの以外として引用するのは不適切です。

フィードバックはGitHubにIssueを提出(推奨)してお送りください。その際、タイトルに仕様コード「selectors」を含めてください。例:「[selectors] …コメントの要約…」。 すべてのIssueとコメントはアーカイブされます。 または、 (アーカイブあり) の一般メーリングリストwww-style@w3.orgに送ることもできます。

この文書は2025年8月18日 W3Cプロセス文書によって管理されています。

この文書はW3C特許ポリシーの下で運営されるグループによって作成されました。 W3Cはグループの成果物に関連してなされた特許開示の公開リストを維持しています; そのページには特許開示の方法も記載されています。 個人が対象特許を実際に知っていて、それが必須クレームに該当すると思う場合、 W3C特許ポリシー6節に従って情報を開示しなければなりません。

次の機能はリスクありと見なされていて、CR期間中に削除される可能性があります:

「リスクあり」はW3Cプロセス上の専門用語であり、必ずしもその機能が削除や遅延の危険にさらされていることを意味するものではありません。これはWGが機能を互換的にタイムリーに実装できない可能性があると判断しており、そう記すことで、必要な場合にプロポーズド勧告段階に移行する際、その機能だけを削除した新たな候補勧告をまず公開せずに済むことを意味します。

1. はじめに

このセクションは規範的ではありません。

テスト

このセクションは規範的ではなく、テストは不要です。


セレクターはツリー構造内の要素を受け取り、その要素がセレクターに一致するかどうかを判定するブール述語です。

これらの式は様々な用途で使われます:

Selectors Level 1、2、3はそれぞれCSS1CSS2.1Selectors Level 3仕様で定義されたセレクター機能の部分集合です。本モジュールはSelectors Level 4を定義します。

1.1. モジュールの相互関係

テスト

このセクションにはテストは不要です。


本モジュールは、[SELECT]および[CSS21]でCSS用に定義されたセレクターの定義を置き換え、拡張します。

描画ツリーの抽象要素を定義する疑似要素セレクターは本仕様には含まれていません。 疑似要素の一般的な構文はここで説明しますが、描画モデルとの強い統合やDOMクエリ等他用途への無関係さのため、それらの詳細は他のモジュールで定義されます。

2. セレクターの概要

このセクションは規範的ではなく、以下のセクションの要約のみを行います。

テスト

このセクションは規範的ではなく、テストは不要です。


セレクターは構造を表現します。この構造は(例えばCSSルールで)条件として使われ、文書ツリー内でどの要素がセレクターに一致するかを判定したり、その構造に対応するHTMLやXML断片の平易な記述として用いることができます。

セレクターは単純な要素名から文脈依存のリッチな表現までさまざまです。

以下の表はセレクター構文の概要です:

パターン 表すもの レベル
* あらゆる要素 § 5.2 ユニバーサルセレクター 2
E E型の要素 § 5.1 型(タグ名)セレクター 1
E:not(s1, s2, …) セレクターs1s2いずれにも一致しないE要素 § 4.3 否定(ひとつも一致しない)擬似クラス: :not() 3/4
E:is(s1, s2, …) セレクターs1またはs2に一致するE要素 § 4.2 いずれか一致する擬似クラス: :is() 4
E:where(s1, s2, …) s1またはs2に一致するが、詳細度には寄与しないE要素 § 4.4 詳細度調整用擬似クラス: :where() 4
E:has(rs1, rs2, …) E要素を基準アンカーとしたときに、rs1またはrs2どちらかの相対セレクターに一致する要素が存在する場合のE要素 § 4.5 関係擬似クラス: :has() 4
E.warning クラスwarningに属するE要素(クラスの定義は文書言語に依存) § 6.6 クラスセレクター 1
E#myid ID が myid の E 要素。 § 6.7 IDセレクター 1
E[foo] foo属性を持つE要素 § 6.1 属性の存在と値セレクター 2
E[foo="bar"] foo属性の値がbarと完全一致するE要素 § 6.1 属性の存在と値セレクター 2
E[foo="bar" i] foo属性の値がASCII範囲の大文字小文字を区別せずにbarと一致するE要素 § 6.3 大文字小文字の区別 4
E[foo="bar" s] 厳密に一致する場合のfoo属性値がbarのE要素 § 6.3 大文字小文字の区別 4
E[foo~="bar"] foo属性が空白区切り値のリストで、そのうち1つがbarと完全一致するE要素 § 6.1 属性の存在と値セレクター 2
E[foo^="bar"] foo属性値がbarで始まるE要素 § 6.2 部分一致属性セレクター 3
E[foo$="bar"] foo属性値がbarで終わるE要素 § 6.2 部分一致属性セレクター 3
E[foo*="bar"] foo属性値にbarを含むE要素 § 6.2 部分一致属性セレクター 3
E[foo|="en"] foo属性値がハイフン区切りリストで、先頭がenで始まるE要素 § 6.1 属性の存在と値セレクター 2
E:dir(ltr) 左から右方向(ltr)のE型要素(方向性の判定方法は文書言語に依存) § 7.1 方向性擬似クラス: :dir() 4
E:lang(zh, "*-hant") 中国語(いずれの方言・書記体系でも)や、その他繁体字で書かれているとタグ付されたE型要素 § 7.2 言語擬似クラス: :lang() 2/4
E:any-link ハイパーリンクのソースアンカーとなるE要素 § 8.1 ハイパーリンク擬似クラス: :any-link 4
E:link ターゲットが未訪問であるハイパーリンクのソースアンカーとなるE要素 § 8.2 リンク履歴擬似クラス: :link および :visited 1
E:visited ターゲットが既に訪問済みであるハイパーリンクのソースアンカーとなるE要素 § 8.2 リンク履歴擬似クラス: :link および :visited 1
E:target 現在のURLのターゲットであるE要素 § 8.3 ターゲット擬似クラス: :target 3
E:scope スコープルートとなるE要素 § 8.4 参照要素擬似クラス: :scope 4
E:active アクティブ状態のE要素 § 9.2 アクティベーション擬似クラス: :active 1
E:hover カーソルが重なっている、または子孫のいずれかにカーソルが重なっているE要素 § 9.1 ポインターホバー擬似クラス: :hover 2
E:focus ユーザー入力フォーカスを持つE要素 § 9.3 入力フォーカス擬似クラス: :focus 2
E:focus-within フォーカスを持つか、フォーカスを持つ要素を子孫に含むE要素 § 9.5 フォーカスコンテナ擬似クラス: :focus-within 4
E:focus-visible ユーザー入力フォーカスを持ち、UAがフォーカスリング等のインジケータを描画すべきだと判定したE要素 § 9.4 フォーカスインジケータ擬似クラス: :focus-visible 4
E:enabled
E:disabled
有効/無効状態のUI要素E § 12.1.1 :enabled と :disabled 擬似クラス 3
E:read-write
E:read-only
ユーザーが変更可能/不可能なUI要素E § 12.1.2 可変性擬似クラス: :read-only と :read-write 3-UI/4
E:placeholder-shown プレースホルダーテキストを現在表示している入力コントロール § 12.1.3 プレースホルダー表示擬似クラス: :placeholder-shown 3-UI/4
E:default 複数選択肢があるグループでデフォルトとなる項目のUI要素E § 12.1.5 デフォルトオプション擬似クラス: :default 3-UI/4
E:checked
E:unchecked
E:indeterminate
チェック済み/未チェック/中間状態のUI要素E(ラジオボタンやチェックボックスなど) § 12.2 入力値の状態 3
E:valid
E:invalid
自身のデータ有効性制約を満たす/満たさないユーザー入力要素E § 12.3.1 有効性擬似クラス: :valid / :invalid 3-UI/4
E:in-range
E:out-of-range
値が範囲内/範囲外であるユーザー入力要素E § 12.3.2 範囲擬似クラス: :in-range / :out-of-range 3-UI/4
E:required
E:optional
入力が必須/任意のユーザー入力要素E § 12.3.3 任意性擬似クラス: :required / :optional 3-UI/4
E:user-invalid ユーザーによって変更され、かつ不正(無効や範囲外、必須未入力など)なユーザー入力要素E § 12.3.4 ユーザー操作による有効性擬似クラス: :user-valid / :user-invalid 4
E:root 文書のルートとなるE要素 § 13.1 :root 擬似クラス 3
E:empty 空要素(空白以外に子要素やテキストを持たないE要素) § 13.2 :empty 擬似クラス 3
E:nth-child(n [of S]?) Sに一致する親のn番目のE要素 § 13.3.1 :nth-child() 擬似クラス 3/4
E:nth-last-child(n [of S]?) Sに一致する親の後ろからn番目のE要素 § 13.3.2 :nth-last-child() 擬似クラス 3/4
E:first-child 親の最初の子要素であるE要素 § 13.3.3 :first-child 擬似クラス 2
E:last-child 親の最後の子要素であるE要素 § 13.3.4 :last-child 擬似クラス 3
E:only-child 親に一つだけ存在するE要素 § 13.3.5 :only-child 擬似クラス 3
E:nth-of-type(n) 同型兄弟のうちn番目のE要素 § 13.4.1 :nth-of-type() 擬似クラス 3
E:nth-last-of-type(n) 同型兄弟のうち後ろからn番目のE要素 § 13.4.2 :nth-last-of-type() 擬似クラス 3
E:first-of-type 同型兄弟の最初のE要素 § 13.4.3 :first-of-type 擬似クラス 3
E:last-of-type 同型兄弟の最後のE要素 § 13.4.4 :last-of-type 擬似クラス 3
E:only-of-type 同型兄弟で唯一のE要素 § 13.4.5 :only-of-type 擬似クラス 3
E F E要素の子孫となるF要素 § 14.1 子孫結合子 ( ) 1
E > F E要素の直接の子であるF要素 § 14.2 子結合子 (>) 2
E + F E要素に直前に位置するF要素 § 14.3 直後兄弟結合子 (+) 2
E ~ F E要素に先行するF要素 § 14.4 後続兄弟結合子 (~) 3

注: 上記で「3-UI」と記したLevel 4セレクターの一部は、[CSS3UI]で導入されたものです。

テスト

Tests that do not relate to any section


3. セレクターの構文と構造

3.1. 構造と用語

セレクターは、ツリー構造内の特定の要素パターンを表します。 セレクターという用語は、単純セレクター複合セレクター複雑セレクター、またはセレクターリストを指すことがあります。 セレクターの対象は、 そのセレクターが定義されている任意の要素、 すなわちそのセレクター一致する要素です。

単純セレクターは、要素に対する単一の条件です。 型セレクターユニバーサルセレクター属性セレクタークラスセレクターIDセレクター、 または擬似クラス単純セレクターです。 (これは、セレクターの<simple-selector>として構文で表されます。) ある要素が単純セレクター一致すると言うのは、 この仕様および文書言語に従って、 その単純セレクターが要素を正確に記述している場合です。

複合セレクターは、 単純セレクターが結合子なしで連続したシーケンスであり、 単一の要素に対する同時の条件集合を表します。 もし型セレクターまたはユニバーサルセレクターを含む場合、それはシーケンスの最初でなければなりません。 シーケンス中に型セレクターまたはユニバーサルセレクターは1つだけ許されます。 (複合セレクターはセレクターの<compound-selector>として構文で表されます。) ある要素が複合セレクター一致するとは、 その複合セレクター内の全ての単純セレクターに一致する場合です。

注: 空白は子孫結合子を表すため、 複合セレクター内の単純セレクター同士の間には空白を入れてはいけません。

疑似複合セレクターとは、疑似要素セレクターであり、必要に応じて追加の疑似クラスセレクターが続く場合があります。また、必要に応じて複合セレクターまたは他の疑似複合セレクターが前に配置される場合もありますが、結合子は含まれません。 (疑似複合セレクターは、セレクター<pseudo-compound-selector>として文法内で表現されています。) 疑似要素は、指定された疑似要素名が一致し、追加の疑似クラスによる条件にも一致し、隣接する直前のセレクターによって表される発生元要素を持つ場合、疑似複合セレクターに一致します。 もし隣接する直前のセレクターが存在しない場合は、全称セレクターが仮定されます。 (例えば、.foo ::before.foo *::beforeと同等であり、.foo::beforeとは異なります。)

例えば .foo::before:hover では、 .foo複合セレクター::before:hover疑似複合セレクターです。 しかし、.foo::before::markerでは、::before::markerは別々の疑似複合セレクターとなります。

注: 疑似複合セレクター複合セレクターではなく複合セレクターのみが要求される場所で使用できません。疑似複合セレクターは自分自身と結合子を持つかのように動作し、 起源要素との関係を表します。 これは>結合子が親要素との関係を表すのと同様です。

結合子は、 両側の複合セレクターで表される二つの要素間の関係条件です。 Selectors Level 4での結合子には、 子孫結合子(空白)、 子結合子(U+003E,>)、 直後兄弟結合子(U+002B,+)、 後続兄弟結合子(U+007E,~)があります。 二つの要素が、これらの間に定められた関係条件を満たすとき、その結合子に一致すると言います。

複雑セレクターは、 一つ以上の複合セレクターおよび/または疑似複合セレクターを、 複合セレクター同士は結合子で区切ったシーケンスです。 これは、結合子で規定される関係内にある要素群に対する同時条件群を表します。 (複雑セレクターは<complex-selector>として構文で表されます。) ある要素または疑似要素が複雑セレクターに一致すると言うのは、 シーケンスの最後の複合/疑似複合セレクターに一致し、 かつその前の各単位も前に続く要素または疑似要素に 結合子で区切られた正しい関係を持つ場合 (または疑似複合セレクターの場合は正しい起源要素関係を持つ場合)です。

例えば、.foo.barは "foo"と"bar"の両クラスを持つ要素に一致します。

.ancestor > .foo.barはそれらのうち、親要素 (>結合子で示される)が"ancestor"クラスを持つものだけに一致します。

.foo.bar::beforeは、 ::beforeという疑似要素で、 その起源要素.foo.barに一致する場合です。

単純/複合/複雑セレクターのリストは、 単純複合、 または複雑セレクターのカンマ区切りのリストです。 この型が文脈で重要でなかったり明示されている場合は、単にセレクターリストとも呼ばれます。 型が重要かつ未指定の場合は、複雑セレクターのリストを意味します。 (§ 4.1 セレクターリストや構文の各<*-selector-list>生成規則参照。) ある要素がセレクターリスト一致するとは、 そのセレクターリスト内のいずれかひとつのセレクターに一致する場合です。

3.2. データモデル

セレクターはDOMなどの要素ツリーに対して評価されます。[DOM] この仕様内では「文書ツリー」や「ソース文書」と呼ぶこともあります。

各要素は、以下の5つの側面のいずれも持つことができ、 それぞれに対して選択ができ、すべて文字列として照合されます:

多くのセレクターは、文書言語(すなわち文書ツリーの言語と意味)や、 ホスト言語(セレクター構文を使用する言語)の意味に依存します。 例えば、:lang()セレクターは文書言語(例: HTML)に 要素がどのように言語と関連付けられるかの定義を依存します。 少し異なる例として、 ::first-line疑似要素は ホスト言語(例: CSS))に その::first-line疑似要素の意味や動作を委ねています。

3.2.1. 属性のない要素

テスト

個々の要素が上記のいずれの特徴も持たない場合もありますが、 いくつかの要素は特徴なし(featureless)となります。 特徴なし要素は、 いかなるセレクターにも一致しませんが、以下の例外を除きます:

もしもデフォルト名前空間[CSS-NAMESPACES-3]の存在(特徴なし要素は明示されない限り名前空間を持たないため)を除けば、あるセレクターが特徴なし要素に一致する場合、 デフォルト名前空間は一致を妨げません。

例えば、シャドウホストシャドウツリー内で特徴なしとなり、 いかなる疑似クラスにも一致しません(ただし:host および:host-context()を除きます。あるいはそれらを含む組合せ、 例: :is(:host, :root))。

:not(.foo:host)のような論理結合も、ホスト要素には決して一致しません (たとえ"foo"クラスが付いていなくても)、 これは.foo:host内のすべての単純セレクターがシャドウホストに一致できないためです。

同様に、:not(:host > .foo)シャドウホストには 決して一致しません。 たとえシャドウホストが自分自身の子孫ではなく かつ"foo"クラスを持たなくても、 複雑セレクター引数(.foo)の主語が シャドウホストに一致できないためです。

一般に、特徴なし要素を一致させるには、 明示的にそれと一致可能な単純セレクター を使う必要があり、 これらの要素をうっかり選択してしまうリスクを回避します (このため意図的に容易に無視できるようになっています)。 例えば、*特徴なし要素には決して一致しません。

上述の:has()のルールも同様に機能します。 シャドウホスト.foo子孫を含んでいたとしても、:has(.foo)は一致しません。 なぜなら残りの複合セレクター (空) に一致可能な単純セレクターがホストに含まれないためです。 ホスト要素に一致させるには:host:has(.foo)を書く必要があります。

3.3. スコープ付きセレクター

一部のホストアプリケーションは、セレクターを特定のドキュメント部分木またはフラグメントにスコープすることを選択する場合があります。 このスコープされる部分木のルートは、スコーピングルートと呼ばれます。

セレクターがスコープ付きである場合、 その要素がスコープルートの子孫であればのみ一致します。 (それ以外の部分は制限なく一致可能です; スコープ内に最終的に一致する要素であることのみが条件です。)

例えば、 querySelector()メソッド([DOM]に定義)は、 セレクターを呼び出した要素を基準にスコープ付きとして評価できます。

widget.querySelector("a") のような呼出しでは a 要素はwidget要素内のみ検索されます。 それ以外の場所の a 要素は無視されます。

3.4. 相対セレクター

特定の文脈においては、相対セレクターが利用できます。 これらは要素を一つ以上の相対セレクターアンカー要素に対して相対的に表現するセレクターの短縮形です。 相対セレクターは結合子で始まり、 先頭にアンカー要素を表現するセレクターが暗黙で入ります。 (結合子が存在しない場合、 子孫結合子が暗黙となります。)

相対セレクターは、セレクター文法において<relative-selector>として表現され、 それらのリストは<relative-selector-list>で表されます。

3.5. 疑似クラス

疑似クラス単純セレクターの一種で、 文書ツリー外の情報や、他の単純セレクターでは表現しにくい/不可能な基準で選択を可能にします。 また、動的であり得ます。 つまりユーザーが操作することで要素が疑似クラスを獲得・喪失することができ、 文書自体に変化がなくとも状態が変化します。疑似クラスは文書ソースやツリーに現れず、またそれを変更もしません。

疑似クラスの構文は ":" (U+003A コロン) に続いて、そのCSS 識別子名を書きます。 そして関数疑似クラスの場合、 引数を含む丸括弧が続きます。

例えば、:validは 通常の疑似クラスであり、 :lang()関数疑似クラスです。

全てのCSSキーワード同様、疑似クラス名はASCII 大文字小文字無視です。 疑似クラス名の直前のコロンと名前の間に 空白は許可されません。 また、CSS構文の通例として、 関数疑似クラス名と開き括弧の間の空白も認められません (両者でCSS 関数トークンとなります)。 ただし、通常通り 関数疑似クラスの括弧内の引数の前後には(指定がなければ)空白を入れてもかまいません。

他の単純セレクター同様、疑似クラスは セレクター内のすべての複合セレクターで許可され、 型セレクター全称セレクターの後に置く必要があります(もし存在するなら)。

注意: 一部の疑似クラスは互いに排他的 (このためそれらを同時に含む複合セレクターは 妥当でも何にも一致しなくなります)ですが、 その他は同時に一つの要素に適用できます。

3.6. 疑似要素

テスト

一部の疑似クラスが文書ツリー内に直接現れない追加の状態情報を表すのと同様に、 疑似要素は文書ツリーに直接存在しない要素を表します。 疑似要素はドキュメントツリーの持つ以上の抽象的な構成要素を作成するために使用されます。 例えば、 疑似要素は文書内の一部分を選択できますが、 これらの部分は文書言語の要素に対応せず (要素の境界に一致しない範囲やツリー構造内に収まらない範囲を含む)、 文書ツリー内に存在しない内容や別の射影(プロジェクション)内容、 またはスタイリング・レイアウト・ユーザー操作・その他ドキュメントツリーに反映されない様々なプロセスによって決まる情報に依存した部分を表します。

例えば、文書言語では 要素内容の最初の文字や最初の行へアクセスする仕組みはありませんが、 疑似要素::first-letterおよび::first-line) を使えば、それらにスタイルを指定できます。 とくに::first-lineの場合は、 どの部分が疑似要素で表されるかはレイアウト情報に依存し、 文書ツリーからは推測できません。

疑似要素はまた、 元文書に全く存在しない内容を表現することもできます。 たとえば::before::after 疑似要素は、任意の要素の内容の前後に、追加コンテンツを挿入できるようにします。

疑似クラスと同様に、 疑似要素も 文書ソースや文書ツリーには現れず、またそれを変更しません。 従って、構造疑似クラス起点要素、 そのツリー構造などに関わる他のセレクターの解釈にも影響を与えません。

どの疑似要素が存在するか・型・機能などはホスト言語が定義します。 CSSで存在する疑似要素は、 [CSS21](レベル2)・ [SELECT](レベル3)・ [CSS-PSEUDO-4](レベル4)で定義されています。

3.6.1. 構文

疑似要素の構文は "::"(コロン2つ, U+003A) に続けて、 疑似要素名(識別子)を書きます。 関数疑似要素の場合は、 括弧で引数を指定します。疑似要素名は ASCII大小区別なしです。 二つのコロン同士・コロンと名前の間に 空白は許可されません。

CSS Level 1CSS Level 2 では疑似要素と疑似クラスが1コロン記法で混同されていたため、 ユーザーエージェントは1コロン記法によるレベル1・2の疑似要素 (::before, ::after, ::first-line, ::first-letter )も受け入れなければなりません。 ただしこの互換記法は他の疑似要素には許可されません。 しかしながら、この記法は非推奨なので、 レベル3以降のすべての疑似要素では 2コロン記法を使うべきです。

疑似要素特徴なしであり、 他のいかなるセレクターでも一致しません。

3.6.2. 文書ツリーへの結合

疑似要素はツリー内で独立して存在せず、 常にページ内の別の要素に結びつけられます。 これを疑似要素の起点要素と呼びます。 構文上は、疑似要素は その複合セレクター(=起点要素)に直後で続きます。 この複合セレクターが省略された場合、 全称セレクター * であると見なします。

例えば、セレクター div a::before においては、 このセレクターで一致する a 要素が、その 起点要素(originating elements)となり、それに付随する ::before 疑似要素が選択されます。

セレクター ::first-line*::first-line と同等であり、 文書内の全ての要素に対する ::first-line 疑似要素を選択します。

セレクター中で疑似要素 が現れた場合、 その疑似要素より前の部分が疑似要素起点要素を選択します。 疑似要素より後ろの部分があれば、それは疑似要素自身に適用されます。 (下記参照。)

3.6.3. 疑似要素の状態(疑似クラス化)

特定の疑似要素は 直後に特定の疑似クラスを任意に組み合わせて続けることができ、 その場合は疑似要素が対応する状態のときのみ表現されます。 本仕様は任意の疑似要素が、 論理結合疑似クラスおよび ユーザーアクション疑似クラス を任意に組み合わせて続けることを認めています。 他仕様で特定の疑似クラスが 個別の疑似要素に付与可能になる場合もあります。 明示的に認められていない組み合わせは、 無効なセレクターです。

注意: 論理結合疑似クラス は、その位置でのセレクターの妥当性について制限があれば それを引数に伝播します。

例えば、:hover疑似クラスは すべての疑似要素に適用可能と定義されているため、::first-line:hover は最初の行がホバーされたとき一致します。 一方、:focus::first-lineも、 :focus::first-lineへ適用可と定義しないため、 ::first-line:focusは一致しません。

::first-line:hover:hover::first-lineは大きく異なることに注意してください。 後者は、ホバー状態の任意の起点要素の最初の行が一致対象となります! 例えば段落の2行目をホバーした場合でも:hover::first-lineはその段落の最初の行に一致しますが、 ::first-line:hoverは本当に最初の行そのものがホバーされた場合のみ一致します。

3.6.4. サブ疑似要素

一部の疑似要素は 他の疑似要素起点要素となれます。 これを、そのサブ疑似要素起点疑似要素 と呼びます。 例えば::beforelist-itemdisplay型 を指定した場合、 起点疑似要素である ::before::markerサブ疑似要素が定義されます。

区別が必要な場合、 究極の起点要素とは (疑似ではない)本物の要素のことで、 そこから疑似要素が派生しています。

該当のサブ疑似要素が他仕様で明示的に定義されていない場合、 疑似要素セレクターを他の疑似要素セレクターに連結して使うことはできません。 したがって::before::beforeは無効なセレクターですが、 ::before::markerは (後者の::before::marker サブ疑似要素をサポートする実装で)有効です。

3.6.5. 内部構造

一部の疑似要素は 内部構造をもつと定義されます。 これら疑似要素には 子孫結合子・子結合子などを使って その関係を表現可能です。 疑似要素の後に結合子が来るセレクターは、 それ以外は無効となります。

例えば::first-letter + span::first-letter emは無効なセレクターです。 ただし新たに::shadow疑似要素が内部構造を持つものとして定義された場合、 ::shadow > pは有効なセレクターとなります。

注意: 今後の仕様で既存疑似要素の機能が拡張される可能性があり、 現時点で無効なセレクター(例:::first-line :any-link) も将来的に有効となるかもしれません。

このような疑似要素の子要素は、同時に他の要素の子要素でもあり得ます。 ただし少なくともCSSでは、ボックスツリー の「木構造性」が維持されるような描画が規定されなければなりません。

3.7. 文字と大文字小文字の区別

テスト

すべてのセレクター構文は ASCII大文字小文字無視(すなわち [a-z] と [A-Z] は等価)ですが、 セレクターが制御しない部分、 具体的には ドキュメント言語の要素名・属性名・属性値の 大文字小文字の区別は ドキュメント言語に依存します。

例えば、HTMLでは要素名・属性名はASCIIの大文字小文字無視 ですが、XMLでは大文字小文字が区別されます。

名前空間接頭辞の大文字小文字の扱いは [CSS3NAMESPACE] で定義されています。 言語範囲 の大文字小文字の取扱いは :lang()節で定義されています。

セレクターにおける 空白 には SPACE (U+0020), TAB (U+0009), LINE FEED (U+000A), CARRIAGE RETURN (U+000D), FORM FEED (U+000C) だけが含まれます。 その他の空白様コードポイント(EM SPACE (U+2003) や IDEOGRAPHIC SPACE (U+3000) など)は 構文上の空白とはみなされません。

セレクター内のコードポイントは、CSSと同じエスケープ規則に従い、バックスラッシュでエスケープできます。 [CSS21] コードポイントをエスケープすると、セレクター内でその文字が持つ特別な意味が「打ち消される」ことに注意してください。 たとえば、セレクター #foo>a にはコンビネーターが含まれますが、#foo\>a は代わりに ID が foo>a の要素を選択します。

3.8. 名前空間接頭辞の宣言

特定のセレクターは名前空間接頭辞をサポートします。 名前空間接頭辞を宣言する仕組みは セレクターを利用する言語ごとに定める必要があります。 もし言語が接頭辞の宣言方法を定めない場合、 宣言済みの接頭辞は存在しません。 CSSでは@namespace規則で 宣言します。 [CSS3NAMESPACE]

3.9. 無効なセレクターとエラー処理

テスト

ユーザーエージェントは、無効なセレクターの取り扱いルールを順守しなければなりません:

注: CSSの将来互換性ある構文解析原則に従い、 ユーザーエージェントは、使用可能なサポートレベルが存在しない 任意の疑似クラス・疑似要素・結合子・またはその他構文要素を 無効として扱う必要があります部分的な実装も参照してください。

無効なセレクター は「何にも一致しない」ことを表し、よって何も一致しません。

3.10. レガシー別名

いくつかのセレクターはレガシーセレクター別名を持ちます。 これは構文解析時に標準名へ変換される名称であり、 (よってセレクターを表すいかなるオブジェクトモデルにも現れません)。

4. 論理結合

テスト

セレクターの論理は、複合化(論理積・AND)、セレクターリスト(論理和・OR)、 そして論理結合疑似クラスである :is():where():not() によって操作できます。 論理結合疑似クラスは 他のどの疑似クラスでも許可される場所で使用できますが、 その引数にも制限を伝播します。 (例:複合セレクターのみが許可される場合、 :is()の内部でもそれだけが有効です。)

注: :is():where()の内部では、 無効な引数はその疑似クラス自体を無効化せず 落とされるため、 文脈上の制限で無効化される引数も同様に:is()疑似クラス自体を無効化しません。

4.1. セレクターリスト

カンマ区切りのセレクターリストは、 セレクターリスト内の各セレクターによって選択される全要素の合計(和集合)を表します。 (カンマはU+002C。) 例えば、CSSでは複数のセレクターで同じ宣言を共有する場合、 それらをカンマ区切りリストとしてまとめることができます。 カンマの前後に空白文字を置くことができます。

CSS例: 次の例では、宣言が同一な3つのルールを書き換えて1つにまとめています。 つまり、
h1 { font-family: sans-serif }
h2 { font-family: sans-serif }
h3 { font-family: sans-serif }

これは次と等価です:

h1, h2, h3 { font-family: sans-serif }

警告: この例の等価性は、すべてのセレクターが有効である場合にのみ成り立ちます。 いずれか1つでも無効なものがあると、 セレクターリスト全体が無効となります。 この場合、3つの見出しすべてのスタイル規則が無効になるのに対し、 前者の場合では個々の見出しルールのうち1つだけが無効となります。

無効なCSSの例:
h1 { font-family: sans-serif }
h2..foo { font-family: sans-serif }
h3 { font-family: sans-serif }

これは次と等価ではありません:

h1, h2..foo, h3 { font-family: sans-serif } 

なぜなら上記h1, h2..foo, h3というセレクターは全体が無効となり そのスタイル規則そのものが破棄されるからです。(グループ化されていない場合はh2..fooだけが無効となります。)

4.2. 任意一致疑似クラス: :is()

テスト

任意一致疑似クラス(:is())は、 <forgiving-selector-list>を 唯一の引数として受け取る関数型疑似クラスです。

引数が構文解析後に空リストだった場合でも, この疑似クラスは有効ですが何にも一致しません。 それ以外の場合,そのリスト中のいずれかのセレクターに一致する要素すべてにこの疑似クラスは一致します。

注: :is()疑似クラスの 詳細度(specificity)は、引数リスト中で最も詳細度の高いものに置き換えられます。 したがって:is()を使ったセレクターは, 同じ意味のセレクターでも:is()を使わずに書いた場合と 詳細度が一致するとは限りません。 例えば:is(ul, ol, .list) > [hidden]ul > [hidden], ol > [hidden], .list > [hidden]の場合, ol の子要素で[hidden]なものは 前者のセレクターには(0,2,0)の詳細度で一致し, 後者のセレクターには(0,1,1)の詳細度で一致します。 § 15 セレクターの詳細度計算参照。

疑似要素は任意一致疑似クラスでは表現できません。 :is()内で使うことはできません。

デフォルト名前空間宣言は, 複合セレクターが 明示的な全称セレクター または型セレクターを 含まない限り、 :is() 疑似クラス内で各セレクターの主語を表す複合セレクターには影響しません。

例えば、次のセレクターは どの名前空間であってもhoverやfocusされている要素に一致します。 特に、デフォルト名前空間内だけに限定されません。
*|*:is(:hover, :focus) 

一方、次のセレクターは :is()内部で明示的な全称セレクターを使っているため、 デフォルト名前空間のhoverまたはfocusされた要素だけが対象になります:

*|*:is(*:hover, *:focus) 

この仕様の旧草案では この疑似クラスの名前に :matches()が使われていたため, 必要であれば、ユーザーエージェントは後方互換のため レガシーセレクター別名 として:is()の別名も実装可能です。

4.3. 否定(非一致)疑似クラス: :not()

テスト

否定疑似クラス(:not())は、 <complex-real-selector-list> を引数にとる関数型疑似クラスです。 この疑似クラスは、引数で表されていない要素を表します。

注: Selectors Level 3 では、 単一の単純セレクターだけが :not()の引数として許可されていました。

注: :not()疑似クラスの詳細度は、 引数の中で最も詳細度が高いセレクターの値で置き換えられます。 そのため、:not(:is(argument))と全く同じ挙動となります。 § 15 セレクターの詳細度計算参照。

疑似要素は否定疑似クラスで表現できません。 :not()内部で使用できません。

例えば以下のセレクターは、 HTML文書内で無効化されていないすべてのbutton要素に一致します。
button:not([DISABLED]) 

以下のセレクターは FOO 要素以外のすべてを表します。

*:not(FOO)

次の複合セレクターは リンク以外のすべてのHTML要素を表しています。

html|*:not(:link):not(:visited)

:is()同様、 デフォルト名前空間宣言は、 複合セレクターが 明示的な全称セレクター型セレクター を含まない限り、 :not()疑似クラス内部の各セレクターの主語を表す複合セレクターには影響しません。 (例については:is()を参照。)

注: :not()疑似クラスは 無意味なセレクターを書くことも可能です。 例えば:not(*|*)は何の要素も表さず、 またdiv:not(span)divと等価ですが、詳細度が高くなります。

4.4. 詳細度調整疑似クラス: :where()

テスト

詳細度調整疑似クラス(:where())は、 :is()と同じ構文・機能を持つ関数型疑似クラスです。 しかし、:is()と異なり、 :where()疑似クラス自身も その引数となるどのセレクターも、 セレクターの詳細度に影響を与えません。詳細度は常に0となります。

これはスタイル宣言を上書きしやすい状態を保ったまま、セレクターにフィルター処理を加えたい場合に有用です。

下の例は、詳細度ヒューリスティックが 作者の期待通りに働かない典型です:
a:not(:hover) {
  text-decoration: none;
}

nav a {
  /* Has no effect */
  text-decoration: underline;
}

しかし:where()を用いることで明示的に意図を記述できます:

a:where(:not(:hover)) {
  text-decoration: none;
}

nav a {
  /* Works now! */
  text-decoration: underline;
}

注: 今後のSelectorsレベルでは、 この疑似クラスに与える個別の詳細度引数が導入される可能性があります。

4.5. 関係疑似クラス: :has()

テスト

関係疑似クラス(:has())は、 <relative-selector-list> を引数にとる関数型疑似クラスです。 この疑似クラスは、この要素をアンカー(基準)要素として相対セレクターのいずれかが 少なくとも1つの要素にマッチした場合、この要素自身を一致対象とします。

:has() 疑似クラスは ネストできません。:has() の中に :has() を書くことは無効です。 また、明示的に :has-allowed 疑似要素 として定義されていない限り、 疑似要素:has() 内でセレクターとして使用できません。 (本仕様では :has-allowed 疑似要素は定義されていませんが、 他の仕様で定義される場合があります。)

注: 疑似要素の多くは祖先のスタイリング状況など、条件付きで存在するため、 通常:has()では疑似要素が除外されます。 :has()でこれらを照会できるようにすると依存関係の循環が生じるためです。

注: :has()<relative-selector-list>を取るため、 その引数は本質的に複雑セレクター(先頭に結合子を持つもの)となります。 よって:has()は、複雑セレクターが許可されない文脈では使用できません。 その場合は引数が必ず無効になります。

例えば、次のセレクターは <a>要素内に<img>子要素がある場合のみ 一致します:
a:has(> img)

次のセレクターは直後に別の<dt>が続く<dt>要素に一致します:

dt:has(+ dt)

次のセレクターはヘディング要素を一切含まない<section>要素に一致します:

section:not(:has(h1, h2, h3, h4, h5, h6))

上記のセレクターでは、順序が重要です。 2つの疑似クラスのネストを入れ替えると、次のようになり:

section:has(:not(h1, h2, h3, h4, h5, h6))

…この場合は「見出しでない何か」を含んでいるsectionがすべて一致対象となります。

5. 要素セレクター

5.1. 型(タグ名)セレクター

型セレクターは、文書言語の要素型の名前で表され、 文書ツリー内でその型の要素インスタンスを示します。

例えば セレクターh1は文書中のh1要素を表します。

型セレクターCSS修飾名として書かれます。 これは、オプションの名前空間プレフィックス付きの識別子です。[CSS3NAMESPACE]§ 5.3 要素セレクターにおける名前空間参照)

5.2. 全称セレクター

テスト

全称セレクターは 特別な型セレクターであり、 すべての要素型の要素を表します。

これはローカル名としてアスタリスク(* U+002A)を用いた CSS 修飾名として記述されます。 型セレクターと同様に、 全称セレクターも 名前空間による修飾が可能であり、 その名前空間の要素にのみ限定したり、 § 5.3 要素セレクターにおける名前空間で定義されるデフォルト名前空間の影響を受けます。

要素が特徴なしでなければ、 全称セレクターの有無は その要素がセレクターに一致するかどうかに影響しません。 (特徴なし要素は、 全称セレクターを含むいかなるセレクターにも一致しません。)

全称セレクターも 他の型セレクターと同じ構文ルールに従います: 複合セレクターあたり1つだけ現れることができ、 複合セレクター内で最初の単純セレクターでなければなりません。

注: いくつかの場合、全称セレクターを追加すると 一致動作には影響しないものの セレクターが読みやすくなるというメリットがあります。 例:div :first-childdiv:first-childは 一見して区別しにくいですが、 前者にdiv *:first-childと書くことで明確さが増します。

5.3. 要素セレクターにおける名前空間

型セレクター全称セレクターは オプションで名前空間部分を持つことができ、 先に宣言された名前空間プレフィックスを 縦棒(| U+007C)区切りで要素名の前につけられます。 (XMLでの名前空間利用例については [XML-NAMES]参照) それぞれの形には次の意味があります:

ns|E
名前空間ns内の名前Eの要素
*|E
すべての名前空間(名前空間なし含む)に属する名前Eの要素
|E
名前空間なしの名前Eの要素
E
セレクター用のデフォルト名前空間が宣言されていなければ、*|Eと等価。 そうでなければデフォルト名前空間nsに属するns|Eと等価。
CSS例:
@namespace foo url(http://www.example.com);
foo|h1 { color: blue }  /* first rule */
foo|* { color: yellow } /* second rule */
|h1 { color: red }      /* ...*/
*|h1 { color: green }
h1 { color: green }

@namespace規則を除き)最初のルールは "http://www.example.com" 名前空間内のh1要素のみに一致します。

2つ目のルールは "http://www.example.com" 名前空間内のすべての要素に一致します。

3つ目のルールは 名前空間なしのh1要素だけに一致します。

4つ目のルールは すべての名前空間(および名前空間なしも含む)におけるh1要素に一致します。

最後のルールはデフォルト名前空間が定義されていないので、4つ目のルールと等価です。

デフォルト名前空間が宣言されている場合は、 型セレクターの無い複合セレクターも そのデフォルト名前空間内の要素のみに一致します。

例えば次のスタイルシートでは:
@namespace url("http://example.com/foo");

.special { ... }

.specialセレクターは「http://example.com/foo」名前空間にある要素だけに一致します。 (タイプ名と一緒に名前空間をDOMで参照しなくても良い)

先に宣言されていない名前空間プレフィックスを含む 型セレクター全称セレクター無効なセレクターです。

5.4. 定義済み疑似クラス: :defined

テスト

一部のホスト言語では、 要素が「定義済み」や「構築済み」であるかどうかという区別が存在します。 :defined 疑似クラスは、 ホスト言語の定義に従い、完全に定義された要素と一致します。

そのような区別がないホスト言語では、 すべての要素が:definedに一致します。

HTML では、すべての組み込み要素は常に「定義済み」とみなされるため、 次の例は常に一致します:
p:defined { ... }

一方、カスタム要素は 最初は定義な状態であり、 正しく登録されたときに初めて「定義済み」となります。 つまり:defined疑似クラスを使えば、 カスタム要素が登録されるまで非表示にすることが可能です:

custom-element { visibility: hidden }
custom-element:defined { visibility: visible }

6. 属性セレクター

テスト

セレクターは要素の属性を表現できます。 セレクターを要素との照合式として用いる場合、 属性セレクターは、 その要素が属性セレクターで表される属性を持っていれば 一致したものとして扱われます。

複数値マッチ用にカンマ区切り構文を追加するか? 例: [rel ~= next, prev, up, first, last]

6.1. 属性の有無・値によるセレクター

CSS2では4つの属性セレクターが導入されました:

[att]
属性attがあれば、 その値に関わらず要素を表します。
[att=val]
属性attがあり、 その値が正確に "val" である要素を表します。
[att~=val]
属性attがあり、 その値が空白区切り単語リストであり、 そのいずれかが正確に"val"である要素を表します。 "val"に空白が含まれている場合は (単語はスペースで区切るため)決して一致しません。 また、"val"が空文字列でも一致しません。
[att|=val]
属性attがあり、 その値が正確に "val" か、"val" 直後に"-"(U+002D)が続く場合のいずれかである要素を表します。 これは主に言語サブコードのマッチング (例:HTMLのa要素の hreflang属性など)を意図しています。 詳細はBCP 47 ([BCP47]) または後継仕様を参照してください。 lang(またはxml:lang)の言語サブコードマッチングについては :lang()疑似クラスを参照してください。

属性値は<ident-token>または<string-token>でなければなりません。[CSS3SYN]

例:

次の属性セレクターはtitle属性を持つh1要素を表します。 (値は問わない)

h1[title]

次の例では、セレクターはclass属性が正確に"example"であるspan要素を表します:

span[class="example"]

複数の属性セレクターを使って、複数属性の組み合わせや同一属性への複数条件の指定も可能です。 ここでは属性helloが"cleveland"かつgoodbyeが"Columbus"であるspan要素を表します:

span[hello="Cleveland"][goodbye="Columbus"]

次のCSS規則は"="と"~="の違いを示します。 最初のセレクターはrel属性が"copyright copyleft copyeditor"などになっているa要素に一致します。 二つ目のはhref属性値が正確に"http://www.w3.org/"であるa要素のみ。

a[rel~="copyright"] { ... }
a[href="http://www.w3.org/"] { ... }

次のセレクターはhreflang属性が正確に"fr"であるa要素を表します。

a[hreflang=fr] 

次のセレクターはhreflang属性値が"en"で始まる("en"そのものも "en-US", "en-scouse" なども含む)a要素を表します:

a[hreflang|="en"] 

次のセレクターはいずれかの値をcharacter属性に持つDIALOGUE要素を表します:

DIALOGUE[character=romeo]
DIALOGUE[character=juliet]

6.2. 部分文字列一致属性セレクター

属性値内の部分文字列にマッチする属性セレクターも3種類あります:

[att^=val]
属性attの値が"val"で始まる要素を表します。 "val"が空文字列の場合は一致しません。
[att$=val]
属性attの値が"val"で終わる要素を表します。 "val"が空文字列の場合は一致しません。
[att*=val]
属性attの値が"val"を少なくとも1回含む要素を表します。 "val"が空文字列の場合は一致しません。

属性値は<ident-token>または<string-token>でなければなりません。

例: 次のセレクターは画像を参照するHTMLobject要素を表します:
object[type^="image/"] 

次のセレクターはhref属性値が".html"で終わるHTMLa要素です。

a[href$=".html"] 

次のセレクターはtitle属性値に"hello"の部分文字列を含むHTML段落要素を表します。

p[title*="hello"] 

6.3. 大文字小文字の区別

テスト

デフォルトでは、セレクター内の属性名や値の大文字小文字の区別は ドキュメント言語に依存します。

属性値をドキュメント言語の規則に関係なく、ASCII大小区別なし で一致させたい場合は、 属性セレクターの閉じカッコ(])の直前に識別子iを追加できます。 このフラグがあれば UAは属性値をASCII大小区別なし ([a-z]と[A-Z]は等価とみなす)で照合しなければなりません。

または、属性セレクターの閉じカッコ(])の直前に識別子sを追加できます。 この場合 UAは値の大文字小文字を区別して “完全一致”の意味で照合しなければなりません[INFRA]。 ドキュメント言語の規則に関係ありません。

他のセレクター構文と同様に、 is 識別子自体も ASCII大小区別なしです。

次の規則は、たとえXML環境で属性値が大文字小文字区別される場合でも、 frame属性値がhsides, HSIDES, hSidesなど いずれの表記でも等価に扱ってスタイルを適用します。
[frame=hsides i] { border-style: solid none; } 
次の規則は、type="a"属性とtype="A"属性で 異なるスタイルを適用します。HTMLではtype属性は本来大小区別しませんが、この指定では区別されます。
[type="a" s] { list-style: lower-alpha; }
[type="A" s] { list-style: upper-alpha; }

注: 一部の文書モデルでは、属性値を 解析時に大文字小文字なしで正規化してしまうため、 以降で大文字小文字を区別した一致判定ができない場合があります。 sフラグによる大文字小文字区別付きの一致は、 元の大文字小文字を保持するシステムでのみ可能です。

6.4. 属性セレクターと名前空間

テスト

属性セレクター内の属性名は CSS修飾名で記述します。 すでに宣言された名前空間プレフィックスを 名前空間区切り記号「縦棒」(|)で区切って属性名の前につけることができます。 XML Namespaces勧告に従い、デフォルト名前空間は属性には適用されません。 したがって、名前空間なしで属性セレクターを書くと 名前空間のない属性だけ(|attrと等価)に一致します。 名前空間プレフィックスとしてアスタリスクを使うと、 属性の名前空間を問わずすべての属性名に一致します。

名前空間プレフィックスが宣言されていない 属性名を含む属性セレクターは無効セレクターです。

CSS例:
@namespace foo "http://www.example.com";
[foo|att=val] { color: blue }
[*|att] { color: yellow }
[|att] { color: green }
[att] { color: green }

最初の規則は、"http://www.example.com"名前空間で値が"val"の属性attを持つ要素だけに一致します。

2番目の規則は、属性attの名前空間を問わず(名前空間なしも含む)、その属性を持つ要素だけに一致します。

最後の2つの規則は等価で、名前空間なしの属性attを持つ要素だけに一致します。

6.5. DTDにおけるデフォルト属性値

属性セレクターは文書ツリー内の属性値を表します。 その文書ツリーをどのように構築するかはSelectorsの範囲外です。 一部の文書形式ではDTDや他の場所でデフォルト属性値を定義できますが、 それが文書ツリー内に現れていなければ属性セレクターで選択できません。 デフォルト値がツリーに含まれていない場合もセレクターが動作するよう設計すべきです。

例えば、XML UAはDTDの「外部サブセット」を読み込んでも良いし、 必須ではありません。 ただし文書の「内部サブセット」にあるデフォルト属性値は 必ず参照しなければなりません。 (これらの区分の定義は[XML10]参照) UAによっては、DTDの外部サブセットで定義されたデフォルト属性値が 文書ツリーに現れたり現れなかったりします。

XML名前空間を認識するUAは、その名前空間に関する知識を使って デフォルト属性値が文書内に存在するかのように扱ってもよいし、 そうしなくてもかまいません。 (例えばXHTML UAは、組込みXHTML DTDの知識を利用する必要はありません。 詳細は[XML-NAMES]参照)

注: 一般的に実装は外部サブセットを無視することが多く、 これはXML仕様で定義されるnon-validatingプロセッサの挙動に対応します。

例:

デフォルト値"decimal"を持つ属性radixをもつ要素EXAMPLEを考えます。 DTDフラグメントは以下のようになります。

<!ATTLIST EXAMPLE radix (decimal,octal) "decimal"> 

スタイルシートに次のような規則が含まれる場合

EXAMPLE[radix=decimal] { /*... default property settings ...*/ }
EXAMPLE[radix=octal]   { /*... other settings...*/ }

最初の規則は、属性radixが明示的に指定されていない(デフォルト値の場合)要素には一致しない可能性があります。 すべてを網羅するには、デフォルト値用の属性セレクターを削除すべきです:

EXAMPLE                { /*... default property settings ...*/ }
EXAMPLE[radix=octal]   { /*... other settings...*/ }

この例ではEXAMPLE[radix=octal]セレクターが 単なる型セレクターより詳細度が高いため、 radix属性値が"octal"のときは 2番目のルールのスタイル宣言が1番目を上書きします。 デフォルトケースのみに適用したいプロパティ宣言が 非デフォルトケースのスタイルで上書きされるよう注意が必要です。

6.6. クラスセレクター

テスト

クラスセレクターは、 ピリオド(. U+002E)に続けて識別子を書く形式です。 これは、識別子で指定されたクラスに属する要素を表します(具体的なクラスの定義は文書言語によります)。 たとえば[HTML5][SVG11][MATHML]などでは クラスへの所属はclass属性によって与えられます。 これらの言語では、これはローカルのclass属性に対して ~=記法を使うのと同等です (すなわち [class~=識別子])。

CSS例:

class~="pastoral"な要素すべてにスタイルを指定するには次のようにします:

*.pastoral { color: green }  /* class~=pastoral を持つすべての要素 */ 

あるいは単に

.pastoral { color: green }  /* class~=pastoral を持つすべての要素 */ 

次はclass~="pastoral"を持つH1要素のみにスタイル設定:

H1.pastoral { color: green }  /* class~=pastoral なH1要素 */ 

これらの規則がある状態だと、下記の最初のH1は緑色にならず、2つ目は緑色になります:

<H1>Not green</H1>
<H1 class="pastoral">Very green</H1>

次の規則は、class属性に pastoralmarineの両方を含む 空白区切り値リストが指定された P要素に一致します:

p.pastoral.marine { color: green } 

この規則は、class="pastoral blue aqua marine"の時は一致し、 class="pastoral blue"の時は一致しません。

注: CSSは class 属性に強力な機能を与えているため、 作者がdivspan など表示意味をほとんど持たない要素のみで文書言語を設計し、 クラスによるスタイル指定だけで見た目を制御することも理論上は可能です。 しかし文書言語の構造要素には一般に認知された意味づけが存在し、 作者独自クラスはそうならない場合も多いので、このやり方は避けるべきです。

注: 要素が複数の class属性を持つ場合、その値は空白で連結してからクラス検索が行われます。 ただし現時点でこのような状況に到達する手段は存在しないとWGは認識しており、 この挙動は仕様上非規範的です。

ドキュメントがクイークスモードの場合、 クラス名の照合はASCII大小区別なしで 行われなければなりません。 それ以外の場合はクラスセレクターは大文字小文字を区別して、 完全一致するクラス名だけが一致対象です。[INFRA]

6.7. IDセレクター

テスト

文書言語にはID型として宣言された属性を持つ場合があります。 ID型の属性の特別な点は、適合文書ではどのような要素型であろうと、 そうした属性同士で値が重複してはならない点です。 文書言語が何であれ、ID型属性は要素を一意に識別できます。 HTMLではすべてのID属性名はidですが、 XMLアプリケーションではID属性に異なる名前を付ける場合もあり得ますが、同じ制約が適用されます。 どの属性が要素の「ID属性」と見なされるかは文書言語が定義します。

IDセレクターは “ナンバーサイン”(U+0023、#)にID値を直結して書きます(値はCSSの識別子でなければなりません)。 IDセレクターは、そのIDセレクターの識別子と一致するIDを持つ 要素インスタンスを表します。 (非適合文書では複数の要素が同じIDセレクターに一致する可能性もあります。)

例: 次の ID セレクターは、ID 型属性が "chapter1" という値を持つh1 要素を表します:
h1#chapter1 

次の ID セレクターは、ID 型属性が "chapter1" という値を持つ任意の要素を表します:

#chapter1 

次のセレクターは、ID 型属性が "z98y" という値を持つ任意の要素を表します。

*#z98y 

注: XML 1.0 [XML10] では、 要素IDを格納する属性を定義する情報はDTDまたはスキーマ内に記述されています。 XML解析時、UAはDTDを常に読み込むとは限らず、 その場合要素のIDがどれか不明かもしれません(ただし、UAが名前空間固有の知識で どの属性がIDか判断できる場合もあります)。 スタイルシート作者が、UAが要素のIDを認識しない場合があると知っていたり疑う場合は、 #p371ではなく[name=p371]のような通常の属性セレクターを使うべきです。

もし一つの要素に複数のID属性がある場合、 それらすべてが当該要素のIDとしてIDセレクター照合の際に扱われます。 こうした状況は xml:id, DOM3 Core, XML DTDs, 名前空間固有知識を組み合わせて起きる場合があります。

ドキュメントがクイークスモードの場合、 IDはASCII大小区別なしで一致させなければなりません。 それ以外の場合はIDセレクターは大文字小文字を区別し、 完全一致するIDだけが一致します。[INFRA]

7. 言語疑似クラス

7.1. 方向性疑似クラス: :dir()

テスト

:dir() 疑似クラスは、要素の方向性(テキストの流れの方向)に基づいてセレクターを記述できるようにします。 方向性は文書言語により決定されます。 例えば、[HTML5]では 要素の方向性を決定する方法dir属性や周囲のテキスト、その他の要素に基づいて定義されています。 また、Internationalization Tag Setのits:dirdirRule要素は [ITS20]仕様により [XML10]文書で要素の方向性を指定できます。

:dir()疑似クラスは スタイル状態(たとえばCSSのdirectionプロパティ)には基づきません。 そのため、directionプロパティの値は一致条件に影響しません。

疑似クラス:dir(ltr)は 左から右(ltr)方向性の要素を表します。 :dir(rtl)は 右から左(rtl)方向性の要素を表します。 :dir()の引数は単一の識別子でなければならず、 そうでなければセレクターは無効です。 識別子と丸括弧の間に空白は任意で許可されます。 ltrおよびrtl以外の値は無効ではありませんが、一致対象がありません。 (将来他の方向性を定義する仕様が出れば、Selectors仕様もそれに合わせて拡張され得ます。)

:dir(C)[dir=C]の違いは、 [dir=C]は要素の属性値との単純な比較のみ行うのに対し、 :dir(C)疑似クラスはUAが文書のセマンティクスを考慮して比較を行う点です。 たとえばHTMLでは、dir属性のない子要素は最も近い親(有効なdir属性を持つ)から方向性を継承します。 さらにHTMLでは、[dir=auto]に一致する要素は 内容によって解決された方向性に応じて :dir(ltr)または:dir(rtl)両方のいずれにも一致することがあります。 [HTML5]

7.2. 言語疑似クラス: :lang()

テスト

ドキュメントの言語が、要素の(人間向けの)コンテンツ言語の決定方法を指定している場合、要素のコンテンツ言語に基づいて要素を表すセレクターを記述することが可能です。 :lang()疑似クラスは、カンマ区切りで1つ以上の言語範囲を受け取ります。 この疑似クラスは、その引数に挙げられた言語のいずれかが、要素のコンテンツ言語である要素を表します。 :lang()内の各言語範囲は、有効なCSSの<ident>または<string>でなければなりません。 (たとえばアスタリスクを含む言語範囲は、正しくエスケープするか、文字列として引用する必要があります。 例::lang(\*-Latn) または :lang("*-Latn") など。)

注: 要素の内容言語が どう定まるかは文書言語の仕様によります。

例えばHTML[HTML5]では、 内容言語lang属性、 meta要素の情報、 場合によってはプロトコル(HTTPヘッダー等)からの情報の組合せによって定まります。 XML言語では、xml:lang属性で要素の言語情報を指定できます。[XML10]

要素の内容言語言語範囲に一致する条件は、 その内容言語がBCP 47構文で表現され、 言語範囲[RFC4647] Matching of Language Tags (3.3.2節)に準拠した拡張フィルタ操作で一致する場合です。 内容言語言語範囲[RFC5646]4.5節にしたがって 正規化extlang形式に変換した上で一致判定を行います。 判定時はASCII範囲内で大文字小文字を区別しません。

言語範囲は 必ずしも有効な言語コードである必要はありません。

この目的で、ワイルドカード言語範囲"*")は、 言語がタグ付けされていない要素(例:lang="")には一致しませんが、 言語がund(未定)とタグ付けされている要素(lang=und)には一致します。 空文字列だけからなる言語範囲:lang(""))は、言語タグを持たない要素だけに一致します。

注: 文書やプロトコルは、[BCP47]や後継仕様の言語コードを使い、 XML形式の場合xml:lang属性で指定するのが推奨されています。 [XML10]「FAQ:2文字/3文字言語コード」も参照。

例: 下記2つのセレクターはHTML文書がベルギーのフランス語またはドイツ語である場合に一致します。 続く2つは、任意の要素内でベルギーのフランス語またはドイツ語であるq引用要素を表します。
html:lang(fr-be)
html:lang(de)
:lang(fr-be) > q
:lang(de) > q

注: :lang(C)|=演算子の違いは、 |=は要素の属性値と単純比較をするだけですが、 :lang(C)疑似クラスはUAが文書のセマンティクスを使って判定する点です。

このHTML例では、 [lang|=fr]に一致するのはBODYだけですが(LANG属性を持つため)、 :lang(fr)にはBODYもPも一致します(両方ともフランス語)。 PはLANG属性を持たないため[lang|=fr]には一致しません。
<body lang=fr>
  <p>Je suis français.</p>
</body>
:lang(C)|=演算子のもう一つの違いは、 :lang(C)は暗黙ワイルドカードを使った一致を行う点です。

例えば:lang(de-DE)de-DEde-DE-1996de-Latn-DEde-Latf-DEde-Latn-DE-1996の全てに一致しますが、 [lang|=de-DE]de-DEde-DE-1996にしか一致しません。

最初のサブタグ(主言語)でワイルドカード一致を行うには アスタリスクを用い:*-CHde-CHit-CHfr-CHrm-CH全てに一致します。

このタイプの言語範囲でlang属性値に対して選択したい場合は、 属性セレクターと疑似クラスを組み合わせて 例:[lang]:lang(de-DE)とします。

注: ワイルドカードによる言語マッチングとカンマ区切りリストは、レベル4で新たに導入されました。

8. 位置疑似クラス

テスト

:any-link 疑似クラスは、ハイパーリンクのソースアンカーとして機能する要素を表します。 例えば、[HTML5]では、 a または area 要素で href 属性を持つものはハイパーリンクとなり、 よって :any-link に一致します。 これは、その要素が:link または :visitedいずれかに一致する場合に一致し、 :is(:link, :visited)と等価です。

テスト

ユーザーエージェントは、未訪問のハイパーリンクと 以前に訪問したリンクを、一般的に異なる見た目で表示します。 Selectorsは、これらを区別するために 疑似クラス:linkおよび :visitedを用意しています:

この2つの状態は相互に排他的です。

一定期間後、 ユーザーエージェントは訪問済みリンクを (未訪問の):link状態へ戻すこともあります。

:visited 疑似クラスは明らかなプライバシー懸念を伴います—— 他のどんなウェブサイトを訪問したか第三者に知られることが 様々な理由で問題となりえます—— このためユーザーエージェントは必ずユーザープライバシーを :visited実装で保護しなければなりません。

本仕様はこの点について、 プライバシー保護の方法をあえて厳密に規定していません。 これは各ユーザーエージェントが独自に工夫・発展できるよう配慮したものです。 ただし、以下のような方法が推奨されています:
例: セレクター.footnote:visitedを使えば脚注リンクを 既に辿った場合だけ別の見た目にでき、 ユーザーはすでに目を通した脚注かどうかを把握できます。

8.3. ターゲット疑似クラス: :target

一部の文書言語では、 文書のURLがフラグメントによって 文書内部の特定要素も指せるようになっています。 この方法で指される要素が文書のターゲット要素です。

HTMLでは フラグメント部分はページ内で同じIDを持つ要素を指します。 たとえばURL https://example.com/index.html#section2 は、 https://example.com/index.html内のid="section2"の要素を指します。

:target 疑似クラスは文書のターゲット要素に一致します。 もし文書のURLにフラグメント識別子がなければ、ターゲット要素は存在しません。

例:
p.note:target 

このセレクターは、 p 要素のうち、クラスnoteで、そのURLが指し示すターゲット要素となっているものを表します。

CSS例: ここでは:target疑似クラスで ターゲット要素を赤色で表示し、もしあればその直前に画像を挿入しています:
:target { color : red }
:target::before { content : url(target.png) }

注: 本仕様は過去に :target-within疑似クラスを定義していましたが、 現在は:focus-withinと同等の :has(:target)の利用を推奨し、 それで充分と考えています。

8.4. 参照要素疑似クラス: :scope

テスト

あるコンテキストでは、セレクターが1つ以上のスコープルート を基準にして照合される場合があります。 例えば querySelector() メソッドを [DOM] で呼ぶときなどが該当します。 :scope 疑似クラスはこのスコープルートを表します。 これは実際の要素の場合も、仮想的なもの(たとえば DocumentFragment など)もあります。

スコープルートが存在しない場合、 :scopeは その要素が属するツリーのルートを表します (:hostシャドウツリー内の場合や、 それ以外なら:rootと同等です)。 本疑似クラスで木のルート要素ではなく特定要素に一致させたい場合は、 仕様がそれに合わせてスコープルートを定義する必要があります。

仮想スコーピングルートとは、 ドキュメントフラグメントのルートを表すオブジェクトのことであり、 セレクターパターン内で、他の要素とこのスコーピングルートとの関係性を表すために使うことができます。 これは、該当するドキュメントフラグメント内の全てのルート要素の親として機能します。 仮想スコーピングルート特徴なしであり、セレクターの主語(主対象)になることはできません。

例えばDocumentFragment dfがあり、 df.querySelectorAll(":scope > .foo") を実行すると、そのドキュメントフラグメント直下(親がそのdocument fragmentである) の.foo要素すべてに一致します。

一方でdf.querySelector(":scope")は 何にも一致しません。 なぜならdocument fragment自体はセレクターの主語になれないためです。

9. ユーザーアクション疑似クラス

インタラクティブなユーザーインターフェースでは、ユーザーの操作に応じて表示を変えることがあります。 Selectorsは、ユーザー操作を受けて対象となる要素を選択するための ユーザーアクション疑似クラスを複数提供しています。 (非インタラクティブなユーザーエージェントでは、これら疑似クラスは常に有効だが何にも一致しません。)

ユーザーアクション疑似クラスは互いに排他的ではありません。 ひとつの要素が、同時に複数のこのような疑似クラスにマッチすることがあります。

例:
a:hover   /* リンク上にユーザーがホバー */
a:focus   /* リンクにフォーカス         */

a:focus:hover
/* フォーカス中かつホバーしているとき */

一部のユーザーアクション疑似クラスは、 対象要素自身だけでなくその祖先も一致対象とします: :hover:active:focus-withinなどです。 具体的には、これらがある要素と一致した場合は、その要素のフラットツリー祖先すべてについても一致し、 最初に見つかったトップレイヤー要素 またはルート要素まで適用されます(どちらか先に見つかった方まで)。

注: どのようなヒットテスト(ユーザ操作に反応する対象判定)が必要か、 具体的定義は現時点では未定義ですが、将来的に規定される予定です。

9.1. ポインターホバー疑似クラス: :hover

テスト

:hover 疑似クラスは、 ユーザーがポインティングデバイスで要素(または疑似要素)を指し示している間に適用されますが、 必ずしもその要素をアクティブ化するわけではありません。 例えば、視覚的ユーザーエージェントは、 カーソル(マウスポインター)が要素によって生成されたボックスの上に乗っているときにこの疑似クラスを適用できます。 ハードウェアの制限によりホバー状態を検出できない (例: ホバーを検出しないペンデバイスなど) インタラクティブなユーザーエージェントも依然として準拠しています。 そのようなUAでは、セレクターが単に決してマッチしないだけです。

要素の:hover一致は、フラットツリー内の 子孫(テキストノード等の非要素ノードも含む)のいずれかが 上記条件を満たしているときにも該当します。

ドキュメント言語は、要素が:hoverにマッチする追加の方法を定義している場合があります。 例えば、[HTML5]では、 ラベル付きコントロール要素が、そのラベルにホバーした場合に :hover にマッチする と定義されています。

注: :hover状態は 子要素がポインティングデバイスで指定されていることで 親にも適用されうるため、 実際にはポインティングデバイスの下にいない要素にも :hoverが 適用されるケースがあり得ます。

9.2. アクティベーション疑似クラス: :active

:active 疑似クラスは、 ユーザーによって要素が「アクティベート」されている間に 適用されます(具体的なアクティベートの定義はホスト言語による); たとえばハイパーリンクがトリガーされている間などです。

加えて、:active疑似クラスは、 任意の要素(または疑似要素)の生成ボックスが ポインティングデバイスでアクティブ表示されている(押下状態等)間にも適用されます。 例: ユーザーが主ボタンを押した時から離すまで、 タッチスクリーンで指で押しているあいだ、など。

注: [HTML5]では HTML要素が アクティベートされるための条件が個別に定義されています。

要素の:active一致は、フラットツリー内の 子孫(テキストノード等の非要素ノードも含む)が上記状態になっている場合も一致します。

9.3. 入力フォーカス疑似クラス: :focus

テスト

:focus 疑似クラスは、 要素(または疑似要素)がフォーカスを持っている(キーボードや他の形式の入力を受け入れている)間に適用されます。

どの要素が:focusを獲得できるかについては、文書言語や実装ごとに制限がある場合があります。 たとえば、[HTML]では フォーカス可能領域 のリストが定義されています。

文書言語は:focusに一致させる追加条件を定めてもかまいませんが、 :focus疑似クラスが自動的に親要素へ伝播してはいけません。 親要素への一致を望む場合は:focus-withinを使ってください。 (他の仕組みにより伝播した場合は親要素にも適用されることはあり得ますが、 親であることだけが理由の場合は不可です。)

作者側から、フォームコントロールへの:focusを 関連付けられたlabel 要素に伝播させたいという要望がありますが、 主な反対理由は実装上の困難のようです。 CSSWG issue (CSS)WHATWG issue (HTML)も参照してください。

9.4. フォーカス表示疑似クラス: :focus-visible

テスト

:focus 疑似クラスは常に現在フォーカス中の要素に一致しますが、 UA(ユーザーエージェント)は必ずしもフォーカスの視覚的指標(“フォーカスリング”を描画する等)を表示するとは限りません。 多様なヒューリスティックにより、ユーザーにとって最も有用な状況だけにフォーカスを可視化します。 :focus-visible 疑似クラスは、 これら状況でのみフォーカス中要素(または疑似要素)に一致します。 これにより、作者はフォーカス指標の外観を変更でき、その発生タイミングは変えずに済みます。

この例では すべてのフォーカス可能要素が:focus-visibleで 強い黄色のアウトラインを持ち、 リンクには黄色の背景色も追加されます(:focus-visible時)。 これらのスタイルは全体を通して統一され、非常に目立ちますが、 ユーザーがページ上のフォーカス位置を把握する必要がある場合にのみ表示されます。
:root {
  --focus-gold: #ffbf47;
}

:focus-visible  {
  outline: 3px solid var(--focus-gold);
}

a:focus-visible {
  background-color: var(--focus-gold);
}
ユーザーエージェントは、いつフォーカスを示すかについて独自のヒューリスティクスを選択できます。 ただし、現在フォーカスされている要素にいつフォーカスを示すべきかについて、以下の(規範的でない)提案を出発点として利用できます:

ユーザーエージェントはまた:focus-visibleを使ってデフォルトのフォーカススタイルを指定するべきです。 これにより:focus-visibleの利用者は デフォルトの:focusスタイルをわざわざ無効化する必要がなくなります。

9.5. フォーカスコンテナ疑似クラス: :focus-within

テスト

:focus-within 疑似クラスは、 :focus 疑似クラスが適用されるあらゆる要素(または疑似要素)に適用されます。 また、フラットツリー(テキストノードなど非要素ノードを含む)内の子孫が :focus にマッチする条件を満たす要素(または疑似要素)にも適用されます。

10. リソース状態疑似クラス

この節の疑似クラスは、読み込まれたリソース(特に画像や動画など)を表す要素に適用され、 その状態の特徴に基づいてセレクターで選択できるようにします。

10.1. メディア再生状態: :playing:paused:seeking 疑似クラス

テスト

:playing 疑似クラスは、「再生」や「一時停止」ができる要素が「再生中」であることを表します。 (ここでの「再生中」には、要素が明示的に再生されている場合だけでなく、 一時的にユーザー意図と関係ない理由(例:バッファリングや停止状態)で止まっていても、 その理由が解消すれば自動的に再開する状態も含みます。)

:paused 疑似クラスは、「再生」や「一時停止」ができる要素が「一時停止中」(つまり再生中でない)であることを表します。 (これは明示的な「一時停止」状態だけでなく、 「読み込み済み・未アクティブ」など他の非再生状態も含まれます。)

:seeking 疑似クラスは、「シーク」(送り・戻しなど)ができる要素が「シーク中」であることを表します。 (HTMLの audiovideo 要素についてはHTML § 4.8.11.9 シーク参照。)

10.2. メディアのロード状態: :buffering および :stalled 疑似クラス

テスト

:buffering 疑似クラスは、 「再生」や「一時停止」ができる要素が、 メディアデータ の取得を積極的に試みているが、まだ再生を再開するのに十分なデータを得ていないため、 再生を続けられない状態を表します。 (この状態でも要素は「再生中」とみなされます。 :buffering に一致する場合は、 必ず :playing にも 一致します。)

:stalled 疑似クラスは、 要素がメディアデータの取得を 積極的に試みているが、一定時間全くデータを受信できず、 再生を続けられない状態を表します。 HTMLの audio および video 要素の場合、 この「一定時間」は メディア要素のスタールタイムアウト です。[HTML]:buffering 疑似クラスと同様に、 この状態でも要素は「再生中」とみなされます。 :stalled に一致する場合は、 必ず :playing にも一致します。)

10.3. 音声状態: :muted および :volume-locked 疑似クラス

テスト

:muted 疑似クラスは、 音声を出すことができる要素が 現在「ミュート」(強制的に消音)の状態であることを表します。 (HTMLの audiovideo 要素については、ミュートを参照。[HTML]

:volume-locked 疑似クラスは、 音声を出すことができる要素で、 現在UAまたはユーザーによってボリュームが「ロック」されており、 ページ作者がそれを変更できない状態であることを表します。 (HTMLの audiovideo 要素については、 要素の実効メディア音量設定アルゴリズムを参照。[HTML]

11. 要素表示状態疑似クラス

11.1. 折りたたみ状態: :open 疑似クラス

テスト

:open 疑似クラスは、「開」「閉」双方の状態を持つ要素で、現在「開」状態にあるものを表します。

「開」「閉」が実際に何を意味するかはホスト言語に依存しますが、例として HTMLの detailsselectdialoginput などが挙げられます。 これらの要素は全て「開」状態に切り替わることで追加の内容(またはdialogの場合は任意の内容)を表示できます。

注: 「開」「閉」はセマンティックな状態です。 表示されていない要素 (例えば visibility: collapsedisplay: none サブツリーの要素など)でも、「開」状態にはなり得るため :openに一致します。

注: 将来的に:openがサポートされるものの全体が明らかになれば 「:closed」疑似クラスが追加される可能性もあります。

11.2. ポップオーバー状態: :popover-open 疑似クラス

テスト

:popover-open 疑似クラスは、 「popover-showing」と「popover-hidden」の両方の状態を持つ要素のうち、 現在「popover-showing」状態にあるものを表します。

注: これは :open とは別物です。 なぜなら、要素ごとに固有の open/closed 状態とは別に、 ポップオーバーであることに関連して 個別の popover-showing/popover-hidden 状態を持つからです。

「popover-showing」や「popover-hidden」の意味は ホスト言語に依存しますが、 例えばHTMLの popover 属性や、 関連するポップオーバー可視状態 の存在などが該当例となります。

テスト

:modal 疑似クラスは、要素が「他の要素とのインタラクションを遮断している」状態、 つまり自分が閉じられるまで外部要素との操作ができない排他的状態にあることを表します。 :modal は複数の要素に同時に適用されることがありますが、 そのうち一つだけが「アクティブ」(入力を受け付ける)状態になります。

例として、 dialog 要素は showModal() APIで開いたとき :modal になります。 同様に :fullscreen にした要素も requestFullscreen() APIで開いた場合、 ページの他の部分とのインタラクションができなくなるため、 :modal 状態となります。

11.4. 全画面表示状態: :fullscreen 疑似クラス

:fullscreen 疑似クラスは、 画面のほぼ全体(通常は全体)を占めるモードで表示されている要素 (Fullscreen APIによって定義されるような状態)を表します。[FULLSCREEN]

11.5. ピクチャーインピクチャー表示状態: :picture-in-picture 疑似クラス

:picture-in-picture 疑似クラスは、 ビューポートのほぼ全体(通常は全体)を占めつつも 表示領域が画面の一部に限定され、 他のコンテンツ上にオーバーレイ表示されている状態の要素を表します。 例えばPicture-in-Picture APIを用いた場合です。[picture-in-picture]

12. 入力用疑似クラス

この節の疑似クラスは主にユーザーからの入力を受け付ける要素 (HTMLの input 要素など)に適用されます。

12.1. 入力コントロール状態

12.1.1. :enabled および :disabled 疑似クラス

テスト

:enabled 疑似クラスは、 有効状態にあるユーザーインターフェース要素を表します。 こうした要素には必ず対応する無効状態が存在する必要があります。

逆に、:disabled 疑似クラスは 無効状態にあるユーザーインターフェース要素を表します。 このような要素には必ず対応する有効状態が存在します。

有効状態・無効状態・ユーザーインターフェース要素が何かはホスト言語依存です。一般的な文書では多くの要素が :enabled でも :disabled でもありません。 たとえば[HTML5]では、 非disabledなインタラクティブ要素:enabled、 そのうち 明示的にdisabledのものは :disabledと定義されます。

注: ユーザーが当該ユーザーインターフェース要素とやりとりできるかどうかに 影響するCSSプロパティであっても、 それにより:enabled:disabledへの一致が変化することはありません。 例えばdisplayvisibility プロパティは要素の有効/無効状態に影響しません。

12.1.2. 変更可否疑似クラス: :read-only および :read-write

テスト

要素が文書言語の定義によってユーザーにより編集可能な場合、:read-writeに一致します。 それ以外は:read-onlyです。

たとえば、[HTML5]では、 非disabledかつ非readonlyな <input>要素:read-writeとなり、 contenteditable属性がtrue状態にある要素も同様です。

12.1.3. プレースホルダー表示疑似クラス: :placeholder-shown

テスト

入力要素は、ユーザーが何を入力すればよいかのヒントとして プレースホルダー(補助テキスト)を表示する場合があります。 例としては[HTML5]placeholder 属性などが挙げられます。 :placeholder-shown疑似クラスは、 このようなプレースホルダーテキストが 属性や実要素、またはUAによって暗黙的に表示されているinput要素に一致します。

例: [HTML]における仕様では、 placeholder 属性を持つ input および textarea 要素で プレースホルダーが提供されます。 :placeholder-shownクラスは こうしたプレースホルダーテキストが表示されている場合に適用されます。

12.1.4. 自動入力疑似クラス: :autofill

:autofill疑似クラスは、 ユーザーエージェントによって自動的に入力値が補完された かつまだユーザーによって変更されていないinput要素に適用されます。

12.1.5. デフォルト選択疑似クラス: :default

:default 疑似クラスは、 一連の同種UI要素群でデフォルトとなる1つまたは複数の要素に適用されます。 一般的にはコンテキストメニューアイテム、ボタン、選択リスト/メニューなどが該当します。

例としては、一群のボタン中でのデフォルト送信ボタンや、 ポップアップメニューでのデフォルトオプションなどです。 複数選択が可能なグループ(ピザのトッピング等)では 複数要素が:defaultとなることもあります。 例えば[HTML5]では :defaultフォーム内「既定ボタン」や <select>内の初期選択<option>要素、 その他要素に一致すると定義されています。

12.2. 入力値の状態

12.2.1. 選択状態疑似クラス: :checked:unchecked:indeterminate

ラジオボタンやチェックボックスはユーザー操作で「オン・オフ」切り替えができます。 一部のメニューアイテムも選択時は「チェック」状態となります。 この状態は入力値疑似クラスによって示されます。

このような要素が「オン」状態の場合、 :checked 疑似クラスが適用されます。 例えば[HTML5]では チェック済みチェックボックス、 ラジオボタン、選択済み<option>要素:checkedに一致します。 同様に、このような要素が「オフ」状態なら :unchecked 疑似クラスが適用されます。

:checked:uncheckedに一致しうる要素で 「オン」「オフ」いずれでもない場合は、 :indeterminate疑似クラスが適用されます。 :indeterminateは そもそも「チェック」概念がないが値が不定な状態(例:進捗率不明のプログレスバー)にも一致します。

これら3つの疑似クラスは互いに排他的です。 1つの要素は、同時に最大で1つだけマッチします。 (そして、「checked」の概念が該当しない場合は、どれにもマッチしないこともあります。) もしホスト言語で「不定(indeterminate)」の概念が 「checked/unchecked」の概念と排他的でない場合 (たとえば、HTMLのチェックボックスでは、「indeterminate」状態と「checked」状態のブール値は別々です)、 これらの疑似クラスのマッチ判定目的においては、 indeterminate(不定)であることが checked/unchecked よりも優先されます。

例(HTMLの場合):

入力値疑似クラスは動的でユーザー操作で切り替え可能ですが、 selectedやcheckedなど文書中のセマンティック属性にも基づきうるため すべてのメディアで適用されます。

12.3. 入力値バリデーション

12.3.1. 妥当性疑似クラス: :validおよび:invalid

要素が、その内容や値について 文書言語で定義されたデータ妥当性セマンティクス(例:[XFORMS11][HTML5]) に照らして妥当・不正であるとき、それぞれ:validまたは:invalidに一致します。 データ妥当性セマンティクスを持たない要素は :validにも:invalidにも一致しません。

注: 制約がないため:validとなる要素と そもそもデータ妥当性セマンティクスを持たないため :validにも:invalidにもならない要素 は区別されます。 たとえばHTMLでは<input type="text">は制約がなければ常に:validですが p要素は妥当性セマンティクス自体を持たず どちらの疑似クラスにも一致しません。

12.3.2. 範囲疑似クラス: :in-rangeおよび:out-of-range

:in-range および:out-of-range疑似クラスは、 範囲制限を持つ要素だけに適用されます。 要素が文書言語で定義された範囲制限に照らして 値が範囲内なら:in-range、 範囲外なら:out-of-range になります。 範囲制限を持たない要素やフォームコントロール以外の要素は :in-rangeにも :out-of-rangeにもなりません。 例:1〜10の範囲制限のスライダーで値11なら:out-of-range。 他にも「A」「B」「C」だけのポップアップメニューで値「E」となる場合も同様です。

12.3.3. 必須/任意疑似クラス: :requiredおよび:optional

テスト

フォーム要素は、フォームの有効な送信のために値がそれぞれ必須である場合は :required、 任意でよい場合は :optionalとなります。 フォーム要素でないものは、requiredでもoptionalでもありません。

12.3.4. ユーザーインタラクション疑似クラス: :user-valid および :user-invalid

テスト

:user-invalid および :user-valid 疑似クラスは、 それぞれ誤った入力または正しい入力を持つ要素を表しますが、 いずれもユーザーが十分にその要素と対話した後にのみ適用されます。 これらの疑似クラスは、ユーザーが自分の入力ミスに気付きやすくするためのものです。

これら疑似クラスは、少なくともユーザーがフォーム送信を試みた後で かつ再度入力要素に操作を行うかフォームをリセットするまで、 対象の要素に一致しなければなりません。 また、ユーザーへエラーを強調表示するため 他のタイミングでも一致させても構いません。 たとえば:user-invalidは、 ユーザーが値を変更してフォーカスを別の要素に移した時点で :invalidな input要素に一致し始めたり、 入力が修正されて正しくなった場合のみ一致しなくなったりします。

ホスト言語がより正確な一致ルールを定義してもよく、 またはプラットフォーム慣習に任せても構いません。 それ以外の場合、具体的挙動はUA依存です。 いずれにせよ、 :user-invalid疑似クラスは :invalidな 要素だけに一致しなければならず、 :user-valid疑似クラスは :validな 要素だけに一致しなければなりません。 HTMLの要素についてはHTML仕様に具体的な規則があります。[HTML]

例: 次の文書断片の input 要素は、ページロード直後から :invalid(初期値がmax制約を違反しているため)に一致しますが、 :user-invalidには ユーザーが十分にそのフィールドを操作したり、所属するフォーム送信を試みるまで一致しません。
<form>
  <label>
    Volume:
    <input name='vol' type=number min=0 max=10 value=11>
  </label>
  ...
</form>

13. 木構造疑似クラス

テスト

Selectorsは、構造疑似クラスという概念を導入し、 文書ツリー内に存在するが他の単純セレクターやコンビネーターでは表現できない追加情報に基づいて要素を選択できるようにしています。

単独のテキストノードやその他の非要素ノードは、親要素の子リスト内で要素の位置を計算するときにカウントされません。親の子リスト内における要素の位置を計算する際、インデックス番号は1から始まります。

構造疑似クラスは文書ツリー内の要素にのみ適用されます。 疑似要素には決して一致しません。

13.1. :root 疑似クラス

テスト

:root 疑似クラスは、文書のルート要素であることを表します。

例えば、DOM文書では :root 疑似クラスは文書要素に一致します。 HTMLでは、これは html 要素になります (ただしスクリプト等による文書の改変がない場合)。

13.2. :empty 疑似クラス

テスト

:empty 疑似クラスは、 子ノードを全く持たない要素 (ただし、文書の空白文字のみは例外として許容される場合がある) を表します。 文書ツリーの観点では、 「要素ノード」および「内容ノード」 ([DOM] のテキストノードやエンティティリファレンス等) のうち、長さが0でないデータを持つものだけが空要素判定に影響します。 コメントや処理命令、その他のノードは 要素のemptyかどうかの判定には影響しません。

例: p:empty は以下HTML断片の p 要素を正しく表現できます:
<p></p>
<p>
<p> </p>
<p> <!-- comment --></p>

div:empty は次の<div>要素群については 正しい表現にはなりません:

<div>text</div>
<div><p></p></div>
<div>&nbsp;</div>
<div><p>bla</p></div>
<div>this is not <p>:empty</p></div>

注: SelectorsのLevel 2およびLevel 3では、 :emptyは 空白のみを含む要素には一致しませんでした。 これは改訂されました。なぜなら、HTMLでは空白は大部分が収縮されて表示上無視されてしまい ソース整形などの目的で使われるため、 特に終了タグ省略時には その空白がDOMテキストノードとして吸収されやすいからです。 これによって著者が「空」とみなす要素も 期待通りこのセレクターで選択できるようになりました。

13.3. 子インデックス系疑似クラス

テスト

この節で定義されている疑似クラスは、 要素が包括的な兄弟の中での インデックスに基づいて要素を選択します。

注: Selectors 3では、 これらのセレクターは親の子リストにおけるインデックスで 要素を選択すると記述されていました。 (この説明は本節の名前や、いくつかの疑似クラス名にも残っています。) しかし、親がいない要素や非要素ノードを親に持つ場合を除外する理由がなかったため、 「兄弟間での相対的インデックス」を指すよう表現が修正されています。

13.3.1. :nth-child() 疑似クラス

テスト

:nth-child(An+B [of S]? ) 疑似クラス記法は、 S というセレクターリスト<complex-real-selector-list>)に一致する 包括的兄弟のリストの中で、 An+B番目の要素にあたるものを表します。 Sを省略した場合、デフォルトは*|*です。

An+B記法とその解釈は CSS Syntax 3 § 6 The An+B microsyntax で定義されており、任意の非負整数nに対して インデックスi = An + Bを表します。

注: ここでいう要素リストのインデックスは1始まりです。 つまり、最初の子要素はインデックス1を持ち、 :nth-child(2n+1)に一致します(n=0のとき1になるため)。

たとえば、このセレクターはテーブルの各偶数行を選択したり、 パラグラフ毎に4つずつ色を変えたりするサイクル指定にも使えます。

例:
:nth-child(even)   /* 2番目、4番目、6番目…などを表す
:nth-child(10n-1)  /* 9番目、19番目、29番目…などを表す */
:nth-child(10n+9)  /* 同じ */
:nth-child(10n+-1) /* 構文的に無効で、無視される */

注: :nth-child() 疑似クラスの詳細度(specificity)は、 通常の疑似クラス1つ分に加え、 Sが指定された場合は S内の最も詳細度の高い複合セレクターの詳細度分が加算されます。 詳細は§ 15 セレクターの詳細度計算参照。 よってS:nth-child(An+B):nth-child(An+B of S)は 詳細度は完全に同じですが、挙動には違いがあります(下記例参照)。

セレクター引数を渡すことで、 そのセレクターに一致するn番目の要素を選択できます。 例: 下記セレクターは.importantクラスがついた 最初の3つのリスト項目に一致します:
:nth-child(-n+3 of li.important)

これはセレクターを関数外に書いた場合とは異なります:

li.important:nth-child(-n+3)

この場合は「リスト最初の3子要素がたまたま.importantだった場合のみ」一致します。

セレクター引数を使った応用のもう1例です。 テーブル行のゼブラストライプを正常に実現する場合です。

通常、テーブルのゼブラストライプ付けは次のようなCSSにします:

tr {
  background: white;
}
tr:nth-child(even) {
  background: silver;
}

ところが何行かが非表示だとこのパターンが崩れ、 同じ色が連続することがあります。 HTMLで[hidden]属性指定によって行が隠れる場合、 下記のようにセレクター引数を用いれば、 隠れている行に左右されず常に正しい交互背景を維持できます:

tr {
  background: white;
}
tr:nth-child(even of :not([hidden])) {
  background: silver;
}

13.3.2. :nth-last-child() 疑似クラス

:nth-last-child(An+B [of S]? ) 疑似クラス記法は、 Sというセレクターリスト<complex-real-selector-list>)に一致する 包括的兄弟のリストの末尾から数えて An+B番目の要素を表します。 Sを省略した場合、デフォルトは*|*です。

注: :nth-last-child()疑似クラスの詳細度も :nth-child()同様、 通常の疑似クラス+そのセレクター引数Sの詳細度の合計です。 詳細は§ 15 セレクターの詳細度計算参照。

CSS Syntax Module [CSS3SYN]An+B記法が定義されています。

例:
tr:nth-last-child(-n+2)    /* HTMLテーブルの最後の2行 */

foo:nth-last-child(odd)    /* 親要素内で後ろから数えて奇数番目のfoo要素すべて */

13.3.3. :first-child 疑似クラス

テスト

:first-child 疑似クラスは、 自身の包括的兄弟の中で最初の要素にあたるものを表します。 :nth-child(1)と同じ意味です。

例: 次のセレクターはdiv要素の 最初の子であるp要素を表します:
div > p:first-child

このセレクターは以下の断片中のdivpに一致します:

<p> The last P before the note.</p>
<div class="note">
   <p> The first P inside the note.</p>
</div>

しかし、次の断片内の2つ目のpには一致しません:

<p> The last P before the note.</p>
<div class="note">
   <h2> Note </h2>
   <p> The first P inside the note.</p>
</div>

次の2つのセレクターは通常同じ意味です:

* > a:first-child /* どんな要素の最初の子のa */
a:first-child /* 同じ(aがルート要素でなければ) */

13.3.4. :last-child 疑似クラス

テスト

:last-child 疑似クラスは、 自身の包括的兄弟の中で最後の要素であるものを表します。 :nth-last-child(1)と同義です。

例: 次のセレクターは、順序付きリストolの 最後の子要素であるリスト項目liを表します。
ol > li:last-child

13.3.5. :only-child 疑似クラス

テスト

:only-child 疑似クラスは、 兄弟を持たない要素を表します。 :first-child:last-child または :nth-child(1):nth-last-child(1)と同義ですが、詳細度はより低くなります。

13.4. 型指定子インデックス疑似クラス

テスト

この節の疑似クラスは子インデックス疑似クラスに似ていますが、兄弟リスト内で自身と同じ型(タグ名)の要素の中でのインデックスに基づいて判定されます。

13.4.1. :nth-of-type() 疑似クラス

:nth-of-type(An+B) 疑似クラス記法は、 :nth-child(|An+B| of S)に一致する要素と同じものを表します。 ここでSは当該要素に一致する型セレクター および名前空間プレフィックスです。 たとえば、 HTMLの img 要素がこの疑似クラスに一致するかどうかを判定する場合、 検討中のShtml|imgとなります(適切なhtml名前空間が宣言された場合)。

CSS例: これにより著者は画像のfloat位置を交互に切り替えることができます:
img:nth-of-type(2n+1) { float: right; }
img:nth-of-type(2n) { float: left; }

注: 要素の型が事前にわかっていれば、この疑似クラスは:nth-child()と型セレクターの組み合わせと同等です。 すなわち、img:nth-of-type(2)*:nth-child(2 of img) と同等です。

13.4.2. :nth-last-of-type() 疑似クラス

テスト

:nth-last-of-type(An+B) 疑似クラス記法は、 :nth-last-child(|An+B| of S)に一致するのと同じ要素を表します。 ここでSは、該当する要素に一致する型セレクター および名前空間プレフィックスです。 たとえば、 HTMLの img 要素がこの疑似クラスに一致するかどうかを判定する際、 検討すべきShtml|imgとなります(適切なhtml名前空間が宣言されていると仮定)。

例: XHTMLのbody内のすべてのh2子要素(ただし最初と最後を除く)を表すには、 次のセレクターが使えます:
body > h2:nth-of-type(n+2):nth-last-of-type(n+2) 

この場合も:not()を使うこともできますが、 セレクターの長さはほぼ同じになります:

body > h2:not(:first-of-type):not(:last-of-type) 

13.4.3. :first-of-type 疑似クラス

テスト

:first-of-type 疑似クラスは、 :nth-of-type(1)と同じ要素を表します。

例: 次のセレクターは定義リストdl内の定義タイトルdt(親要素の子リストの中で、その型として最初のもの)を表します。
dl dt:first-of-type

この記述は、以下の例の最初の2つのdt要素には有効ですが、3つ目には該当しません:

<dl>
  <dt>gigogne</dt>
  <dd>
    <dl>
      <dt>fusée</dt>
      <dd>multistage rocket</dd>
      <dt>table</dt>
      <dd>nest of tables</dd>
    </dl>
  </dd>
</dl>

13.4.4. :last-of-type 疑似クラス

テスト

:last-of-type 疑似クラスは、 :nth-last-of-type(1)と同じ要素を表します。

例: 次のセレクターは、テーブル行trの 最後のデータセルtdを表します。
tr > td:last-of-type

13.4.5. :only-of-type 疑似クラス

テスト

:only-of-type 疑似クラスは、 :first-of-type:last-of-type と同じ要素を表します。

14. コンビネーター

14.1. 子孫コンビネーター ( )

テスト

時には、著者が「ある要素の子孫である要素」をセレクターで記述したい場合があります(例:「em 要素が H1 要素内に含まれる場合」など)。 子孫コンビネーターはこのような関係を表現します。

子孫コンビネーターは、2つの複合セレクターの間に入る空白です。

A B のようなセレクターは、任意の先祖要素Aの子孫であるB要素を表します。

例: 例えば、次のセレクターを考えてみましょう:
h1 em

これは、em 要素が h1 要素の子孫であることを意味します。これは次の断片の正しい有効な一部記述です:

<h1>This <span class="myclass">headline
is <em>very</em> important</span></h1>

次のセレクター:

div * p

は、div 要素の孫以降の子孫である p 要素を表します。「*」の前後の空白は万能セレクター部分ではなく、 空白自体がコンビネーターとなり divが任意の要素の先祖で、その要素がpの先祖であることを示しています。 さらに、子孫コンビネーターと属性セレクターを組み合わせた次のセレクターは、 (1)href属性を持ち、(2)p内、かつそのpdivの内側である要素を表します:

div p *[href]

14.2. 子コンビネーター (>)

テスト

子コンビネーター は、2つの要素間の親子関係を表します。子コンビネーターは 「大なり記号」(U+003E、>)コードポイントで構成され、 2つの複合セレクターを区切ります。

例: 次のセレクターはbodyの 子であるp要素を表します:
body > p

次の例は子孫コンビネーターと子コンビネーターを組み合わせています。

div ol>li p

これはli要素の子孫であるp要素を表します。 li要素は ol要素の子である必要があり、 ol要素は divの子孫である必要があります。 また、「>」コンビネーター前後の空白は省略可能であることに注意してください。

要素の最初の子を選択する方法については、上記:first-child疑似クラスの節を参照してください。

14.3. 隣接兄弟コンビネーター (+)

テスト

次兄弟結合子は、“プラス記号” (U+002B、+) のコードポイントで構成され、2つの複合セレクターを区切ります。 これら2つの複合セレクターで表される要素は、ドキュメントツリー内で同じ親を持ち、 先に記述された複合セレクターで表される要素は、後に記述されたものの直前に位置します。 (要素間のテキストノードなど)非要素ノードは、要素の隣接関係を判定する際には無視されます。

例: 次のセレクターは、p 要素 が math 要素のすぐ後に続く場合に該当します:
math + p

以下のセレクターは、上の例と似ていますが、属性セレクターも加えています。 これはh1要素にclass="opener"が 必須である制約を加えています:

h1.opener + h2

14.4. 後続兄弟コンビネーター (~)

後続兄弟コンビネーターは「チルダ」 (U+007E、~) コードポイントで表現され、 2つの複合セレクターを区切ります。 両者で表現される要素は文書ツリーで同じ親を持ち、 1つ目の複合セレクターが表す要素より後で 2つ目の複合セレクターが表す要素が(直後でなくとも)現れます。

h1 ~ pre

これは、pre要素がh1要素の後続兄弟であることを意味します。以下はその一部の正しい説明例です:

<h1>Definition of the function a</h1>
<p>Function a(x) has to be applied to all figures in the table.</p>
<pre>function a(x) = 12x/13.5</pre>

15. セレクターの詳細度の計算

セレクターの詳細度(specificity)は 指定された要素に対して次の手順で計算します:

セレクターがセレクターリストの場合は リスト内の各セレクターごとにこの数を計算します。 当該リストに対するマッチング時には、 一致した中で最も詳細度の高いセレクターの値が有効になります。

一部の疑似クラスは他セレクターのための「評価コンテキスト」を提供し、 次のように特別な詳細度を定義します:

例:

詳細度の比較は3つの構成要素を順番に比較します: A値が大きければそちらがより詳細度高、 Aが同じならB値が大きい方がより詳細度高、 Bも同じならC値が大きい方が詳細度高、 全て同じなら同等とされます。

実装によるストレージ制限などにより、 ABCに上限があることがあります。 その場合は上限を越えた値は上限値で固定され、オーバーフローしません。

例:
*               /* a=0 b=0 c=0 */
LI              /* a=0 b=0 c=1 */
UL LI           /* a=0 b=0 c=2 */
UL OL+LI        /* a=0 b=0 c=3 */
H1 + *[REL=up]  /* a=0 b=1 c=1 */
UL OL LI.red    /* a=0 b=1 c=3 */
LI.red.level    /* a=0 b=2 c=1 */
#x34y           /* a=1 b=0 c=0 */
#s12:not(FOO)   /* a=1 b=0 c=1 */
.foo :is(.bar, #baz)
                /* a=1 b=1 c=0 */

注: 同じ単純セレクターの繰り返しは可能で、それだけ詳細度も上がります。

注: HTMLのstyle属性で指定したスタイルの詳細度は CSS Style Attributesで説明されています。 [CSSSTYLEATTR]

16. 文法

テスト

セレクターは、以下の文法に従って構文解析されます。

<selector-list> = <complex-selector-list>

<complex-selector-list> = <complex-selector>#
<complex-real-selector-list> = <complex-real-selector>#

<compound-selector-list> = <compound-selector>#

<simple-selector-list> = <simple-selector>#

<relative-selector-list> = <relative-selector>#
<relative-real-selector-list> = <relative-real-selector>#


<complex-selector> = <complex-selector-unit> [ <combinator>? <complex-selector-unit> ]*
<complex-selector-unit> = [ <compound-selector>? <pseudo-compound-selector>* ]!
<complex-real-selector> = <compound-selector> [ <combinator>? <compound-selector> ]*

<relative-selector> = <combinator>? <complex-selector>
<relative-real-selector> = <combinator>? <complex-real-selector>

<compound-selector> = [ <type-selector>? <subclass-selector>* ]!
<pseudo-compound-selector> =  <pseudo-element-selector> <pseudo-class-selector>*

<simple-selector> = <type-selector> | <subclass-selector>


<combinator> = '>' | '+' | '~' | [ '|' '|' ]

<wq-name> = <ns-prefix>? <ident-token>
<ns-prefix> = [ <ident-token> | '*' ]? '|'

<type-selector> = <wq-name> | <ns-prefix>? '*'

<subclass-selector> = <id-selector> | <class-selector> |
                      <attribute-selector> | <pseudo-class-selector>

<id-selector> = <hash-token>

<class-selector> = '.' <ident-token>

<attribute-selector> = '[' <wq-name> ']' |
    '[' <wq-name> <attr-matcher> [ <string-token> | <ident-token> ] <attr-modifier>? ']'
<attr-matcher> = [ '~' | '|' | '^' | '$' | '*' ]? '='
<attr-modifier> = i | s

<pseudo-class-selector> = : <ident-token> |
                          : <function-token> <any-value> )

<pseudo-element-selector> = : <pseudo-class-selector> | <legacy-pseudo-element-selector>
<legacy-pseudo-element-selector> =  : [before | after | first-line | first-letter]

上記の文法を解釈する際、 次の規則が適用されます:

注: セレクターはさらにさまざまなより具体的な構文上の制約を受けます。 上記の文法に従うことは必要だが十分条件ではありません。 セレクターの解析に関する追加の規則については § 3.9 無効なセレクターとエラー処理 を参照してください。

注: 一般的に、 <pseudo-element-selector> は、 <complex-selector> 内の 最後の <compound-selector> の 末尾に置かれている場合のみ有効です。 しかしながら、状況によっては、その後にさらなる<pseudo-element-selector>や、 <pseudo-class-selector> が続くこともあります。 ただし、これらはケースバイケースで定義されています。 (例えば、ユーザーアクション疑似クラスは どの疑似要素の後にも許可されていますし、 ツリー対応疑似要素::slotted() 疑似要素の後に許可されています。)

Level 2 の 4 つの 疑似要素::before::after::first-line、 および ::first-letter) は互換性のため、先頭のコロンを1つだけにして書くことが許可されています。 これにより、それらが <pseudo-class-selector> に似て見えることがあります。

16.1. <forgiving-selector-list><forgiving-relative-selector-list>

レガシーの理由から、 セレクターリストの一般的な振る舞いは、 リスト内のいずれかのセレクターの解析に失敗すると (例えば新しい機能や UA 固有のセレクター構文が使われている場合など)、 セレクターリスト全体が無効になるというものです。 これにより、新しいセレクターを使った CSS を古いユーザーエージェントでも安全に記述することが困難になります。

<forgiving-selector-list> の生成規則は、 リスト内の各セレクターを個別に解析し、 解析に失敗したものだけを無視して残りを使用できるようにする、というものです。

注: スタイルルールでは引き続き通常の厳格な セレクターリストの挙動が使われます。<forgiving-selector-list>:is():where() のみで使われます。 対応する適用範囲は詳細度にわずかな影響を与えますが、 スタイルルールのセレクターを :is() でラップすると、 疑似要素を含まない限り、そのセレクターは寛容(forgiving)になります(:is() や :where() の中では疑似要素は無効です)。

構文的には、<forgiving-selector-list><any-value>? と等価です。 実際の値は 寛容なセレクターリストとして解析して得られます。

To 寛容なセレクターリストとして解析する given an input input:
  1. カンマ区切りのリストとして解析し、 <complex-real-selector>input から生成し、 その結果を selector list とします。

  2. selector list から、失敗したアイテムおよび 無効なセレクター をすべて削除し、 残った項目を並べて <selector-list> として返します。 (空の可能性もあります。)

<forgiving-selector-list> 内のいかなる項目も、 無効(未知のセレクターや構文を使っている場合や、文脈上無効である場合など)であれば、 その項目の詳細度は 0 と扱われなければなりません。

注: <forgiving-selector-list> は意図的に :is():where() のみに使用され、 セレクター引数を取る他の疑似クラスでは使用されません。

17. API フック

Selectors の概念を用いる仕様を書きやすくするために、 この節では他の仕様から呼び出せるいくつかの API フックを定義します。

これらは、 matchinvalid selector のより厳密な定義が得られた現在でも 依然として必要でしょうか? 名詞の方が述語より仕様間で調整しやすく、 また querySelector から返される要素順のような細かい点は Selectors より DOM 仕様に定義させる方が理にかなっているように思えます。

17.1. セレクターを解析する (Parse A Selector)

この節では、文字列 source から セレクターを解析する 方法を定義します。 戻り値は複合セレクターリストか、失敗です。

  1. Let selector be the result of parsing source as a <selector-list>. If this returns failure, it’s an invalid selector; return failure.
  2. If selector is an invalid selector for any other reason (such as, for example, containing an undeclared namespace prefix), return failure.
  3. Otherwise, return selector.

17.2. 相対セレクターを解析する (Parse A Relative Selector)

この節では、文字列 source から 相対セレクターを解析する 方法を定義します。 戻り値は複合セレクターリストか、失敗です。

  1. Let selector be the result of parsing source as a <relative-selector-list>. If this returns failure, it’s an invalid selector; return failure.
  2. If selector is an invalid selector for any other reason (such as, for example, containing an undeclared namespace prefix), return failure.
  3. Otherwise, return selector.

17.3. 要素に対してセレクターを照合する (Match a Selector Against an Element)

この節では、要素に対してセレクターを照合する 方法を定義します。

このアルゴリズムを使う API は selectorelement を提供する必要があります。

呼び出し側はオプションで以下を提供できます:

このアルゴリズムは success または failure を返します。

与えられた selector の各 複合セレクター(これは 複合セレクターのリスト と見なされます)について、 次の段落で説明するようにその複合セレクターを element に対して照合します。 もし任意の複合セレクターで照合が成功すればその時点でアルゴリズムは success を返し、 どれも成功しなければ failure を返します。

複合セレクターを要素に照合する ためには、 右から左へ1つずつ 複合セレクター を処理します。 この処理は再帰的に次のように定義されます:

17.4. 疑似要素に対してセレクターを照合する (Match a Selector Against a Pseudo-element)

この節では、疑似要素に対してセレクターを照合する 方法を定義します。

このアルゴリズムを使う API は selectorpseudo-element を提供する必要があります。 また前節の要素照合に渡せる同じオプション類を任意で与えることができます。

このアルゴリズムは success または failure を返します。

与えられた selector の各 複合セレクター について、 もし次の両方が成立するなら:

なら success を返します。

それ以外の場合(つまり、selector 中のどの複合セレクターに対しても上の条件が成り立たない場合)は、 failure を返します。

17.5. ツリーに対してセレクターを照合する (Match a Selector Against a Tree)

この節では、ツリーに対してセレクターを照合する 方法を定義します。

このアルゴリズムを使う API はセレクターと、 セレクターが検索する サブツリー を示す1つ以上の root elements を提供する必要があります。 すべての root elements は同じ ルート を共有していなければなりません。そうでない場合、このアルゴリズムの呼び出しは無効です。

オプションで以下を提供できます:

このアルゴリズムは(空の場合もある)要素の一覧を返します。

  1. まず candidate elements の一覧を作ります。これは root elements とそのすべての子孫要素で、 特に指定がない限り シャドウを含むツリー順(shadow-including tree order) で整列します。
  2. もし スコーピングルート が提供されていれば、 candidate elements から、少なくとも1つのスコーピングルートの子孫でない要素を削除します。
  3. selector match list を空に初期化します。
  4. candidate elements の各 element について:
    1. もし 要素に対してセレクターを照合する の結果が success であれば、 elementselector match list に追加します。
    2. element に関連づけられる可能性のある各疑似要素で、マッチリストに現れてよい疑似要素であれば、 その疑似要素に対して 疑似要素に対してセレクターを照合する を実行し、 結果が success であればその疑似要素を selector match list に追加します。

      疑似要素の selector match list 内での相対的な位置づけは未定義です。 現時点ではこれを公開する文脈はまだありませんが、いつか何かを公開する前に決める必要があります。

付録 A: ソース文書とデータを要素ツリーにマッピングするためのガイダンス

この節は参考情報です。

DOM が記述する要素ツリー構造は強力で有用ですが、 木構造データ(あるいは適切に解釈すればグラフ構造)を表現するほぼすべての言語をモデル化できるほど汎用的です。

HTML のように、ある言語はリソースから DOM オブジェクトを生成する明確な手順を既に持っています。 もし与えられた言語がそのような手順を持たない場合、 Selectors をその言語の文書に適用するにはその手順を定義する必要があります。

最低限、文書言語は DOM の「要素」に対応するものが何であるかを定義する必要があります。

ノード間の主要な一対多の関係(木構造なら親/子、グラフ構造なら要素/隣接要素など)は、 要素の子ノードとして反映されるべきです。

要素のその他の特性は DOM の同様の特性と同等の目的を果たす何かにマップされるべきです:

type
文書言語の要素がグループを区別するための「型」を持つならば、 それは "type" 特性として反映されるべきです。

もしこの "type" が「基本名」とそれを高次のグループにまとめる「名前空間」に分けられるなら、 後者は "namespace" 特性として反映されるべきです。 そうでなければ、その要素は "namespace" 特性を持つべきではなく、 全体の名前が "type" 特性として反映されるべきです。

id
文書内で一意の識別子として機能する何らかの側面があるならば、 それは "id" 特性にマップされるべきです。

注: HTML は各要素が単一の ID を持つことを許可しますが、 これは一般的制限とみなすべきではありません。 ID の重要な性質は各 ID が単一の要素に結び付くことであり、 単一の要素が複数の ID を持つことは有効です。

classes and attributes
要素を識別するのに有用であるが文書内で一意ではない側面は、 "class" または "attribute" 特性にマップされるべきです(ラベルのような単独の文字列なら class、名前/値の対のようなものなら attribute)。
pseudo-classes and pseudo-elements
もし要素が疑似クラスに一致したり疑似要素を持つならば、 それは明示的に定義されなければなりません。

一部の疑似クラスは構文的なもので、 例えば :has():is() のように常に動作すべきものがあります。 その点をどこかに示す必要があります。 構造的な疑似は子リストが順序付けられている限り常に動作するだろうと考えられます。

例: 例えば JSONSelect はセレクターを使って JSON 文書から情報を抽出するライブラリです。

この構造は、セレクターを用いて JSON 文書を強力かつ簡潔に検索するのに十分です。

付録 B: Web 互換性のために必要だが廃止予定の -webkit- パースのクワーク

テスト

この付録は規範的です。

レガシーな Web 互換性の制約のために、 Web 文書をパースすることを期待されるユーザーエージェントは次の機能をサポートしなければなりません:

付録 C: プライバシー保護を考慮した :visited 制限の例

:visited におけるユーザープライバシー保護の以前の試みは、 リンクが :visited に一致するか :link に一致するかを 「偽装」するための複雑な制約と挙動を伴い、 悪意のあるサイトがユーザーの訪問履歴を観察する可能性を下げつつも、 :visited を有用に保つためのものでした。 しかしこれは結局勝ち目のない軍拡競争であり、 これらの緩和策があってもユーザーのブラウジング履歴を抽出する方法が複数文書化されています。

この節では、まず https://github.com/explainers-by-googlers/Partitioning-visited-links-history で開発・文書化されたアプローチを説明します。 これはユーザーの訪問履歴情報を分割し、 サイトオリジン自身が観測できたナビゲーションに対応するリンクのみを :visited が一致するようにするものです。 これにより :visited を 上述の複雑な緩和策なしに通常の疑似クラスとして扱うことができ、 サイトに既に理論的に利用可能な情報以外を露出せずに、 ユーザーにとっての :visited の有用性を できるだけ保つことができます。

  1. visited history を次の3つ組の 集合 として定義します(タプル):

    • 訪問した URL

    • ナビゲーションを開始したサイトの origin

    • ナビゲーションを開始したフレームを含むトップレベルサイトの site。 (多くの場合前項と同じになりますが、例えば iframe 内でユーザーがリンクをクリックした場合などには異なることがあります。)

  2. ページ内から(例:ユーザーのリンククリックやページ内スクリプトによるナビゲーション開始など)ナビゲーションが発生した際には、 そのナビゲーション先の URL、リンクやスクリプトを含むページの origin、およびそのページを含むトップレベルサイトの(schemeful な) site を visited history に記録するエントリを追加します。

    注: これにより、サイトはそのオリジン内のどこからでもユーザーがクリックしたリンクの :visited 情報を 観測できるようになります。言い換えれば、そのサイトが A のときの任意の A -> B ナビゲーションに対して情報が得られます。

    さらに、トップレベルフレームまたはそのトップレベルフレームと同一オリジンの iframe からのナビゲーションについては、 宛先の URL、その宛先の origin、そして宛先の site を記録するエントリも visited history に追加します。

    注: これにより、サイトは自身のページに関する:visited情報を確認できます (これは既にそのサイトから観測可能な情報です)。 このことは、そのページへのナビゲーションをどのサイトが始めたかに関係なく当てはまります。 言い換えれば、どんな A → B のナビゲーションでも、 サイトがBの場合に該当します。

    注: 注目すべき点として、アドレスバーへの直接入力、ブックマークのクリック、 別プログラムからのリンクドラッグなど、ユーザーエージェントの UI によってトリガーされた直接のナビゲーションは visited history のエントリを追加しません。 もちろんこれらはブラウザが他の目的(例えばアドレスバー入力時の URL 提案など)で用いる訪問履歴には依然として追加され得ます。

  3. リンク要素が :link:visited に一致するかを判定する際、 リンクの宛先、リンクを含むページの origin、リンクを含むトップレベルサイトが visited history のタプルと一致する場合にのみリンクを :visited として扱うようにしてください。

ページの origin とトップレベルサイトの両方を含めることにより、 以下のようないくつかの可能なプライバシー攻撃を防ぎます:

18. 変更点

18.1. 2022年11月11日作業草案以降の変更

2022年11月11日作業草案(https://www.w3.org/TR/2022/WD-selectors-4-20221111/)以降の主な変更点:

18.2. 2022年5月7日作業草案以降の変更

2022年5月7日作業草案(https://www.w3.org/TR/2022/WD-selectors-4-20220507/)以降の主な変更点:

18.3. 2018年11月21日作業草案以降の変更

2018年11月21日作業草案(https://www.w3.org/TR/2018/WD-selectors-4-20181121/)以降の主な変更点:

18.4. 2018年2月2日作業草案以降の変更

2018年2月2日作業草案(https://www.w3.org/TR/2018/WD-selectors-4-20180202/)以降の主な変更点:

注: 2018年2月1日草案には未完成の作業が誤ってコミットされていました; 2月2日版でこれを戻し(およびリンクの修正も行われ)ています。

18.5. 2013年5月2日作業草案以降の変更

2013年5月2日作業草案(https://www.w3.org/TR/2013/WD-selectors4-20130502/)以降の主な変更点には:

注: 2018年2月1日草案には未完の作業が誤って含まれており、 2月2日版でこれが戻されています(ついでにリンクも修正されています)。

18.6. 2012年8月23日作業草案以降の変更

2012年8月23日作業草案(https://www.w3.org/TR/2012/WD-selectors4-20120823/)以降の主な変更点には:

18.7. 2011年9月29日作業草案以降の変更

2011年9月29日作業草案(https://www.w3.org/TR/2011/WD-selectors4-20110929/)以降の主な変更点には:

18.8. Level 3 以降の追加

Level 3(https://www.w3.org/TR/selectors-3/)以降の追加:

19. 謝辞

CSS ワーキンググループは、長年にわたって以前の Selectors 仕様に貢献したすべての方々に感謝します。 それらの仕様が本仕様の基礎となりました。 特に、Selectors Level 4 への具体的な貢献に対して次の方々に特別な謝意を表します: L. David Baron, Andrew Fedoniouk, Daniel Glazman, Ian Hickson, Grey Hodge, Lachlan Hunt, Anne van Kesteren, Jason Cranford Teague, Lea Verou

プライバシー考慮事項

セキュリティ考慮事項

プライバシー考慮事項 はセキュリティにも影響を与えると考えられます。

適合性

文書の慣例

適合性要件は、説明的な主張と RFC 2119 の用語の組み合わせで表現されます。 規範的な部分に出てくるキーワード “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” はこの文書の規範的な部分において RFC 2119 の説明に従って解釈されます。 ただし、可読性のために、これらの語は本仕様書において すべて大文字で表記されているわけではありません。

本仕様書の本文は、明示的に非規範と示された節、例、および注を除き、 すべて規範的です。 [RFC2119]

本仕様書の例は “for example” という語で導入されるか、 または規範的な本文から class="example" で区別されます、 次のように:

これは参考情報としての例です。

参考的な注は "Note" という語で始まり、規範的な本文から class="note" で区別されます、次のように:

注: これは参考的な注です。

助言(Advisements)は特に注意を喚起するように装飾された規範的な節であり、 他の規範的本文から <strong class="advisement"> によって区別されます、例えば 次のように: ユーザーエージェントはアクセス可能な代替を提供しなければなりません。

テスト

Tests relating to the content of this specification may be documented in “Tests” blocks like this one. Any such block is non-normative.


適合性クラス

本仕様への適合は、次の3つの適合性クラスについて定義されます:

style sheet
A CSS style sheet.
renderer
A UA that interprets the semantics of a style sheet and renders documents that use them.
authoring tool
A UA that writes a style sheet.

スタイルシートが本モジュールで定義された構文を使用するすべての記述について、汎用のCSS文法および各機能の個別文法に従って有効であれば、そのスタイルシートは本仕様に適合しているものとみなされます。

レンダラーが本仕様に適合するとは、適切な仕様によって定義された通りにスタイルシートを解釈することに加え、本仕様で定義されたすべての機能を正しく解析して文書をそれに応じてレンダリングすることを意味します。ただし、機器の制約によりユーザーエージェントが文書を正しくレンダリングできない場合でも、そのことで UA が非適合になるわけではありません。(例えば、白黒モニタ上で色をレンダリングすることを UA に要求するものではありません。)

オーサリングツールが本仕様に適合するとは、汎用のCSS文法および本モジュール内の各機能の個別文法に従って構文的に正しいスタイルシートを書き、本モジュールで記述されたスタイルシートのその他すべての適合性要件を満たすことを意味します。

部分的な実装

著者がフォワード互換の解析規則を利用してフォールバック値を割り当てられるようにするため、CSS レンダラーは、使用可能なサポートレベルを持たない at-rule、プロパティ、プロパティ値、キーワード、およびその他の構文構成を 無効として扱い(かつ適切に無視する)必要があります。特に、ユーザーエージェントは、未サポートの構成値を選択的に無視して、サポートされる値だけを単一の複数値プロパティ宣言内で有効にすることは してはなりません:もしどれかの値が無効とみなされるなら(未サポートの値は無効とされるべきです)、CSS は当該宣言全体を無視することを要求します。

不安定および独自機能の実装

将来の安定した CSS 機能との衝突を避けるため、CSSWG は 不安定機能の実装に関するベストプラクティス の遵守を推奨します。また CSS への 独自拡張 の実装に関しても同様の注意を促します。

非実験的な実装

仕様が Candidate Recommendation の段階に到達した時点で、非実験的な実装が可能になり、実装者は仕様に従って正しく実装されていることを示せる CR レベルの機能については、接頭辞なしの実装をリリースすることが望まれます。

CSS の実装間で相互運用性を確立・維持するため、CSS ワーキンググループは非実験的な CSS レンダラーに対し、接頭辞なしの実装をリリースする前に実装レポート(必要であればその実装レポートに使ったテストケース)を W3C に提出することを要請します。W3C に提出されたテストケースは CSS ワーキンググループによるレビューおよび修正の対象となります。

テストケースと実装レポートの提出に関する詳細は、CSS ワーキンググループのウェブサイト https://www.w3.org/Style/CSS/Test/ にあります。質問は public-css-testsuite@w3.org メーリングリスト宛てにお願いします。

索引

本仕様で定義される用語

参照によって定義される用語

参考文献

Normative References

[BCP47]
A. Phillips, Ed.; M. Davis, Ed.. Tags for Identifying Languages. September 2009. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc5646
[CSS-DISPLAY-4]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 4. 6 November 2025. WD. URL: https://www.w3.org/TR/css-display-4/
[CSS-MULTICOL-2]
Florian Rivoal; Rachel Andrew. CSS Multi-column Layout Module Level 2. 19 December 2024. FPWD. URL: https://www.w3.org/TR/css-multicol-2/
[CSS-POSITION-4]
Elika Etemad; Tab Atkins Jr.. CSS Positioned Layout Module Level 4. 7 October 2025. WD. URL: https://www.w3.org/TR/css-position-4/
[CSS-PSEUDO-4]
Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4. 27 June 2025. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-SHADOW-1]
CSS Shadow Module Level 1. Editor's Draft. URL: https://drafts.csswg.org/css-shadow-1/
[CSS-TEXT-4]
Elika Etemad; et al. CSS Text Module Level 4. 29 May 2024. WD. URL: https://www.w3.org/TR/css-text-4/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 12 March 2024. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 10 December 2019. REC. URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS21]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 7 June 2011. REC. URL: https://www.w3.org/TR/CSS2/
[CSS3NAMESPACE]
Elika Etemad. CSS Namespaces Module Level 3. 20 March 2014. REC. URL: https://www.w3.org/TR/css-namespaces-3/
[CSS3SYN]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 24 December 2021. CRD. URL: https://www.w3.org/TR/css-syntax-3/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC4647]
A. Phillips, Ed.; M. Davis, Ed.. Matching of Language Tags. September 2006. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc4647
[SELECT]
Tantek Çelik; et al. Selectors Level 3. 6 November 2018. REC. URL: https://www.w3.org/TR/selectors-3/
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 11 November 2022. WD. URL: https://www.w3.org/TR/selectors-4/
[SELECTORS-5]
Selectors Level 5. Editor's Draft. URL: https://drafts.csswg.org/selectors-5/
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/

Informative References

[CSS-COLOR-5]
Chris Lilley; et al. CSS Color Module Level 5. 13 January 2026. WD. URL: https://www.w3.org/TR/css-color-5/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 3. 30 March 2023. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS3UI]
Tantek Çelik; Florian Rivoal. CSS Basic User Interface Module Level 3 (CSS3 UI). 21 June 2018. REC. URL: https://www.w3.org/TR/css-ui-3/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 26 August 2021. WD. URL: https://www.w3.org/TR/cssom-1/
[CSSSTYLEATTR]
Tantek Çelik; Elika Etemad. CSS Style Attributes. 7 November 2013. REC. URL: https://www.w3.org/TR/css-style-attr/
[FULLSCREEN]
Philip Jägenstedt. Fullscreen API Standard. Living Standard. URL: https://fullscreen.spec.whatwg.org/
[HTML5]
Ian Hickson; et al. HTML5. 27 March 2018. REC. URL: https://www.w3.org/TR/html5/
[ITS20]
David Filip; et al. Internationalization Tag Set (ITS) Version 2.0. 29 October 2013. REC. URL: https://www.w3.org/TR/its20/
[MATHML]
Patrick D F Ion; Robert R Miner. Mathematical Markup Language (MathML™) 1.01 Specification. 7 March 2023. REC. URL: https://www.w3.org/TR/REC-MathML/
[MATHML-CORE]
David Carlisle; Frédéric Wang. MathML Core. 24 June 2025. CR. URL: https://www.w3.org/TR/mathml-core/
[PICTURE-IN-PICTURE]
Francois Beaufort. Picture-in-Picture. 2 December 2025. WD. URL: https://www.w3.org/TR/picture-in-picture/
[QUIRKS]
Simon Pieters. Quirks Mode Standard. Living Standard. URL: https://quirks.spec.whatwg.org/
[SVG11]
Erik Dahlström; et al. Scalable Vector Graphics (SVG) 1.1 (Second Edition). 16 August 2011. REC. URL: https://www.w3.org/TR/SVG11/
[XFORMS11]
John Boyer. XForms 1.1. 20 October 2009. REC. URL: https://www.w3.org/TR/xforms11/
[XML-NAMES]
Tim Bray; et al. Namespaces in XML 1.0 (Third Edition). 8 December 2009. REC. URL: https://www.w3.org/TR/xml-names/
[XML10]
Tim Bray; et al. Extensible Markup Language (XML) 1.0 (Fifth Edition). 26 November 2008. REC. URL: https://www.w3.org/TR/xml/

課題インデックス

Add comma-separated syntax for multiple-value matching? e.g. [rel ~= next, prev, up, first, last]
There’s a desire from authors to propagate :focus from a form control to its associated label element; the main objection seems to be implementation difficulty. See CSSWG issue (CSS) and WHATWG issue (HTML).
Are these still necessary now that we have more rigorous definitions for match and invalid selector? Nouns are a lot easier to coordinate across specification than predicates, and details like the exact order of elements returned from querySelector seem to make more sense being defined in the DOM specification than in Selectors.
Only the tree-abiding pseudo-elements are really handled in any way remotely like this.
The relative position of pseudo-elements in selector match list is undefined. There’s not yet a context that exposes this information, but we need to decide on something eventually, before something is exposed.
Some pseudo-classes are *syntactical*, like :has() and :is(), and thus should always work. Need to indicate that somewhere. Probably the structural pseudos always work whenever the child list is ordered.
Semantic definition should probably move back here.
Need to define tree for XML.