セレクター レベル 4

W3C ワーキングドラフト,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2022/WD-selectors-4-20221111/
最新の公開バージョン:
https://www.w3.org/TR/selectors-4/
編集者ドラフト:
https://drafts.csswg.org/selectors/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/selectors-4
テストスイート:
http://test.csswg.org/suites/selectors-4_dev/nightly-unstable/
フィードバック:
CSSWG イシューレポジトリ
仕様内インライン
編集者:
Elika J. Etemad / fantasai (招待専門家)
Tab Atkins Jr. (Google)
以前の編集者:
Tantek Çelik
Daniel Glazman
Ian Hickson
Peter Linss
John Williams
この仕様の編集提案:
GitHub エディター

概要

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

CSSは構造化された文書(HTMLやXMLなど)の表示方法を画面や紙などに記述する言語です。

この文書のステータス

このセクションは公開時点の文書のステータスを説明します。 現在のW3C出版物一覧およびこの技術レポートの最新版は W3C技術レポートインデックス https://www.w3.org/TR/ で確認できます。

この文書はCSSワーキンググループにより ワーキングドラフトとして勧告トラックを用いて公開されました。 ワーキングドラフトとして公開されたことは W3Cおよびそのメンバーによる承認を意味しません。

この文書はドラフトであり、今後更新・置換・廃止される可能性があります。 本文書を進行中の作業以外の目的で引用することは不適切です。

フィードバックはGitHubでissueを提出(推奨)、タイトルにスペックコード "selectors" を含めて、次のように記載してください: “[selectors] …コメントの要約…”。 すべてのissueやコメントはアーカイブされます。 または、(アーカイブあり) 公開メーリングリスト www-style@w3.org に送信することもできます。

この文書は2021年11月2日 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, …) E要素のうち、複合セレクターs1または複合セレクターs2のいずれにも一致しないもの § 4.3 否定(非一致)疑似クラス: :not() 3/4
E:is(s1, s2, …) E要素のうち、複合セレクターs1または複合セレクターs2のどちらかに一致するもの § 4.2 任意一致疑似クラス: :is() 4
E:where(s1, s2, …) E要素のうち、複合セレクターs1または複合セレクターs2のどちらかに一致するが特異性に寄与しないもの § 4.4 特異性調整疑似クラス: :where() 4
E:has(rs1, rs2, …) E要素をアンカーとして、相対セレクターrs1またはrs2のいずれかに一致する要素が存在する場合 § 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属性値がbarのいずれかの(ASCII範囲)大文字小文字パターンに完全一致するE要素 § 6.3 大文字・小文字の区別 4
E[foo="bar" s] foo属性値が同一であるbarと一致するE要素 § 6.3 大文字・小文字の区別 4
E[foo~="bar"] foo属性値がスペース区切り値のリストで、その中に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) 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:local-link ハイパーリンクのソースアンカーとなり、現在のURLをターゲットとするE要素 § 8.3 ローカルリンク疑似クラス: :local-link 4
E:target 現在のURLのターゲットとなるE要素 § 8.4 ターゲット疑似クラス: :target 3
E:target-within 現在のURLのターゲット、またはその要素を含むE要素 § 8.5 ターゲットコンテナ疑似クラス: :target-within 4
E:scope スコープルートとなるE要素 § 8.6 参照要素疑似クラス: :scope 4
E:current 時間次元キャンバス上で現在表示されているE要素 § 10.1 現在要素疑似クラス: :current 4
E:current(s) セレクターsに一致する最も深い:current要素 § 10.1 現在要素疑似クラス: :current 4
E:past 時間次元キャンバス上で過去に属するE要素 § 10.2 過去要素疑似クラス: :past 4
E:future 時間次元キャンバス上で未来に属するE要素 § 10.3 未来要素疑似クラス: :future 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 § 13.1.1 :enabled ・ :disabled 疑似クラス 3
E:read-write
E:read-only
ユーザーが変更可能または変更不可なUI要素E § 13.1.2 変更可能性疑似クラス: :read-only ・ :read-write 3-UI/4
E:placeholder-shown プレースホルダー文字列を表示している入力コントロール § 13.1.3 プレースホルダー表示疑似クラス: :placeholder-shown 3-UI/4
E:default 関連選択肢グループ内でデフォルト項目となるUI要素E § 13.1.5 デフォルト選択疑似クラス: :default 3-UI/4
E:checked 選択(チェック)済みのUI要素E(例:ラジオボタンやチェックボックス) § 13.2.1 選択オプション疑似クラス: :checked 3
E:indeterminate 不定状態(チェック済みでも未チェックでもない)UI要素E § 13.2.2 不定値疑似クラス: :indeterminate 4
E:valid
E:invalid
データ妥当性条件を満たす・満たさないユーザー入力要素E § 13.3.2 妥当性疑似クラス: :valid ・ :invalid 3-UI/4
E:in-range
E:out-of-range
値が範囲内または範囲外のユーザー入力要素E § 13.3.3 範囲疑似クラス: :in-range ・ :out-of-range 3-UI/4
E:required
E:optional
入力が必須・任意のユーザー入力要素E § 13.3.4 任意性疑似クラス: :required ・ :optional 3-UI/4
E:blank 値が空(未入力・未設定)のユーザー入力要素E § 13.3.1 空値疑似クラス: :blank 4
E:user-invalid ユーザーが変更し、入力が不正(無効・範囲外・必須なのに未入力)となっているユーザー入力要素E § 13.3.5 ユーザー操作疑似クラス: :user-valid ・ :user-invalid 4
E:root ドキュメントのルートとなるE要素 § 14.1 :root 疑似クラス 3
E:empty 子要素(要素やテキスト)がなく、空白のみの可能性があるE要素 § 14.2 :empty 疑似クラス 3
E:nth-child(n [of S]?) 親要素内でSに一致し、n番目のE要素 § 14.3.1 :nth-child() 疑似クラス 3/4
E:nth-last-child(n [of S]?) 親要素内でSに一致し、最後から数えてn番目のE要素 § 14.3.2 :nth-last-child() 疑似クラス 3/4
E:first-child 親要素内で最初のE要素 § 14.3.3 :first-child 疑似クラス 2
E:last-child 親要素内で最後のE要素 § 14.3.4 :last-child 疑似クラス 3
E:only-child 親要素内で唯一のE要素 § 14.3.5 :only-child 疑似クラス 3
E:nth-of-type(n) 同じ型の兄弟要素のうちn番目のE要素 § 14.4.1 :nth-of-type() 疑似クラス 3
E:nth-last-of-type(n) 同じ型の兄弟要素のうち、最後から数えてn番目のE要素 § 14.4.2 :nth-last-of-type() 疑似クラス 3
E:first-of-type 同じ型の兄弟要素のうち最初のE要素 § 14.4.3 :first-of-type 疑似クラス 3
E:last-of-type 同じ型の兄弟要素のうち最後のE要素 § 14.4.4 :last-of-type 疑似クラス 3
E:only-of-type 同じ型の兄弟要素のうち唯一のE要素 § 14.4.5 :only-of-type 疑似クラス 3
E F E要素の子孫であるF要素 § 15.1 子孫結合子( ) 1
E > F E要素の子であるF要素 § 15.2 子結合子(>) 2
E + F E要素の直後に続くF要素 § 15.3 隣接兄弟結合子(+) 2
E ~ F E要素の前に存在するF要素 § 15.4 一般兄弟結合子(~) 3
F || E F要素が表すカラムに属する、グリッド/テーブルのセルとなるE要素 § 16.1 カラム結合子(||) 4
E:nth-col(n) グリッド/テーブルでn番目のカラムに属するセルとなるE要素 § 16.2 :nth-col() 疑似クラス 4
E:nth-last-col(n) グリッド/テーブルで最後から数えてn番目のカラムに属するセルとなるE要素 § 16.3 :nth-last-col() 疑似クラス 4

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

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

3.1. 構造と用語

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

単純セレクターは、1つの要素に対する単一条件です。 型セレクター全称セレクター属性セレクタークラスセレクターIDセレクター、 または疑似クラス単純セレクターです。 (これはセレクターの<simple-selector>で表現されます。文法参照。) ある要素が一致するとされるのは、その単純セレクターが、この仕様および文書言語に従って要素を正しく記述する場合です。

複合セレクターは、 単純セレクターの連続であり、 結合子で区切られていません。 1つの要素に複数の条件を同時に課します。 型セレクター全称セレクターを含む場合、 それらは連続の最初に来なければなりません。 連続内には型セレクターまたは全称セレクターは1つだけ許容されます。 (複合セレクターは、セレクターの<compound-selector>で表現されます。文法参照。) ある要素が複合セレクターに一致するとは、複合セレクター内のすべての単純セレクターに一致する場合です。

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

結合子は、両側の複合セレクターが表す2要素間の関係条件です。 セレクター レベル4の結合子には、 子孫結合子(空白)、 子結合子(U+003E、>)、 隣接兄弟結合子(U+002B、+)、 一般兄弟結合子(U+007E、~)があります。 2つの要素が結合子一致するとは、それらの関係条件が成立する場合です。

複雑セレクターは、 結合子で区切られた1つ以上の複合セレクターの並びです。 特定の関係で結ばれた要素群に同時に条件を課します。 (複雑セレクターは<complex-selector>で表現されます。文法参照。) ある要素が複雑セレクター一致するとは、 各複合セレクターに対応する要素のリストが存在し、 その各要素ペアが間にある結合子の条件を満たし、 最後の要素が与えられた要素である場合です。

注: つまり、単一の複合セレクターからなるセレクターは、構成する単純セレクターすべての条件を満たす要素に一致します。 さらに別の複合セレクター結合子を前に付加すると、追加の一致条件が課され、 複雑セレクター対象は常に最後の複合セレクターで表される要素の部分集合となります。

単純/複合/複雑セレクターのリストは、単純セレクター複合セレクター、 または複雑セレクターのカンマ区切りリストです。 この型が重要でない場合、あるいは本文で指定されている場合は単にセレクターリストとも呼びます。 型が重要だが未指定の場合、既定では複雑セレクターのリストを意味します。 (§ 4.1 セレクターリスト文法の各<*-selector-list>産出規則も参照。) ある要素がセレクターリスト一致するとは、そのリスト内のいずれか1つ以上のセレクターに一致する場合です。

疑似要素の扱いはここで未定義ですが、本来扱うべきです。

3.2. データモデル

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

各要素は、以下の5つの属性のいずれかを持つことができ、これらはすべて文字列として一致判定されます:

個々の要素が上記のいずれも持たない場合もあり、そのような要素は特徴なし(featureless)です。 特徴なし要素は、明示的に一致するよう定義されていない限り、どのセレクターにも一致しません。 特定のセレクターが特徴なし要素に一致する場合は、既定の名前空間は無視されなければなりません。[CSS3NAMESPACE]

例:シャドウホストシャドウツリー内)は特徴なしであり、 どの疑似クラスにも一致しません(ただし:host:host-context()などは除く)。

多くのセレクターは、文書言語(文書ツリーの言語や意味)や、ホスト言語(セレクター構文を使う言語)の意味に依存します。 例えば、:lang()セレクターは文書言語(例:HTML)が 要素と言語の関連づけ方法を定義します。 別の例として、::first-line疑似要素は、 ホスト言語(例:CSS)が ::first-line疑似要素の意味や機能を定義します。

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

一部のホストアプリケーションは、セレクターを文書の特定部分や断片にスコープすることを選択できます。 スコープの根となる部分はスコープルートと呼ばれます。

セレクターがスコープされる場合、 そのセレクターは対象要素がスコープルートの子孫である場合のみ一致します。 (セレクターの他の部分は制限なく一致可能です。最終的に一致した要素がスコープ内である必要があります。)

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

widget.querySelector("a")のような呼び出しは、 a 要素がwidget要素内にある場合のみ検出し、 文書全体の他の a要素は無視されます。

3.4. 相対セレクター

一部の文脈では相対セレクターを許容し、 これは1つ以上のアンカー要素に対して相対的な要素を表すセレクターの省略記法です。 相対セレクターは結合子から始まり、 セレクターの最初にアンカー要素を暗黙的に表します。 (結合子が省略された場合、子孫結合子が暗黙的に適用されます。)

相対セレクターは、セレクターの<relative-selector>で表現され、 そのリストは<relative-selector-list>で表現されます。

3.5. 疑似クラス

疑似クラスは、単純セレクターの一種であり、文書ツリーの外部情報や他の単純セレクターで表現するのが困難または不可能な条件で選択を可能にします。 また、動的に変化する場合もあり、 ユーザーが文書を操作することで要素が疑似クラスを獲得・喪失することもあります(文書自体は変更されません)。疑似クラスは、文書ソースや文書ツリーには現れず変更もしません。

疑似クラスの構文は「:」(U+003A コロン)+疑似クラス名(CSS識別子)です。 関数型疑似クラスの場合は、括弧内に引数を取ります。

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

全てのCSSキーワード同様、疑似クラス名はASCII大文字小文字を区別しません。 コロンと疑似クラス名の間、および関数型疑似クラス名と括弧の間には空白を入れてはいけません(CSS関数トークンを構成します)。 また、通常通り、関数型疑似クラスの括弧内の引数まわりには空白を入れても構いません(特に指定がない限り)。

単純セレクター同様、疑似クラスはセレクター中のすべての複合セレクターで利用でき、 型セレクターや全称セレクターの後に記述する必要があります(存在する場合)。

注: 一部の疑似クラスは互いに排他的であり(同じ複合セレクターに含めても、決して一致しません)、 他は同時に同じ要素に適用することも可能です。

3.6. 疑似要素

一部の疑似クラスが文書ツリーに存在しない追加状態情報を表すように、 疑似要素は、文書ツリーに直接存在しない要素を表します。 これは、文書ツリーが提供する以上の抽象化を作成するために使われます。 たとえば、疑似要素を使うことで、文書言語の要素に対応しない部分(要素境界に揃わない範囲やツリー構造外の範囲など)を選択したり、 文書ツリーに存在しない内容や別投影の内容を表現したり、 スタイリング・レイアウト・ユーザー操作など文書ツリーに反映されない情報に基づく範囲を扱うことができます。

例:文書言語には、要素コンテンツの最初の文字や最初の行にアクセスする仕組みはありませんが、 疑似要素::first-letter::first-line)によってそれらをスタイルできます。 特に::first-lineの場合、 疑似要素が表す内容範囲はレイアウト情報に依存するため、文書ツリーからは推測できません。

疑似要素は、ソース文書に存在しない内容も表現できます。 例として::before::after疑似要素は、 どの要素の内容の前後に追加コンテンツを挿入できます。

疑似クラスと同様、 疑似要素は文書ソースや文書ツリーに現れたり変更したりしません。 そのため、構造疑似クラスや発生元要素(originating element)やそのツリーに関する他のセレクターの解釈には影響しません。

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

3.6.1. 構文

疑似要素の構文は、「::」(U+003Aコロン2つ)+疑似要素名(識別子)です。疑似要素名はASCII大文字小文字を区別しません。 コロン2つの間、およびコロンと名前の間に空白は許容されません。

CSS Level 1およびCSS Level 2では疑似要素と疑似クラスが1コロン構文で混同されていたため、 ユーザーエージェントはLevel 1&2の疑似要素 (::before, ::after, ::first-line, ::first-letter) については以前の1コロン記法も受け入れる必要があります。 この互換記法は他の疑似要素には許可されません。 ただし、この構文は推奨されないため、 著者はこれらの疑似要素にはLevel 3以降の2コロン構文を使用してください。

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

3.6.2. 文書ツリーへの紐付け

疑似要素はツリー内で独立して存在するものではなく、 常にページ上の他の要素に紐付いています。 これが発生元要素です。 構文上は、疑似要素は、それに紐付く複合セレクターの直後に記述されます。 この複合セレクターが省略された場合は、全称セレクター *が暗黙的に用いられます。

例:セレクターdiv a::beforeでは、 セレクターで一致したa要素が発生元要素となり、 それに紐付く::before疑似要素にスタイルが適用されます。

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

セレクター内で疑似要素が現れる場合、 疑似要素の前の部分は疑似要素発生元要素を選択し、 疑似要素の後ろの部分(あれば)は疑似要素自体に適用されます。 (後述。)

3.6.3. 疑似要素の疑似クラス化

疑似要素の直後には、 ユーザー操作疑似クラスをいくつでも組み合わせて記述できます。 この場合、疑似要素は該当状態の時にのみ表現されます。 これらの疑似クラスが疑似要素に適用可能かは、 疑似クラス疑似要素の定義によります。 特に指定がない限り、これらの疑似クラス疑似要素には一致しません。

:not():is()が上記の疑似クラスを含む場合に使用できることを明確化してください。

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

::first-line:not(:focus)は何かに一致するか?

::first-line:hover:hover::first-lineは全く異なることに注意してください。 :hover::first-lineはホバーされた発生元要素の最初の行に一致します! 例えば、:hover::first-lineは段落の2行目がホバーされている時にも段落の最初の行に一致しますが、 ::first-line:hoverは最初の行自体がホバーされた時のみ一致します。

注: 今後の仕様で特に指定がない限り、 ユーザー操作疑似クラス以外を疑似要素に複合して使うことはできません。 例えば、::before:first-childは無効なセレクターです。

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では、レンダリングはボックスツリーの木構造性を維持するよう定義されなければなりません。

例:::slotted疑似要素は要素を自分の子として扱います。 以下の断片の場合:
<div>
  <span>foo</span>
  <"shadow root">
    <content></content>
  </"shadow root">
</div>

セレクターdiv > spandiv::shadow ::slotted > spanは異なる経路で同じ要素を選択します。

ただし、レンダリング時には <span>要素は <content>要素の子であるかのようにボックスを生成し、 <div>要素の子としてではなく、 ボックスツリーの木構造が維持されます。

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の前方互換パース原則に従い、 UAはサポートできない疑似クラス・疑似要素・結合子・その他構文要素を無効として扱う必要があります部分実装参照。

無効なセレクターは何も表現せず、何にも一致しません。

3.10. レガシーエイリアス

一部のセレクターにはレガシーセレクターエイリアスがあります。 これはパース時に標準名に変換される名称であり、セレクターを表現するオブジェクトモデルには現れません。

4. 論理結合

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()疑似クラスの特異性は、最も特異な引数の特異性で置き換えられます。 そのため、:is()を用いたセレクターは、:is()なしで書かれた等価セレクターと特異性が必ずしも同じとは限りません。 例::is(ul, ol, .list) > [hidden]ul > [hidden], ol > [hidden], .list > [hidden]の場合、ol[hidden]子要素は最初のセレクターでは特異性(0,2,0)で一致し、 後者では(0,1,1)となります。 § 17 セレクターの特異性計算参照。

疑似要素は任意一致疑似クラスでは表現できず、 :is()内では無効です。

デフォルト名前空間宣言は、複合セレクター対象)には影響しません。 ただし、その複合セレクターが明示的な全称セレクター型セレクターを含む場合を除きます。

例:次のセレクターは、ホバーまたはフォーカスされた任意の名前空間の要素に一致します。特に、デフォルト名前空間の要素だけに限定されません。
*|*:is(:hover, :focus) 

一方、次のセレクターは:is()記法で明示的な全称セレクターを使っているため、デフォルト名前空間内でホバーまたはフォーカスされた要素だけを表します:

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

本仕様の以前の草案では、この疑似クラスに:matches()という名称が使われていたため、 UAは必要に応じて、後方互換のためにレガシーセレクターエイリアスとして:is()に:matches()も実装してよいです。

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

:not()疑似クラスは、セレクターリストを引数とする関数型疑似クラスです。 引数で表されない要素に一致します。

注: セレクター レベル3では、単純セレクター1つだけが:not()の引数として許容されていました。

注: :not()疑似クラスの特異性は、引数内で最も特異なセレクターの特異性に置き換えられます。 したがって、:not(:is(argument))と同じふるまいとなります。 § 17 セレクターの特異性計算参照。

疑似要素は否定疑似クラスでは表現できず、 :not()内では無効です。

例:次のセレクターはHTML文書内のすべてのbutton要素のうち、disabledでないものに一致します。
button:not([DISABLED]) 

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

*:not(FOO)

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

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

:is()同様、 デフォルト名前空間宣言は、複合セレクター対象)には影響しません。 ただし、明示的な全称セレクター型セレクターを含む場合を除きます。 (例は:is()参照。)

注: :not()疑似クラスでは無用なセレクターも書けます。 例えば:not(*|*)は全く要素に一致しませんし、 div:not(span)divと同義ですが特異性が高くなります。

4.4. 特異性調整疑似クラス::where()

特異性調整疑似クラス:where()は、 :is()と同じ構文と機能を持つ関数型疑似クラスです。 :is()と異なり、 :where()疑似クラス自身も、その引数も、 セレクターの特異性に一切寄与しません—その特異性は常にゼロです。

これは、セレクターにフィルターを加えつつ、関連するスタイル宣言が簡単に上書きできるようにする際に有用です。

下記は特異性のヒューリスティックが著者の期待と合致しない典型例です:
a:not(:hover) {
  text-decoration: none;
}

nav a {
  /* 効果なし */
  text-decoration: underline;
}

しかし、:where()を使うことで著者の意図を明示できます:

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

nav a {
  /* 期待通り動作! */
  text-decoration: underline;
}

注: 今後のSelectors仕様では、この疑似クラスの特異性を明示的に設定する引数が追加される可能性があります。

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

関係疑似クラス:has()は、 <forgiving-relative-selector-list>を引数に取る関数型疑似クラスです。 相対セレクターをこの要素にアンカーとして評価したときに、少なくとも1つの要素に一致する場合、その要素を表します。

:has()疑似クラスは入れ子にできません。:has()の中で:has()は無効です。 また、:has-allowed 疑似要素として明示的に定義されていない限り、疑似要素:has()内のセレクターとして無効です。 (本仕様では:has-allowed 疑似要素は定義していませんが、他仕様で定義される可能性があります。)

注: 疑似要素は一般的に:has()から除外されています。 これは多くの疑似要素が祖先のスタイル次第で条件付きで存在するため、 :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つの複合セレクターにつき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|E(nsはデフォルト名前空間)と同等。
CSS例:
@namespace foo url(http://www.example.com);
foo|h1 { color: blue }  /* 最初の規則 */
foo|* { color: yellow } /* 2番目の規則 */
|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"名前空間の要素だけに一致します。

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

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]

例:

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

h1[title]

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

span[class="example"]

複数の属性セレクターは、要素の複数属性や同じ属性に対する条件を表現できます。以下はhello属性が"Cleveland"、goodbye属性が"Columbus"であるspan要素を表します:

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

以下のCSS規則は"="と"~="の違いを示します。1つ目のセレクターは、a要素でrel属性値が"copyright copyleft copyeditor"のようなものに一致します。2つ目は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の値が"romeo"または"juliet"のいずれかであるDIALOGUE要素を表します:

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

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

属性値の部分文字列一致のため、3つの追加属性セレクターが提供されています:

[att^=val]
属性attの値が"val"で始まる要素を表します。 "val"が空文字の場合、一致しません。
[att$=val]
属性attの値が"val"で終わる要素を表します。 "val"が空文字の場合、一致しません。
[att*=val]
属性attの値に"val"の部分文字列が含まれる要素を表します。 "val"が空文字の場合、一致しません。

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

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

次のセレクターは、href属性値が".html"で終わるa要素を表します:

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属性値がhsideshsides, HSIDES, hSides等)に一致する場合にスタイルします。
[frame=hsides i] { border-style: solid none; } 
次の規則では、HTMLがtype属性を大文字小文字区別しないと定義していても、 type="a"type="A"で別のスタイルを適用します。
[type="a" s] { list-style: lower-alpha; }
[type="A" s] { list-style: upper-alpha; }

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

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

属性セレクターの属性名はCSS修飾名として与えられます。事前に宣言された名前空間プレフィックスを属性名の前に「縦棒」(|)で区切って付加できます。XML名前空間勧告の原則に従い、デフォルト名前空間は属性には適用されません。したがって、名前空間部なしの属性セレクターは名前空間なし属性のみを対象とします(|attrと同等)。名前空間プレフィックスにアスタリスクを使うと、属性の名前空間に関係なく一致させることができます。

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

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

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

2つ目の規則は、属性attの名前空間に関係なく(一切ない場合も含む)、その属性を持つ要素に一致します。

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

6.5. DTD内のデフォルト属性値

属性セレクターは文書ツリー内の属性値を表します。文書ツリーの構築方法はSelectorsの対象外です。 一部文書形式ではDTDなどでデフォルト属性値が定義できますが、これらは文書ツリーに現れている場合のみ属性セレクターで選択できます。Selectorsは、デフォルト値が文書ツリーに含まれていてもいなくても動作するよう設計すべきです。

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

XML名前空間を認識するUAは、その名前空間の知識を使ってデフォルト属性値を文書に存在するものとして扱うこともできますが、必須ではありません(例:XHTML UAはXHTML DTDの組み込み知識を使う必要はありません)。 詳細は[XML-NAMES]参照。

注: 多くの実装は外部サブセットを無視します。これはXML仕様の非検証型プロセッサの動作と一致します。

例:

デフォルト値"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]''は型セレクターよりも特異性が高いため、2番目の規則のスタイル宣言がradix属性値が"octal"の要素に対して優先されます。デフォルトのみ適用したい宣言は、非デフォルトのスタイル規則で必ず上書きするよう注意が必要です。

6.6. クラスセレクター

クラスセレクターは、ドット(. U+002E)の直後に識別子を付けて記述します。これは、その識別子で定義されたクラスに属する要素を表します(文書言語で定義)。 例:[HTML5][SVG11][MATHML]では、 クラスへの所属はclass属性によります。これらの言語では、ローカルclass属性への~=記法 ([class~=identifier])と同等です。

CSS例:

すべての要素でclass~="pastoral"を持つものにスタイルを割り当てる:

*.pastoral { color: green }  /* class~=pastoral の全要素 */ 

または単に:

.pastoral { color: green }  /* class~=pastoral の全要素 */ 

H1要素でclass~="pastoral"のみスタイルする:

H1.pastoral { color: green }  /* H1でclass~=pastoral */ 

この規則により、以下の最初の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では"クラス"属性に大きな力があるため、著者がほぼスタイルだけで構成された独自の「文書言語」を設計することもできます(HTMLのdivspanなど)。しかし、文書言語の構造要素には認知・定義的な意味があるため、著者定義のクラスの多用は避けるべきです。

注: 要素に複数のclass属性がある場合、それらの値はスペースで連結して検索する前に扱われます。現状このような状況になる方法は知られていないため、この仕様では非規範扱いとします。

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

6.7. IDセレクター

文書言語はID型属性を宣言できる場合があります。 ID型属性の特別な点は、どの要素型であっても、同じ値のID型属性を持つ要素が1つだけという点です(適合文書の場合)。 文書言語が何であれ、ID型属性は要素を一意に識別できます。 HTMLではID属性は全てidです。 XMLではID属性名は異なる場合がありますが、同じ制約が適用されます。 どの属性が"ID属性"かは文書言語で定義されます。

IDセレクターは、「ナンバーサイン」(U+0023, #)の直後にID値(CSS識別子)を記述します。 IDセレクターは、ID型属性の値がセレクターの識別子と一致する要素インスタンスを表します。 (適合しない文書では複数要素が1つのIDセレクターに一致する場合もあります。)

例: 次のIDセレクターは、ID型属性値が"chapter1"であるh1要素を表します:
h1#chapter1 

次のIDセレクターは、ID型属性値が"chapter1"である任意の要素を表します:

#chapter1 

次のセレクターは、ID型属性値が"z98y"である任意の要素を表します:

*#z98y 

注: XML 1.0[XML10]では、どの属性がIDかはDTDやスキーマに記載されています。XMLパース時、UAは必ずしもDTDを読まないため、要素のIDがわからない場合があります(ただし、名前空間ごとにID属性を判定できる知識を持つUAもあり得ます)。スタイルシート著者がUAがID属性を判別できない可能性を考慮する場合、通常の属性セレクター(''[name=p371] の代わりに #p371'')を使うべきです。

要素が複数のID属性を持つ場合、それらすべてがIDセレクターの対象IDとみなされます(xml:id、DOM3 Core、XML DTD、名前空間固有知識の混在などで発生し得る)。

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

7. 言語疑似クラス

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

:dir() 疑似クラスは、文書言語によって決定される要素の方向性に基づいて要素を表現するセレクターを著者が記述できるようにします。 例えば、[HTML5]では、 要素の方向性の決定方法dir属性や周囲のテキスト、他の要因の組み合わせによって定義されています。 別の例としては、Internationalization Tag Setのits:dirdirRule要素が [ITS20][XML10]内の要素の方向性を定義できます。

:dir()疑似クラスは、 スタイル状態(例えばCSSのdirectionプロパティ)によって選択されるものではありません。

:dir(ltr) 疑似クラスは左から右(ltr)の方向性を持つ要素を表し、 :dir(rtl)は右から左(rtl)の方向性を持つ要素を表します。 :dir()の引数は1つの識別子でなければならず、 それ以外は無効です。識別子と括弧の間には空白を入れてもかまいません。 ltrrtl以外の値は無効ではありませんが、一致しません。 (将来のマークアップ仕様で他の方向性が定義された場合、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構文[BCP47]で表現され、 [RFC4647]Matching of Language Tags(3.3.2節)における 拡張フィルタリング操作で言語範囲に一致する場合に、 その言語範囲に一致します。 この目的のため、ワイルドカード言語範囲"*")は 言語タグが無い(例:lang="")要素には一致しませんが、 言語が未定(lang=und)とタグ付けされた要素には一致します。 一致判定はASCII大文字小文字を区別しません言語範囲が有効な言語コードでなくても比較できます。

言語範囲が空文字列 (:lang(""))の場合、 言語タグがない要素だけに一致します。

注: 文書やプロトコルでは[BCP47]以降のコードを用い、 XML系ではxml:lang属性で言語を示すことが推奨されます。[XML10] 詳細は“FAQ: Two-letter or three-letter language codes.”参照。

例: 次の2つのセレクターはベルギーのフランス語またはドイツ語のHTML文書を表します。 さらに2つはベルギーのフランス語またはドイツ語の任意要素内のq引用を表します。
html:lang(fr-be)
html:lang(de)
:lang(fr-be) > q
:lang(de) > q

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

このHTML例では、BODYは''[lang|=fr]''に一致します(LANG属性を持つため)が、 BODYとPの両方が:lang(fr)に一致します(両方ともフランス語)。 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-DE''とde-DE-1996だけに一致します。

主言語のサブタグでワイルドカード一致をするには、アスタリスクを使います:*-CHde-CHit-CHfr-CHrm-CHすべてに一致します。

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

注: ワイルドカード言語一致とカンマ区切りリストはLevel 4で新たに追加された機能です。

8. ロケーション疑似クラス

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

ユーザーエージェントは通常、未訪問ハイパーリンクと既訪問のものを異なる方法で表示します。Selectorsは :linkおよび:visited疑似クラスで区別します:

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

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

次のセレクターは、クラスfootnoteを持ち、既に訪問済みのリンクを表します:
.footnote:visited 

:linkと:visited疑似クラスを濫用して、ユーザーの同意なしに訪問したサイトを特定できてしまうため、 UAはすべてのリンクを未訪問として扱ったり、訪問・未訪問リンクの描画時にユーザーのプライバシーを保護する別の方法をとったりすることがあります。

:local-link疑似クラスは、著者がハイパーリンクをユーザーのサイト内現在位置に基づいてスタイルできるようにします。 この疑似クラスは、ハイパーリンクのターゲットの絶対URLが要素自身の文書URLと一致する場合のソースアンカー要素を表します。 ハイパーリンクのターゲットがフラグメントURLを含む場合は、現在のURLのフラグメントURLも一致しなければなりません。 一致しない場合、現在のURLのフラグメント部分は比較から除外されます。

例:次の規則は、ナビゲーションリスト内で現在のページを指すリンクの下線を消します:
nav :local-link { text-decoration: none; } 

注: ページの現在のURLは、ユーザーが同じページ内の異なるフラグメントへのリンクをクリックしたり、 pushStateAPIの利用、ページ遷移やリダイレクト(HTTPや<meta http-equiv="...">、 スクリプトなど)などの結果で変化します。 UAは:local-linkや、 以下の:targetおよび:target-within疑似クラスが こうした状態変化に正しく反応するようにしなければなりません。

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

一部の文書言語では、文書のURLがさらに文書内の特定要素をURLのフラグメントで指すことができます。 このように指された要素が文書のターゲット要素です。

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

:target 疑似クラスは文書のターゲット要素に一致します。 文書のURLにフラグメント識別子がない場合、ターゲット要素はありません。

例:
p.note:target 

このセレクターは、参照URLのターゲット要素となる p クラスnoteの要素を表します。

CSS例: ここでは:target疑似クラスで、 ターゲット要素を赤くし、画像を前に配置します(あれば):
:target { color : red }
:target::before { content : url(target.png) }

8.5. ターゲットコンテナ疑似クラス::target-within

:target-within疑似クラスは、 :target疑似クラスが適用される要素、 およびフラットツリー内の子孫(テキストノードのような非要素ノードも含む)が :targetの一致条件を満たす要素に適用されます。

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

文脈によっては、セレクターが一つ以上のスコープルートに対して マッチする場合があります。例えば、[DOM]querySelector()メソッドを呼び出す場合などです。 :scope擬似クラスは、 このスコープルートを表します。 このスコープルートは、実際の要素であっても仮想的なもの(例えばDocumentFragmentなど)であっても構いません。

スコープルートが存在しない場合、 :scopeは文書のルートを表します (:rootと同等)。 特定の要素にこの疑似クラスを一致させたい場合は、 該当仕様でスコープルートを定義する必要があります。

仮想的なスコープルートは、文書フラグメントのルートを表すオブジェクトであり、 セレクターパターン内で他の要素との関係を表すために使えます。 このスコープルートは、フラグメント内のルート要素の親として機能します。 仮想的なスコープルート特徴なしであり、セレクターの対象にはなりません。

例:DocumentFragment dfがある場合、 df.querySelectorAll(":scope > .foo") は、ドキュメントフラグメント内で「トップレベル」の.foo要素 (document fragmentをparentNodeとするもの)すべてに一致します。

一方、df.querySelector(":scope")は何にも一致しません。 なぜなら、ドキュメントフラグメント自身はセレクターの対象になれないからです。

9. ユーザー操作疑似クラス

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

これらの疑似クラスは互いに排他的ではありません。 1つの要素が複数のユーザー操作疑似クラスに同時に一致する場合もあります。

例:
a:link    /* 未訪問リンク */
a:visited /* 訪問済みリンク */
a:hover   /* ホバー中 */
a:active  /* アクティブリンク */

動的疑似クラスを組み合わせる例:

a:focus
a:focus:hover

最後のセレクターは、:focus疑似クラスと:hover疑似クラスの両方に一致するa要素に一致します。

注: このセクションで定義される複数の疑似クラスの適用条件を判定するために必要なヒットテストの詳細はまだ未定義ですが、将来定義されます。

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

:hover 疑似クラスは、ユーザーがポインティングデバイスで要素を指している間に適用されますが、必ずしもアクティブ化されている必要はありません。 例えば、ビジュアルユーザーエージェントは、要素が生成するボックスにカーソル(マウスポインタ)が乗っているときにこの疑似クラスを適用できます。 ハードウェア制限でホバーを検出できないインタラクティブユーザーエージェント(例:ホバー検出できないペンデバイス)でも適合となります。 その場合、このセレクターはUAでは一致しません。

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

文書言語によっては、:hoverが一致する追加条件を定義している場合があります。 例:[HTML5]では、ラベル付きコントロール要素はラベル要素がホバーされた場合に:hoverに一致します。

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

:hover疑似クラスは任意の疑似要素にも適用できます。

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

:active 疑似クラスは、ユーザーによって要素がアクティブ化されている間に適用されます。例えば、ユーザーがマウスボタンを押している間と離した瞬間の間です。複数のマウスボタンがあるシステムでは、:activeはプライマリボタン(通常は左ボタン)またはそのエイリアスにのみ適用されます。

どの要素が:activeになれるかは、文書言語や実装によって制限がある場合があります。 例:[HTML5]ではアクティブ化可能な要素のリストが定義されています。

要素の:active一致は、フラットツリー内の子孫(テキストノード等の非要素ノードも含む)が 上記条件を満たしていても成立します。

文書言語ごとに:activeが一致する追加条件を定義している場合があります。

注: 要素は:visited:active(または:link:active)の両方に一致することがあります。

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

:focus 疑似クラスは、要素がフォーカス(キーボードやマウスイベント、他の入力を受け付ける状態)を持っている間に適用されます。

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

文書言語によっては、:focusが一致する追加条件を定義している場合がありますが、 :focus疑似クラスが自動的に親要素へ伝播してはなりません(親要素への一致が必要な場合は:focus-withinを使用)。 (他の仕組みで伝播させる場合は親要素にも適用できますが、親要素であるだけでは伝播しません。)

フォームコントロールから関連ラベル要素へ:focusを伝播させたいという著者からの要望がありますが、主な反対理由は実装の困難さのようです。 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);
}
UAはフォーカス表示のタイミングを独自のヒューリスティックで決めてもよいですが、 以下の(非規範的な)提案を参考に、現在フォーカスされた要素へのフォーカス表示のタイミングを決定できます:

UAは:focus-visibleをデフォルトフォーカススタイル指定に使うべきです。 そうすれば、著者が:focus-visibleを使う場合にデフォルト:focusスタイルを無効化する必要がありません。

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

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

10. 時間次元疑似クラス

これらの疑似クラスは、現在表示中またはアクティブなタイムライン上の位置に基づいて要素を分類します。たとえば、文書の音声レンダリング中や、WebVTTによる字幕表示付き動画の再生中などです。

CSSはこのタイムラインを定義しません。 ホスト言語が定義する必要があります。 要素にタイムラインが定義されていない場合、これらの疑似クラスは要素に一致してはなりません。

注: :current要素の祖先も:currentとなりますが、 :past:future要素の祖先は必ずしも:past:futureとは限りません。 1つの要素は最大で:current:past:futureのいずれか1つだけに一致します。

10.1. 現在要素疑似クラス::current

:current 疑似クラスは、現在表示されている要素またはその祖先要素を表します。

その別形式:current()は、:is()のように、 複合セレクターのリストを引数に取ります。 引数に一致する:current要素、または一致しない場合はその最も内側の祖先が一致します(どちらも一致しなければ何にも一致しません)。

例:次の規則は、音声レンダリング中に読み上げられている段落やリスト項目をハイライトします:
:current(p, li, dt, dd) {
  background: yellow;
}

10.2. 過去要素疑似クラス::past

:past 疑似クラスは、:current要素より完全に前に現れる要素を表します。 たとえば、WebVTT仕様では:past疑似クラスを メディア要素の現在再生位置に関連して定義しています。 文書言語で時間ベースの順序が定義されていない場合、:current要素の(間接的な)前方兄弟要素すべてを表します。

10.3. 未来要素疑似クラス::future

:future 疑似クラスは、:current要素より完全に後に現れる要素を表します。 たとえば、WebVTT仕様では:future疑似クラスを メディア要素の現在再生位置に関連して定義しています。 文書言語で時間ベースの順序が定義されていない場合、:current要素の(間接的な)次方兄弟要素すべてを表します。

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

このセクションの疑似クラスは、主に画像や動画などロード済みリソースを表す要素に適用され、 状態の質に基づいて選択できるようにします。

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

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

:paused 疑似クラスは、「再生」または「一時停止」可能な要素が「一時停止中」(つまり「再生中」ではない)時に一致します。 (明示的な「一時停止」状態だけでなく、「ロード済みでまだ起動されていない」などの非再生状態も含みます。)

:seeking 疑似クラスは、「シーク」可能な要素が「シーク中」の時に一致します。 (HTMLのaudioおよび video要素については HTML § 4.8.11.9 シーク参照。)

11.2. メディア読み込み状態::buffering:stalled疑似クラス

:buffering疑似クラスは、「再生」または「一時停止」可能な要素が、 再生を継続できない理由としてメディアデータの取得を積極的に試みているが、 再生再開に必要なデータをまだ取得できていない場合に一致します。 (「バッファ中」でも「再生中」とみなされます。:bufferingが要素に一致する場合、:playingも一致します。)

:stalled 疑似クラスは、要素が再生を継続できない理由としてメディアデータの取得を積極的に試みているが、 一定時間データを全く取得できていない場合に一致します。 (HTMLのaudioおよび video要素は この時間をメディア要素の停止タイムアウトとします。[HTML] :bufferingと同様、:stalledが一致する場合も:playingが一致します。)

11.3. サウンド状態::muted:volume-locked 疑似クラス

:muted 疑似クラスは、サウンドを再生できる要素が「ミュート」(強制消音)されている場合に一致します。 (HTMLのaudioおよび video要素については、 muted参照。[HTML]

:volume-locked疑似クラスは、 サウンドを再生できる要素で、プログラム的にボリュームを変更しても 実効メディア音量が変化しない場合に一致します。

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

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

:open 疑似クラスは、「open」と「closed」両方の状態を持ち、現在「open」状態の要素を表します。

:closed 疑似クラスは、「open」と「closed」両方の状態を持ち、現在「closed」状態の要素を表します。

「open」と「closed」の意味はホスト言語依存ですが、例としてHTMLの detailsselectdialog 要素が挙げられます。どれも「open」にすると追加コンテンツが表示されます (dialogの場合は何も表示されないことも)。

注: 「open」や「closed」は意味的な状態です。 現在表示されていない要素 (たとえばvisibility: collapseが適用されている要素や display: noneサブツリーの要素) でも「open」状態であれば:openに一致します。

:modal 疑似クラスは、他の要素との操作を排除し、閉じるまで外部要素との操作ができない状態の要素を表します。 複数の要素が同時に:modalになりえますが、 そのうち1つだけがアクティブ(入力を受け付ける)です。

例:dialog 要素はshowModal() APIで開いた時に:modalになります。 同様に、:fullscreen要素もrequestFullscreen() APIで開いた場合は:modalになります。 これはページの他要素との操作を防ぐためです。

12.3. フルスクリーン表示状態::fullscreen 疑似クラス

:fullscreen疑似クラスは、 フルスクリーンAPIなどで、画面のほぼ全体(通常は全体)を使って表示されている要素を表します。[FULLSCREEN]

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

:picture-in-picture疑似クラスは、 画面の一部に限定されたビューポートで他のコンテンツの上に表示される状態(Picture-in-Picture API利用時など)の要素を表します。[picture-in-picture]

13. 入力疑似クラス

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

13.1. 入力コントロールの状態

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

:enabled 疑似クラスは、ユーザーインターフェース要素で有効状態のものを表します。 そのような要素は対応する無効状態も持っていなければなりません。

逆に、:disabled疑似クラスは、無効状態のUI要素を表します。 そのような要素は対応する有効状態も持っていなければなりません。

何が有効・無効状態か、UI要素かはホスト言語依存です。典型的な文書では多くの要素は:enabledでも:disabledでもありません。 例:[HTML5]では非disabledなインタラクティブ要素:enabled、 明示的にdisabledされたものが:disabledです。

注: ユーザーの操作可否に影響するCSSプロパティは:enabled:disabledへの一致に影響しません。例:displayvisibilityプロパティは、要素の有効/無効状態に影響しません。

13.1.2. 可変性疑似クラス::read-only および :read-write

要素がユーザーによって変更可能であれば、:read-writeに一致します(文書言語で定義)。 それ以外の場合は:read-onlyです。

例:[HTML5]では非disabledかつ非readonlyな<input>要素:read-writeですし、contenteditable属性がtrue状態の要素もそうです。

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

入力要素は、ユーザーが何を入力すればよいかのヒントとしてプレースホルダー文字列を表示することがあります。 例:[HTML5]placeholder属性。 :placeholder-shown疑似クラスは、 属性・実際の要素・UAによる暗黙のいずれによって表示されている場合でも、そのようなプレースホルダー文字列が表示されている入力要素に一致します。

例: [HTML]のセマンティクスによれば、 placeholder 属性を持つ input 要素や、 option 要素が select の最初の要素の場合など、プレースホルダー文字列を提供します。 :placeholder-shown疑似クラスは、そのような文字列が表示されているとき適用されます。

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

:autofill疑似クラスは、ユーザーエージェントによって自動入力されたが、ユーザーによって変更されていない入力要素を表します。

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

:default 疑似クラスは、同種の要素セットの中でデフォルトとなるUI要素(1つ以上)に適用されます。通常、コンテキストメニュー項目、ボタン、セレクトリスト/メニューなどに適用されます。

例:一連のボタンのうちデフォルト送信ボタン、ポップアップメニューのデフォルト選択肢など。 セレクト複数選択グループ(ピザのトッピングなど)では複数要素が:defaultに一致します。 例:[HTML5]では:defaultは、フォームの「デフォルトボタン」、 <select>の初期選択<option>(複数可)、その他いくつかの要素に一致します。

13.2. 入力値の状態

13.2.1. 選択オプション疑似クラス::checked

ラジオボタンやチェックボックス要素はユーザーにより切り替え可能です。 一部のメニュー項目は選択されると「チェック」状態になります。 そのような要素が「オン」になると:checked疑似クラスが適用されます。 例:[HTML5]ではチェックされたチェックボックス・ラジオボタン・選択された<option>要素:checkedに一致します。

:checked疑似クラスは動的でユーザー操作で変化しますが、 selectedchecked属性など文書上のセマンティック属性にも基づくため、 すべてのメディアに適用されます。

未チェックのチェックボックスは否定疑似クラスで選択できます:
input[type=checkbox]:not(:checked)

13.2.2. 不定値疑似クラス::indeterminate

:indeterminate疑似クラスは、値が不定状態のUI要素に適用されます。 例:ラジオボタンやチェックボックスはチェック・未チェック以外に不定状態になることがあり、進捗メーターも進捗率不明の場合に不定状態になります。 例:[HTML5]ではチェックボックス:indeterminateに一致する方法が定義されています。

:checkedと同様、:indeterminateはすべてのメディアに適用されます。 初期選択肢なしで初期化されたラジオグループの構成要素などは、静的表示でも:indeterminateとなります。

13.3. 入力値の検証

13.3.1. 空値疑似クラス::blank

:blank 疑似クラスは、ユーザー入力要素の入力値が空(空文字列またはnull入力)である場合に適用されます。

:blankユーザー入力要素の例は、 textarea 要素の内容が空の場合や、 input フィールドの値が空の場合です。 ここで検証される値は送信時に使われる値 (フォームコントロールの値参照)であり、 HTMLでは要素の value 属性の値と必ずしも一致しません。

注: このセレクターはリスクがあります。

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

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

注: 制約がない要素は常に:validとなりますが、 データ妥当性セマンティクスが全くない要素は:valid:invalidの いずれにも一致しません。 例:HTMLでは、<input type="text">要素は制約がなければ常に:validですが、 p要素は妥当性セマンティクスがないため、どちらにも一致しません。

13.3.3. 範囲疑似クラス::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」なら:out-of-rangeとなります。

13.3.4. 任意性疑似クラス::required および :optional

フォーム要素は、値が必須か任意かによって:requiredまたは:optionalとなります(フォームの有効な送信に必要かどうか)。 フォーム要素でないものはどちらにもなりません。

13.3.5. ユーザー操作疑似クラス::user-valid および :user-invalid

:user-invalidおよび:user-valid疑似クラスは、それぞれユーザーが正しくない/正しい入力をした要素を表します。ただしユーザーが十分に操作した後のみです。

:user-invalid疑似クラスは、:invalid:out-of-range、または blankかつ:required要素で、ユーザーがフォーム送信を試みた後、再度フォーム要素へ操作するまで一致します。

:user-valid疑似クラスは、ユーザーがフォーム送信を試みた後、再度フォーム要素へ操作するまで:valid要素に一致します。

UAは、ユーザーへのエラー強調など適切な場面で、他のタイミングでもこれら疑似クラスが一致することを許容してもよいです。 例:UAは、ユーザーが入力を変更して他要素にフォーカスした時点で:user-invalid:invalid要素に一致させ、 入力が正しく修正された時点で一致しなくすることもできます。

例:以下の文書断片の入力は、ページロード時点で:invalidに一致します (初期値が最大値制約を違反しているため)、 ただしユーザーが十分に操作した後やフォーム送信を試みるまで:user-invalidには一致しません。
<form>
  <label>
    Volume:
    <input name='vol' type=number min=0 max=10 value=11>
  </label>
  ...
</form>

:-moz-ui-invalidとクロスチェックすること。

:dirty疑似クラスを評価すること

本疑似クラス(および:invalid/:valid)がformやfieldset要素に適用可能であることを明確化すること。

14. ツリー構造擬似クラス

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

親要素の子リスト内で要素の位置を計算する際、独立したテキストや他の非要素ノードは考慮されません。 親の子リスト内で要素の位置を計算する際、インデックス番号は1から始まります。

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

14.1. :root 擬似クラス

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

例えば、DOM文書の場合、 :root 擬似クラスは Document オブジェクトの ルート要素にマッチします。 HTMLでは、これはhtml要素となります (スクリプトで文書が変更されていない限り)。

14.2. :empty 擬似クラス

:empty 擬似クラスは、 要素が子要素を持たず、 オプションで文書の空白文字だけを含む場合を表します。 文書ツリーの観点では、 要素ノードやコンテンツノード ([DOM] のテキストノードやエンティティ参照など) のデータが非ゼロ長の場合のみ、空でないと見なされます。 コメントや処理命令、その他のノードは 要素が空かどうかの判定に影響しません。

例: p:empty は、 次のHTML断片における p 要素を正しく表します:
<p></p>
<p>
<p> </p>
<p></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>

注: セレクターのレベル2およびレベル3では、:empty は 空白のみの要素にはマッチしませんでした。 この仕様では変更されました。—HTMLでは空白がほぼ折り畳まれるため ソースコード整形に使用されることが多く、 特に終了タグが省略される要素では DOMのテキスト内容にそのような空白が吸収されがちです—著者が空と認識する要素を このセレクターで選択できるようになっています。

14.3. 子インデックス擬似クラス

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

注: Selectors 3では、これらのセレクターは親の子リスト内のインデックスに基づいて選択すると記載されていました。 (この説明はセクション名やいくつかの擬似クラス名に残っています。) 親を持たない要素や非要素の親でもマッチ対象から除外する理由がないため、 現在は兄弟間の相対的なインデックスに基づくものとして表現されています。

14.3.1. :nth-child() 擬似クラス

:nth-child(An+B [of S]? ) 擬似クラス記法は、 An+B 番目の要素である要素を表します。 これは、包括的兄弟のうち、 セレクターリスト S にマッチする要素のリストから選択されます。 S<complex-selector-list> であり、 許容的セレクターリストとしてパースされます。 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)は、単一擬似クラスの詳細度に加え、 S が指定されている場合は S 内で最も詳細度の高い 複合セレクター の詳細度が加算されます。 詳しくは§ 17 セレクターの詳細度の計算を参照してください。 したがって 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つの子の場合のみ選択します。

セレクター引数の例をさらに示します。 テーブルの縞模様(ゼブラストライプ)を正しく適用するためのものです。

通常、テーブルの行に縞模様をつけるには次のようなCSSを使います:

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

しかし、行の一部が非表示(displayされない)だと、 パターンが崩れてしまい、同じ背景色の行が隣接することがあります。 HTMLで [hidden] 属性を使って行を非表示にすると仮定すると、 次のCSSは隠された行の有無にかかわらず正しく縞模様を維持します:

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

14.3.2. :nth-last-child() 擬似クラス

:nth-last-child(An+B [of S]? ) 擬似クラス記法は、 An+B 番目の要素(リストの末尾から逆順で)を表します。 これは、包括的兄弟のうち、 セレクターリスト S にマッチする要素のリストから選ばれます。 S<complex-selector-list> であり、 許容的セレクターリストとしてパースされます。 S を省略した場合、デフォルトは *|* です。

注: :nth-last-child() 擬似クラスの 詳細度も :nth-child() 擬似クラスと同様に、 通常の擬似クラスの詳細度とセレクター引数 S の詳細度を組み合わせます。 詳しくは§ 17 セレクターの詳細度の計算を参照してください。

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

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

foo:nth-last-child(odd)    /* 親要素内で末尾からカウントした奇数番目のfoo要素全て */

14.3.3. :first-child 擬似クラス

:first-child 擬似クラスは、 包括的兄弟の中で最初の要素である場合にマッチします。 :nth-child(1) と同じです。

例: 次のセレクターは p 要素が div 要素の最初の子である場合にマッチします:
div > p:first-child

このセレクターは以下の断片の div 内の p にマッチします:

<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がルート要素でない場合) */

14.3.4. :last-child 擬似クラス

:last-child 擬似クラスは、 包括的兄弟の中で最後の要素である場合にマッチします。 :nth-last-child(1) と同じです。

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

14.3.5. :only-child 擬似クラス

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

14.4. 型付き子インデックス擬似クラス

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

14.4.1. :nth-of-type() 擬似クラス

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

CSS例: 画像の左右の配置を交互にする場合:
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) と同等です。

14.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 bodyh2 のうち、最初と最後以外の要素を表すセレクター:
body > h2:nth-of-type(n+2):nth-last-of-type(n+2) 

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

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

14.4.3. :first-of-type 擬似クラス

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

例: 次のセレクターは定義リスト dl 内の定義タイトル dt で、 親要素の子リストの中で最初の 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>

14.4.4. :last-of-type 擬似クラス

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

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

14.4.5. :only-of-type 擬似クラス

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

15. コンビネータ

15.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

これは、p 要素が div 要素の孫以降の子孫である場合に該当します。「*」の両側の空白はユニバーサルセレクターの一部ではなく、 空白はコンビネータであり、div が何らかの要素の祖先であり、その要素が p の祖先であることを示します。 また、次のセレクターは子孫コンビネータと属性セレクターを組み合わせており、(1) href 属性が設定された要素で、(2) div 内の p の内側にあるものを表します:

div p *[href]

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

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

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

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

div ol>li p

これは、p 要素が li 要素の子孫であり、li 要素が ol 要素の子であり、ol 要素が div の子孫であることを表します。「>」コンビネータの周囲の空白は省略されています。

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

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

隣接兄弟コンビネータは、 「プラス」記号(U+002B、+)で構成され、 2つの複合セレクターを区切ります。 2つの複合セレクターで表される要素は文書ツリー内で同じ親を持ち、 最初の複合セレクターで表される要素が、 2番目の要素の直前に位置します。 要素の隣接を判断する際、非要素ノード(例:要素間のテキスト)は無視されます。

例: 次のセレクターは p 要素が math 要素の直後にある場合を表します:
math + p

次のセレクターは、前の例と似ていますが、属性セレクターを追加しています。h1 要素に class="opener" がある場合のみ次の h2 要素にマッチします:

h1.opener + h2

15.4. 一般兄弟コンビネータ (~)

一般兄弟コンビネータは、「チルダ」 (U+007E、~)で構成され、 2つの複合セレクターを区切ります。 2つの複合セレクターで表される要素は文書ツリー内で同じ親を持ち、 最初の複合セレクターで表される要素が(必ずしも直後ではなく)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>

16. グリッド構造セレクター

2次元グリッドにおけるセルの二重関連(行と列への関連)は、階層型マークアップ言語の親子関係だけでは表現できません。 これらのうち一方の関連のみが階層的に表現可能であり、もう一方は文書言語のセマンティクスによって明示的または暗黙的に定義する必要があります。 HTMLやDocBookなど、代表的な階層型マークアップ言語では、マークアップは行優先(行の関連が階層的に表現される)であり、列は暗黙的に推測されます。 このような暗黙的な列ベースの関係を表現できるよう、列コンビネータおよび:nth-col():nth-last-col()擬似クラスが定義されています。 列優先フォーマットでは、これらの擬似クラスは行関連に対してマッチします。

16.1. 列コンビネータ (||)

列コンビネータは、 パイプ2つ(||)で構成され、 列要素と、その列に属するセル要素との関係を表します。 列の所属は文書言語のセマンティクスのみに基づいて判断されます: 要素がどのように表示されるかは考慮されません。 セル要素が複数の列に属する場合、 それらのいずれかの列への所属を示すセレクターで表されます。

次の例では、セルC, E, Gを灰色にします。
col.selected || td {
  background: gray;
  color: white;
  font-weight: bold;
}
<table>
  <col span="2">
  <col class="selected">
  <tr><td>A <td>B <td>C
  <tr><td colspan="2">D <td>E
  <tr><td>F <td colspan="2">G
</table>

16.2. :nth-col() 擬似クラス

:nth-col(An+B) 擬似クラス記法は、An+B-1 列がにある列に属するセル要素を表します(nは0以上の整数)。 列の所属は文書言語のセマンティクスのみに基づいて判断されます:要素の表示方法は考慮されません。 セル要素が複数の列に属する場合、それらのいずれかの列への所属を示すセレクターで表されます。

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

16.3. :nth-last-col() 擬似クラス

:nth-last-col(An+B) 擬似クラス記法は、An+B-1 列が後ろにある列に属するセル要素を表します(nは0以上の整数)。 列の所属は文書言語のセマンティクスのみに基づいて判断されます:要素の表示方法は考慮されません。 セル要素が複数の列に属する場合、それらのいずれかの列への所属を示すセレクターで表されます。

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

17. セレクターの詳細度(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]

18. 文法(Grammar)

セレクターは以下の文法に従ってパースされます:

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

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

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

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

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


<complex-selector> = <compound-selector> [ <combinator>? <compound-selector> ]*

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

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

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


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

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

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

<wq-name> = <ns-prefix>? <ident-token>

<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>

上記の文法を解釈する際、下記のルールが適用されます:

注: セレクターにはさらに特定の構文制約があり、 上記の文法を満たすだけでは有効なセレクターとは限りません。 詳しくは§ 3.9 無効なセレクターとエラー処理を参照してください。

注: 一般的に <pseudo-element-selector><complex-selector>の 最後の<compound-selector>の末尾にのみ有効です。 ただし状況によっては、さらに <pseudo-element-selector><pseudo-class-selector>が続くこともあります。 (例えばユーザーアクション擬似クラスは任意の疑似要素の後ろに置けますし、 ツリー順守型疑似要素::slotted()疑似要素の後ろに置けます。)

18.1. <forgiving-selector-list> および <forgiving-relative-selector-list>

後方互換の理由により、 セレクターリストの一般的な動作は リスト内のいずれかのセレクターのパースに失敗した場合 (新しいセレクターやUA固有のセレクター機能などを使った場合) セレクターリスト全体が無効となります。 そのため、新しいセレクターを使いつつ古いユーザーエージェントでも正しく動作するCSSを書くのが困難になる場合があります。

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

注: スタイル規則は通常、通常通りの(厳格な)セレクターリスト動作を使います。<forgiving-selector-list>は一部の関数(:is()など)で使われます。 詳細度への影響はわずかですが、 スタイル規則のセレクターを :is() で包むことで事実上「許容型」にアップグレードされます。

構文的には、<forgiving-selector-list><any-value>?と同等です。 その後、許容型セレクターリストとしてパースして実際の値を取得します。

許容型セレクターリストとしてパースする手順(input に対して):
  1. リストをパースして <complex-selector>のリストを得て、 selector list とする。

  2. selector listから、パースに失敗した項目と 無効なセレクターをすべて除去し、 残った項目でselector listを構成。そのselector listを表す <selector-list>を返す(空の場合もあり得る)。

<forgiving-relative-selector-list><forgiving-selector-list>と同じですが、 構成要素を<relative-selector>として パースする点のみ異なります(<complex-selector>としてではなく)。

19. APIフック

Selectorsの概念を利用する仕様の記述を支援するため、 このセクションでは他の仕様から呼び出せるいくつかのAPIフックを定義します。

matchinvalid selectorの定義が厳密になった今、これらはまだ必要でしょうか? 名詞の調整は述語よりもはるかに容易であり、 querySelectorから返される要素の順序のような詳細はDOM仕様で定義する方がSelectorsより適切だと思われます。

19.1. セレクターをパースする

このセクションでは、文字列 source からセレクターをパースする方法を定義します。 複合セレクターリストまたは失敗(failure)を返します。

  1. selectorパースして <selector-list> とする。 失敗した場合は、 invalid selectorとみなし、 failureを返す。
  2. selectorが他の理由(例えば未宣言の名前空間プレフィックスを含むなど)でinvalid selectorの場合も、 failureを返す。
  3. それ以外の場合は、selectorを返す。

19.2. 相対セレクターをパースする

このセクションでは、文字列 source から相対セレクターをパースする方法を定義します。 複合セレクターリストまたは失敗(failure)を返します。

  1. selectorパースして <relative-selector-list> とする。 失敗した場合は、 invalid selectorとみなし、 failureを返す。
  2. selectorが他の理由(例えば未宣言の名前空間プレフィックスを含むなど)でinvalid selectorの場合も、 failureを返す。
  3. それ以外の場合は、selectorを返す。

19.3. セレクターを要素にマッチさせる

このセクションではセレクターを要素にマッチさせる方法を定義します。

このアルゴリズムを利用するAPIはselectorelementを指定する必要があります。

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

このアルゴリズムは成功または失敗を返します。

与えられたselector複合セレクターのリストとみなす)内の各複合セレクターについて、 以下の段落で説明する方法でelementに対してマッチを試みます。 いずれかの複合セレクターで成功した場合は成功を返し、すべて失敗した場合は失敗を返します。

複合セレクターを要素にマッチさせるには、 複合セレクターごとに右から左の順で処理します。 この処理は再帰的に以下の通り定義されます:

19.4. セレクターを疑似要素にマッチさせる

このセクションではセレクターを疑似要素にマッチさせる方法を定義します。

このアルゴリズムを利用するAPIはselectorpseudo-elementを指定する必要があります。 オプション引数はセレクターを要素にマッチさせるアルゴリズムと同じく指定可能です。

このアルゴリズムは成功または失敗を返します。

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

成功を返す。

それ以外の場合(つまりselector内の複合セレクターで上記が成立しない場合)は失敗を返す。

19.5. セレクターをツリーにマッチさせる

このセクションではセレクターをツリーにマッチさせる方法を定義します。

このアルゴリズムを利用するAPIはセレクターと、 一つ以上のroot elements(セレクターで検索するサブツリーを示す)を指定する必要があります。 すべてのroot elementsは同じルートを持つ必要があります。 そうでなければ本アルゴリズムの呼び出しは無効です。

オプションで以下を指定可能です:

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

  1. candidate elementsのリストを開始する。 これはroot elementsとそのすべての子孫要素で、 シャドウツリー順序でソートされる(特に指定がない限り)。
  2. スコープルートが指定された場合、 candidate elementsからいずれのスコープルート子孫でない要素を除外する。
  3. selector match listを空で初期化する。
  4. candidate elementsの各elementについて:
    1. セレクターを要素にマッチさせる結果が成功なら、 elementselector match listに追加する。
    2. elementに関連付けられ、マッチリストに含めることが許可されたすべての疑似要素について、 セレクターを疑似要素にマッチさせる結果が成功なら その疑似要素をselector match listに追加する。

      selector match list内の疑似要素の相対位置は未定義です。 この情報を公開する文脈はまだありませんが、将来的に公開前に何か決める必要があります。

付録A: ソース文書やデータを要素ツリーにマッピングする指針

このセクションは参考情報です。

DOMで記述される要素ツリー構造は強力かつ有用ですが、 ツリー型データ(あるいは適切な解釈をすればグラフ型データ)を記述するあらゆる言語をモデリングできるほど汎用的です。

HTMLのような一部言語は、 リソースからDOMオブジェクトを生成する手順がすでに定義されています。 特定の言語にそうした手順がない場合は、 Selectorsをその言語の文書に適用するために 手順を定義する必要があります。

最低限、 文書言語はDOMの「要素」概念に対応するものが何かを定義しなければなりません。

ノード間の主な一対多関係——ツリー構造では親子、グラフ構造では要素と近傍——は 要素の子ノードとして反映されるべきです。

要素の他の特徴も DOMの同種機能に似たものにマッピングされるべきです:

type
文書言語の要素が「型」という概念を持つ場合、 異なるグループ区別の基本となる「型」は "type" 機能として反映するべきです。

この「型」が「基本名」と「名前空間」に分離可能なら 後者は"namespace"機能として反映し、 そうでなければ"namespace"機能は持たず、名前全体を"type"機能として反映します。

id
要素のある側面が文書内でユニークな識別子として機能する場合、 "id"機能にマッピングします。

注: HTMLでは要素は1つのIDしか持てませんが、 これは一般的な制限とみなすべきではありません。 IDの重要な性質は、各IDが1つの要素に対応することです。 1つの要素が複数のIDを持つことは有効です。

classes and attributes
要素の側面で、その要素の識別に有用だが文書内で一般的に一意ではないものは "class"または"attribute"機能にマッピングすべきです。 「ラベル」(単独の文字列)に相当するなら"class"、 「プロパティ」(名前/値のペア)に相当するなら"attribute"です。
pseudo-classes and pseudo-elements
要素がいずれかの擬似クラスにマッチしたり、疑似要素を持つ場合は それを明示的に定義する必要があります。

一部の擬似クラスは*構文的*で :has():is()などは常に動作すべきです。 どこかでこれを示す必要があります。 構造擬似クラスは子リストが順序付けられている場合常に動作するはずです。

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

この構造により、セレクターによるJSON文書の強力かつコンパクトなクエリが可能になります。

付録B: Web互換のために必要だが廃止された-webkit-パースのクセ

この付録は規範的です。

Web互換のレガシー制約により、 Web文書のパースを想定するユーザーエージェントは以下の機能をサポートしなければなりません:

20. 変更点

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

2022年5月7日作業草案以降の主な変更点:

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

2018年11月21日作業草案以降の主な変更点:

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

2018年2月2日作業草案以降の主な変更点:

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

2013年5月2日作業草案以降の主な変更点:

注: 2018年2月1日草案には未完成作業の誤コミットが含まれていたが、 2月2日版でこれを元に戻し(ついでにリンクも修正)。

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

2012年8月23日作業草案以降の主な変更点:

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

2011年9月29日作業草案以降の主な変更点:

20.7. Level 3以降の追加点

Level 3以降の追加点:

21. 謝辞

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 に特別な謝意を表します。

22. プライバシーとセキュリティの考慮事項

この仕様は以下のプライバシーおよびセキュリティ上の考慮事項を導入します:

適合性

文書の慣例

適合性要件は記述的な断言とRFC 2119の用語を組み合わせて表現されます。主要な語句「MUST」, 「MUST NOT」, 「REQUIRED」, 「SHALL」, 「SHALL NOT」, 「SHOULD」, 「SHOULD NOT」, 「RECOMMENDED」, 「MAY」, 「OPTIONAL」は、 この文書の規範部分ではRFC 2119に記載の通り解釈されます。 ただし、可読性のため、この仕様ではこれらの語句はすべて大文字で表記されていません。

この仕様の全ての文は、明示的に非規範的と記載されたセクション・例・注釈を除き、規範的です。[RFC2119]

この仕様の例は「例えば」という語で始まるか、class="example"のように規範テキストから区別されます:

これは参考例の一例です。

参考注釈は「注:」で始まり、class="note"で規範テキストから区別されます:

注: これは参考注釈です。

助言は規範的なセクションで特別な注意を促すようにスタイルされており、 他の規範テキストと区別して<strong class="advisement">で表示されます: UAはアクセシブルな代替手段を必ず提供しなければなりません。

適合性クラス

この仕様への適合性は、3つの適合性クラスで定義されます:

スタイルシート
CSS スタイルシート
レンダラー
UA(ユーザーエージェント)。スタイルシートの意味を解釈し、 それを使う文書をレンダリングします。
オーサリングツール
UA。スタイルシートを作成するツール。

スタイルシートがこの仕様に適合するためには、 本モジュールで定義されている構文を使った全ての文が、汎用CSS文法および各機能ごとの個別文法に従って有効である必要があります。

レンダラーがこの仕様に適合するためには、 スタイルシートを関連仕様に従って解釈することに加え、 この仕様で定義された全機能に対応し、それらを正しくパースし 文書を適切にレンダリングする必要があります。ただし、デバイスの制約によってUAが文書を正しくレンダリングできない場合でも、 UAが非適合となるわけではありません(例: UAはモノクロモニター上で色を表示する必要はありません)。

オーサリングツールがこの仕様に適合するためには、 汎用CSS文法および本モジュールの各機能の個別文法に従って構文的に正しいスタイルシートを書き、 本モジュールで定義されたスタイルシートの全ての適合要件を満たす必要があります。

部分的な実装

著者が前方互換のパース規則を活用してフォールバック値を指定できるようにするため、 CSSレンダラーは必ず適切に無視)、 利用可能なレベルのサポートがない@規則、プロパティ、プロパティ値、キーワード、 その他の構文要素を無効として扱わなければなりません。特に、ユーザーエージェントは 決してサポートされていない値を個別に無視して、 サポートされている値だけを1つの複数値プロパティ宣言内で適用してはなりません: いずれかの値が無効(未サポート値は必ず無効)と判定された場合、 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 メーリングリストへ。

索引

本仕様で定義されている用語

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

参考文献

規範的参考文献

[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3。2021年9月3日。CR。URL: https://www.w3.org/TR/css-display-3/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4。2020年12月31日。WD。URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-SCOPING-1]
Tab Atkins Jr.; Elika Etemad. CSS Scoping Module Level 1。2014年4月3日。WD。URL: https://www.w3.org/TR/css-scoping-1/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3。2022年5月5日。CR。URL: https://www.w3.org/TR/css-text-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4。2021年12月16日。WD。URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3。2019年12月10日。REC。URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS21]
Bert Bos; 他. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification。2011年6月7日。REC。URL: https://www.w3.org/TR/CSS21/
[CSS3NAMESPACE]
Elika Etemad. CSS Namespaces Module Level 3。2014年3月20日。REC。URL: https://www.w3.org/TR/css-namespaces-3/
[CSS3SYN]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3。2021年12月24日。CR。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; 他. 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/
[MEDIACAPTURE-STREAMS]
Cullen Jennings; 他. Media Capture and Streams。2022年9月22日。CR。URL: https://www.w3.org/TR/mediacapture-streams/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels。1997年3月。Best Current Practice。URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECT]
Tantek Çelik; 他. Selectors Level 3。2018年11月6日。REC。URL: https://www.w3.org/TR/selectors-3/
[URL]
Anne van Kesteren. URL Standard。Living Standard。URL: https://url.spec.whatwg.org/

参考情報

[BCP47]
A. Phillips, Ed.; M. Davis, Ed.. Tags for Identifying Languages。2009年9月。Best Current Practice。URL: https://www.rfc-editor.org/rfc/rfc5646
[CSS-COLOR-5]
Chris Lilley; 他. CSS Color Module Level 5。2022年6月28日。WD。URL: https://www.w3.org/TR/css-color-5/
[CSS3UI]
Tantek Çelik; Florian Rivoal. CSS Basic User Interface Module Level 3 (CSS3 UI)。2018年6月21日。REC。URL: https://www.w3.org/TR/css-ui-3/
[CSSSTYLEATTR]
Tantek Çelik; Elika Etemad. CSS Style Attributes。2013年11月7日。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; 他. HTML5。2018年3月27日。REC。URL: https://www.w3.org/TR/html5/
[ITS20]
David Filip; 他. Internationalization Tag Set (ITS) Version 2.0。2013年10月29日。REC。URL: https://www.w3.org/TR/its20/
[MATHML]
Patrick D F Ion; Robert R Miner. Mathematical Markup Language (MathML) 1.01 Specification。1999年7月7日。REC。URL: https://www.w3.org/TR/REC-MathML/
[PICTURE-IN-PICTURE]
Francois Beaufort. Picture-in-Picture。2022年7月25日。WD。URL: https://www.w3.org/TR/picture-in-picture/
[QUIRKS]
Simon Pieters. Quirks Mode Standard。Living Standard。URL: https://quirks.spec.whatwg.org/
[RFC4647]
A. Phillips, Ed.; M. Davis, Ed.. Matching of Language Tags。2006年9月。Best Current Practice。URL: https://www.rfc-editor.org/rfc/rfc4647
[SVG11]
Erik Dahlström; 他. Scalable Vector Graphics (SVG) 1.1 (Second Edition)。2011年8月16日。REC。URL: https://www.w3.org/TR/SVG11/
[XFORMS11]
John Boyer. XForms 1.1。2009年10月20日。REC。URL: https://www.w3.org/TR/xforms11/
[XML-NAMES]
Tim Bray; 他. Namespaces in XML 1.0 (Third Edition)。2009年12月8日。REC。URL: https://www.w3.org/TR/xml-names/
[XML10]
Tim Bray; 他. Extensible Markup Language (XML) 1.0 (Fifth Edition)。2008年11月26日。REC。URL: https://www.w3.org/TR/xml/

課題索引

疑似要素はここで扱われていませんが、扱うべきです。
:not():is()が前述の疑似要素を含む場合にも使えることを明確化する必要があります。
::first-line:not(:focus)は何かにマッチしますか?
複数値マッチングのためのカンマ区切り構文を追加しますか?例: [rel ~= next, prev, up, first, last]
著者からフォームコントロールの :focus を関連付けられた label 要素へ伝播させたいという要望があります。 主な反対理由は実装の困難さと思われます。 詳細は CSSWG課題(CSS) および WHATWG課題(HTML) を参照してください。
:-moz-ui-invalidとのクロスチェック。
:dirty 擬似クラス案の評価
これ(および:invalid/:valid)がformやfieldset要素に適用できることを明確化する必要あり。
matchinvalid selectorの定義が厳密になった今、これらはまだ必要でしょうか?名詞の調整は述語より容易であり、querySelectorで返される要素の順序などの詳細はSelectorsよりDOM仕様で定義した方が適切と思われます。
実際にこうした扱いを受けるのはツリー順守型疑似要素だけです。
selector match list内の疑似要素の相対位置は未定義です。現時点ではこの情報を公開するコンテキストはありませんが、将来的に公開前に何か決める必要があります。
一部擬似クラスは*構文的*であり、:has():is()などは常に動作すべきです。どこかでこれを明示する必要がある。構造擬似クラスは子リストが順序付けられていれば常に動作するはずです。
意味定義は本仕様に戻すべきかもしれません。
XML用ツリー定義が必要。