CSS 構文モジュール レベル 3

W3C 候補勧告草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/CRD-css-syntax-3-20261001/
最新の公開バージョン:
https://www.w3.org/TR/css-syntax-3/
編集者草案:
https://drafts.csswg.org/css-syntax/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/css-syntax-3/
実装レポート:
https://wpt.fyi/results/css/css-syntax?label=experimental&label=master&aligned
フィードバック:
CSSWG Issue リポジトリ
編集者:
Tab Atkins Jr. (Google)
Simon Sapin (Mozilla)
この仕様の編集を提案:
GitHub エディター
テストスイート:
https://wpt.fyi/results/css/css-syntax/

概要

このモジュールは、一般的な観点から、CSS スタイルシートの基本的な構造と構文について説明する。また、 CSS の構文と構文解析、すなわちバイトストリームを意味のあるスタイルシートに変換する方法を詳細に定義する。

CSS は、構造化文書のレンダリングを記述するための言語である (HTML や XML など) 画面上、紙上などにおける。

この文書のステータス

この節では、この文書の公開時点でのステータスについて説明する。 現在の W3C 公開文書の一覧 およびこの技術報告書の最新改訂版 は、W3C 標準および草案の索引。で確認できる。

この文書は、 CSS ワーキンググループによって 勧告 トラックを使用した候補勧告草案として公開された。 候補勧告としての公開は、 W3C およびそのメンバーによる承認を意味するものではない。 候補勧告草案は、 以前の候補勧告からの変更を統合するものであり、 ワーキンググループはそれらを後続の候補勧告スナップショットに含めることを意図している。

これは草案文書であり、 いつでも更新、置換、 または他の文書によって廃止される可能性がある。 この文書を進行中の作業以外のものとして引用することは適切ではない。

フィードバックは、 GitHub で issue を提出することによって送信してほしい(推奨)。 タイトルには、次のように仕様コード「css-syntax」を含めること: 「[css-syntax] …コメントの概要…」。 すべての issue とコメントはアーカイブされる。 または、(アーカイブ済みの)公開メーリングリスト www-style@w3.orgにフィードバックを送信することもできる。

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

この文書は、 W3C 特許ポリシーの下で活動するグループによって作成された。 W3C は、 特許開示の公開リスト をこのグループの成果物に関連して維持している。 このページには、特許を開示するための手順も含まれている。 本人が、 必須クレームを含むと考える特許について実際に知識を持つ個人は、 次に従って情報を開示しなければならない W3C 特許ポリシーの第 6 節。

1. はじめに

この節は規範的ではない。

このモジュールは、CSS スタイルシートの抽象構文と構文解析 および CSS 構文を使用するその他のもの (HTML の style 属性など)を定義する。

Unicode コードポイントのストリーム (言い換えれば、テキスト)を CSS トークンのストリームへ変換し、 さらにスタイルシート、規則、宣言などの CSS オブジェクトへ変換するためのアルゴリズムを定義する。

1.1. モジュール間の相互作用

このモジュールは、CSS スタイルシートの構文と構文解析を定義する。 CSS 2.1 で定義された字句スキャナーと文法を置き換える。

2. CSS の構文の説明

この節は規範的ではない。

CSS 文書は、一連のスタイル 規則—​文書内の要素にスタイルを適用する修飾規則—​と、CSS 文書の特別な処理 規則や値を定義するat 規則—​から成る。

修飾規則は 前置部から始まり、 次に、宣言のシーケンスを含む {} で囲まれたブロックを持つ。 前置部の意味は、その規則が現れる文脈によって異なる—​スタイル規則の場合、どの 要素に宣言を適用するかを指定するセレクターである。 各宣言は名前を持ち、 その後にコロンと宣言値が続く。 宣言はセミコロンで区切られる。

典型的な規則は、次のようになる:

p > a {
  color: blue;
  text-decoration: underline;
}

上の規則では、"p > a" がセレクターであり、 ソース文書が HTML の場合、 次の任意の a 要素で、 p 要素の子であるものを選択する。

"color: blue" は、 セレクターに一致する要素について、 その color プロパティが値 blue を持つべきことを指定する宣言である。 同様に、その text-decoration プロパティは値 underline を持つべきである。

At 規則はそれぞれ異なるが、 共通する基本構造を持つ。 それらは "@" コードポイントから始まり、その後に CSS キーワードとして名前が続く。 一部の at 規則は単純な文であり、 名前の後にその動作を指定する追加の CSS 値が続き、 最後にセミコロンで終了する。 その他はブロックである。 名前の後に CSS 値を持つことができるが、 修飾規則と同様に、 {} で囲まれたブロックで終了する。 これらのブロックの内容でさえ、指定された at 規則に固有である: 修飾 規則のように宣言のシーケンスを含む場合もあり、 また、追加のブロック、at 規則、あるいはまったく別の構造を含む場合もある。

以下は、含むことのできるさまざまな構文を示すat 規則の いくつかの例である。

@import "my-styles.css";

@import at 規則は単純な文である。 その名前の後には、インポートすべきスタイルシートを示す単一の文字列または url() 関数 を取る。

@page :left {
  margin-left: 4cm;
  margin-right: 3cm;
}

@page at 規則は、任意のページセレクター(:left 疑似クラス)と、 印刷時にページへ適用されるプロパティのブロックから成る。 この点で、通常のスタイル規則と非常によく似ているが、 そのプロパティはどの "要素" にも適用されず、 ページ自体に適用される。

@media print {
  body { font-size: 10pt }
}

@media at 規則は、メディアタイプ と任意のメディアクエリのリストで始まる。 そのブロックには完全な規則が含まれ、 @media の 条件が満たされた場合にのみ適用される。

プロパティ名とat 規則名は常に ident シーケンスであり、 ident-start コードポイント、2 個のハイフン、 またはハイフンの後に ident-start コードポイントが続くものから開始しなければならず、 その後に 0 個以上の ident コードポイントを含むことができる。 任意の コードポイントを、 CSS がその構文で使用するものも含めて、 エスケープすることで含めることができる。

セレクターの構文は Selectors 仕様で定義されている。 同様に、多種多様な CSS 値の構文は Values & Units 仕様で定義されている。 個々のat 規則の特殊な構文は、それらを定義する仕様で確認できる。

2.1. エスケープ

この節は規範的ではない。

任意の Unicode コードポイントは、ident シーケンスまたは引用符付き文字列に、 それをエスケープすることで含めることができる。 CSS エスケープシーケンスはバックスラッシュ (\) で始まり、次が続く:

2.2. エラー処理

この節は規範的ではない。

CSS でエラーが発生した場合、 パーサーは適切に回復しようとし、 通常どおりの構文解析へ戻る前に 最小限の内容だけを破棄する。 これは、エラーが常に間違いとは限らないためである—​新しい構文は古いパーサーにはエラーに見え、 それを含むスタイルシートが古い UA で完全に壊れることを心配せずに 言語へ新しい構文を追加できることは有用である。

正確なエラー回復動作はパーサー自体で詳述されるが、 十分に単純なので、短い説明でもかなり正確である。

各構成要素(宣言、スタイル規則、at 規則)が構文解析された後、 ユーザーエージェントは期待される文法に照らしてそれを確認する。 文法に一致しない場合、 それは無効であり、 UA によって無視され、 UA はそれがまったく存在しなかったかのように扱う。

3. CSS のトークン化と構文解析

ユーザーエージェントは、この仕様で説明される構文解析規則を使用して text/css リソースから [CSSOM] ツリーを生成しなければならない。 これらの規則を合わせたものを CSS パーサーと呼ぶ。

この仕様は、CSS 文書が 構文的に正しいかどうかにかかわらず、その構文解析規則を定義する。 構文解析アルゴリズム内の特定の箇所は構文解析エラーと呼ばれる。 構文解析エラーのエラー処理は明確に定義されている: ユーザーエージェントは、そのような問題に遭遇した場合、以下に説明するように動作するか、 以下に説明する規則を適用したくない最初のエラーで 処理を中止しなければならない。

適合性チェッカーは、文書内に 1 つ以上の構文解析エラー条件が存在する場合、 少なくとも 1 つの構文解析エラー条件をユーザーに報告しなければならず、 文書内に存在しない場合は 構文解析エラー条件を報告してはならない。 適合性チェッカーは、文書内に複数の構文解析エラー条件が存在する場合、 複数の構文解析エラー条件を報告してもよい。 適合性チェッカーは構文解析エラーから回復する必要はないが、 回復する場合は、 ユーザーエージェントと同じ方法で回復しなければならない。

テスト

3.1. 構文解析モデルの概要

CSS 構文解析処理への入力は Unicode コードポイントのストリームから成り、 これはトークン化段階を通り、その後ツリー構築段階を通る。 出力は CSSStyleSheet オブジェクトである。

注: スクリプトをサポートしない実装は、 実際に CSSOM CSSStyleSheet オブジェクトを作成する必要はないが、 そのような場合でも CSSOM ツリーは仕様の残りのモデルとして使用される。

3.2. 入力バイトストリーム

スタイルシートを構文解析する場合、 トークン化段階への入力を構成する Unicode コードポイントのストリームは、 最初はユーザーエージェントからバイトストリームとして見える場合がある (通常、ネットワークまたはローカルファイルシステムから取得される)。 その場合、ユーザーエージェントは特定の文字エンコーディングに従って これらのバイトをコードポイントへ復号しなければならない。

stylesheet のバイトストリームをコード ポイントのストリームに復号するには:
  1. stylesheet のフォールバックエンコーディングを決定し、 その結果を fallback とする。

  2. stylesheet のバイトストリームを フォールバックエンコーディング fallback を用いて復号し、 その結果を返す。

注: 復号アルゴリズムは、 バイトオーダーマーク(BOM)を優先し、 それが見つからない場合にのみフォールバックを使用する。

stylesheet のフォールバック エンコーディングを決定するには:
  1. HTTP または同等のプロトコルが stylesheet に対して encoding label(例えば Content-Type ヘッダーの charset パラメーター を介して)を提供する場合、 encoding label からエンコーディングを取得する。 それが失敗を返さない場合、 それを返す。
  2. それ以外の場合、stylesheet のバイトストリームを確認する。 ストリームの最初の 1024 バイトが次の 16 進シーケンスで始まる場合、
    40 63 68 61 72 73 65 74 20 22 XX* 22 3B

    各 XX バイトが 016 以上 2116 以下の値 または 2316 以上 7F16 以下の値である場合、 XX バイトのシーケンスから形成され、 ASCII として解釈される文字列 からエンコーディングを取得する。

    このバイトシーケンスは何を意味するのか?

    上記のバイトシーケンスは、 ASCII として復号すると、 文字列 "@charset "…";" となり、 "…" はエンコーディングのラベルに対応するバイトシーケンスである。

    戻り値が utf-16be または utf-16le だった場合、 utf-8 を返す。 それ以外で失敗でなければ、 それを返す。

    宣言が utf-16 としているのに、なぜ utf-8 を使用するのか?

    エンコーディング宣言のバイトは ASCII で “@charset "…";” を表すが、 UTF-16 は ASCII 互換ではない。 文書内で正しいバイトを得るために完全な意味不明の文字列(䁣桡牳整•utf-16be∻ のようなもの)を入力したか、 そうでなければ、 実際には文書が ASCII 互換エンコーディングであり、 エンコーディング宣言が偽っていることになる。

    いずれにしても、UTF-8 をデフォルトにするのは妥当な答えである。

    さらに、これは HTML の <meta charset> 属性の動作を模倣する。

    注: エンコーディング 宣言の構文は、at 規則である @charset の構文のように見えるが、 実際にはそのような規則は存在せず、 記述方法の規則は通常そのような規則を 認識する場合よりはるかに厳格である。 CSS で実行できることで、(存在すると仮定すれば)有効な @charset 規則を生成するもののうち、 複数の空白、コメント、単一引用符の使用などは、 エンコーディング宣言が認識されない原因となる。 この動作はエンコーディング宣言を可能な限り単純に保ち、 その結果、正しく実装される可能性を最大化する。

  3. それ以外の場合、参照元の文書から環境エンコーディングが提供されていれば、 それを返す。
  4. それ以外の場合、utf-8 を返す。

UTF-8 は Web のデフォルトエンコーディングであり、 多くの新しい Web ベースのファイル形式は UTF-8 エンコーディングを前提または必須としているが、 CSS はどのエンコーディングが主流になるか明らかになる前に作成されたため、 スタイルシートが UTF-8 であると自動的に仮定することはできない。

スタイルシートの作者は、スタイルシートを UTF-8 で作成するべきであり、 HTTP ヘッダー(または同等の方法)がスタイルシートのエンコーディングを UTF-8 として宣言するか、 参照元の文書がそのエンコーディングを UTF-8 として宣言するようにしなければならない。 (HTML では、head に <meta charset=utf-8> 要素を追加することで これを行う。)

これらの選択肢のいずれも利用できない場合、 作者は UTF-8 BOM または次の正確な文字でスタイルシートを開始するべきである

@charset "utf-8";

バイトから復号される CSS スタイルシートを参照する文書言語は、 そのような各スタイルシートに環境 エンコーディングを定義してもよく、 これは他のエンコーディングの手掛かりが利用できない、または使用できない場合のフォールバックとして使用される。

環境エンコーディングという概念は、レガシー コンテンツとの互換性のためだけに存在する。 新しい形式および新しいリンク機構は環境エンコーディングを提供するべきではなく、 より明示的な情報がない場合には、代わりにスタイルシートが UTF-8 をデフォルトとするようにする。

注: [HTML] は、 <link rel=stylesheet> の環境エンコーディングを定義する。

注: [CSSOM] は、<xml-stylesheet?> の 環境エンコーディングを定義する。

注: [CSS-CASCADE-3] は、 @import の環境エンコーディングを定義する。

3.3. 入力ストリームの前処理

入力ストリームは、 入力バイトストリームが復号される際にそこへプッシュされる フィルター済み コードポイントから成る。

(未フィルターの)コードポイントのストリーム input から コードポイントをフィルターするには:
テスト

4. トークン化

コードポイントのストリームを CSS トークンのストリーム input にトークン化するには、 <EOF-token>に到達するまで、input から トークンを消費することを繰り返し、 返された各トークンをストリームへプッシュする。

注: トークンを消費するアルゴリズムの各呼び出しは 単一のトークンを返すため、 必要であれば、構文解析の最中に コードポイントのストリームを "オンデマンド" でトークン化するためにも使用できる。

トークン化段階の出力は、次のトークンの 0 個以上から成るストリームである: <ident-token>, <function-token>, <at-keyword-token>, <hash-token>, <string-token>, <bad-string-token>, <url-token>, <bad-url-token>, <delim-token>, <number-token>, <percentage-token>, <dimension-token>, <unicode-range-token>, <whitespace-token>, <CDO-token>, <CDC-token>, <colon-token>, <semicolon-token>, <comma-token>, <[-token>, <]-token>, <(-token>, <)-token>, <{-token>, および <}-token>。

注: hash トークンの type フラグは、 Selectors 構文 [SELECT] で使用される。 "id" type の hash トークンのみが有効なID セレクターである。

4.1. トークンのレールロード図

この節は非規範的である。

この節では、トークナイザーを情報提供的な観点から、 レールロード図の形式で示す。 レールロード図は明示的なパーサーより簡潔であり、 多くの場合、正規表現より読みやすい。

これらの図は情報提供的かつ不完全である。 "正しい" トークンの文法を記述するが、 エラー処理についてはまったく記述しない。 各トークンの構文を直感的に把握しやすくすることだけを目的として提供される。

<foo-token> のような名前を持つ図はトークンを表す。 その他は、他の図から参照される生成規則である。

コメント
/* * の後に / が続くもの以外 */
改行
\n \r\n \r \f
空白
スペース \t 改行
16 進数字
0-9 a-f または A-F
エスケープ
\ 改行でも 16 進数字でもない 16 進数字 1-6 回 空白
<whitespace-token>
空白
ws*
<whitespace-token>
<ident-token>
-- - a-z A-Z _ または非 ASCII エスケープ a-z A-Z 0-9 _ - または非 ASCII エスケープ
<function-token>
<ident-token> (
<at-keyword-token>
@ <ident-token>
<hash-token>
# a-z A-Z 0-9 _ - または非 ASCII エスケープ
<string-token>
" " \ または改行以外 エスケープ \ 改行 " ' ' \ または改行以外 エスケープ \ 改行 '
<url-token>
<ident-token "url"> ( ws* " ' ( ) \ 空白 または印字不能以外 エスケープ ws* )
<number-token>
+ - 数字 . 数字 数字 . 数字 e E + - 数字
<dimension-token>
<number-token> <ident-token>
<percentage-token>
<number-token> %
<CDO-token>
<!--
<CDC-token>
-->
<unicode-range-token>
U u + 16 進数字 1-6 回 16 進数字 1-5 回 ? 1 から (6-数字数) 回 16 進数字 1-6 回 - 16 進数字 1-6 回

4.2. 定義

この節では、トークン化段階で使用されるいくつかの用語を定義する。

次の入力コード ポイント
入力ストリーム内で、まだ消費されていない最初のコードポイント。
現在の入力 コードポイント
最後に消費されたコードポイント。
現在の入力コードポイントを再消費する
現在の入力コードポイントを入力ストリームの先頭に戻し、 次に次の入力コードポイントを消費するよう指示されたとき、 代わりに現在の入力コード ポイントを再消費するようにする。
EOF コードポイント
入力ストリームの終端を表す概念上のコードポイント。 入力ストリームが空である場合は常に、 次の入力 コードポイントは常に EOF コードポイントである。
数字
U+0030 DIGIT ZERO (0) から U+0039 DIGIT NINE (9) まで(両端を含む)のコードポイント。
テスト
16 進数字
数字、 または U+0041 LATIN CAPITAL LETTER A (A) から U+0046 LATIN CAPITAL LETTER F (F) まで(両端を含む)のコードポイント、 または U+0061 LATIN SMALL LETTER A (a) から U+0066 LATIN SMALL LETTER F (f) まで(両端を含む)のコードポイント。
大文字
U+0041 LATIN CAPITAL LETTER A (A) から U+005A LATIN CAPITAL LETTER Z (Z) まで(両端を含む)のコードポイント。
小文字
U+0061 LATIN SMALL LETTER A (a) から U+007A LATIN SMALL LETTER Z (z) まで(両端を含む)のコードポイント。
文字
大文字 または小 文字。
非 ASCII ident コードポイント
値が次のいずれかであるコードポイント:
  • U+00B7

  • U+00C0 から U+00D6 まで

  • U+00D8 から U+00F6 まで

  • U+00F8 から U+037D まで

  • U+037F から U+1FFF まで

  • U+200C

  • U+200D

  • U+203F

  • U+2040

  • U+2070 から U+218F まで

  • U+2C00 から U+2FEF まで

  • U+3001 から U+D7FF まで

  • U+F900 から U+FDCF まで

  • U+FDF0 から U+FFFD まで

  • U+10000 以上

これらの範囲はすべて両端を含む。

テスト
なぜ、具体的にこれらの文字なのか?

これは、HTML の有効なカスタム要素名で使用することが許可されている 非 ASCII コードポイントのリストと一致する。 空白として現れる多数の文字や、 一部のツールでレンダリングまたは構文解析の問題を引き起こす可能性がある文字、 例えば方向上書きコードポイントなどは除外される。

これは、識別子に対して UAX 31 が推奨する制限の集合よりも弱いことに注意すること (JavaScript などの言語では識別子の構文を制限するために使用される)。 例えば、 結合文字で識別子を開始することなども許可される。 HTML カスタム要素名との一貫性 (したがって、エスケープを使用せずにすべてのカスタム要素のセレクターを記述できること) は価値があると考えられ、 HTML によって制限される文字の集合は 「価値の高い」制限を十分に網羅している。

これらの制限によって、混乱を招く可能性のあるすべてのレンダリングが避けられるわけではない。 LTR と RTL のスクリプトの文字を混在させると、 ほとんどのテキストエディターで 予期しない視覚的な転置が依然として発生する可能性がある。 例えばそうである。 ソーステキストには、ident 以外の文脈で制限された文字を含めることもできる: 例えば、そのほとんどは文字列では完全に有効である。 無効な CSS を生成する方法で使用された場合でさえ、 それらが引き起こす構文解析エラーは重要でないものに限定される可能性がある一方、 コードレビューツールでのソーステキストのレンダリングへの影響は 重大および/または悪意のあるものとなる可能性がある。 この種の「ソーステキスト攻撃」の詳細については、 この Rust-lang ブログ 投稿 (アーカイブ)を参照。

ident-start コードポイント
文字、 非 ASCII ident コードポイント、 または U+005F LOW LINE (_)。
ident コード ポイント
ident-start コードポイント、 数字、 または U+002D HYPHEN-MINUS (-)。
印字不能 コードポイント
U+0000 NULL から U+0008 BACKSPACE まで(両端を含む)のコードポイント、 または U+000B LINE TABULATION、 または U+000E SHIFT OUT から U+001F INFORMATION SEPARATOR ONE まで(両端を含む)のコードポイント、 または U+007F DELETE。
テスト
改行
U+000A LINE FEED。 U+000D CARRIAGE RETURN および U+000C FORM FEED はこの定義には含まれないことに注意すること。 これらは前処理中に U+000A LINE FEED に変換されるためである。
空白
改行、U+0009 CHARACTER TABULATION、または U+0020 SPACE。
テスト
許可される最大 コードポイント
Unicode によって定義される最大のコードポイント: U+10FFFF。
ident シーケンス
<ident-token>と同じ構文を持つコードポイントのシーケンス。

注: <at-keyword-token> の "@" より後の部分、 <hash-token>("id" type フラグを持つ)の "#" より後の部分、 <function-token> の "(" より前の部分、 および <dimension-token> の単位 はすべてident シーケンスである。

4.3. トークナイザーアルゴリズム

この節で定義されるアルゴリズムは、コードポイントのストリームを トークンのストリームに変換する。

4.3.1. トークンを消費する

この節では、コード ポイントのストリームからトークンを消費する方法を説明する。 さらに、任意のブール値 unicode ranges allowed を取り、 デフォルトは false である。 任意の type の単一のトークンを返す。

コメントを消費する。

次の 入力コードポイントを消費する。

空白
可能な限り多くの空白を 消費する。 <whitespace-token>を返す。
U+0022 QUOTATION MARK (")
文字列 トークンを消費する そしてそれを返す。
U+0023 NUMBER SIGN (#)
次の 入力コードポイントがident コードポイント であるか、次の 2 つの入力コードポイントが 有効なエスケープである場合、 次を行う:
  1. <hash-token>を作成する。
  2. 次の 3 つの入力コードポイントが ident シーケンスを開始する場合、 <hash-token>の type フラグを "id" に設定する。
  3. ident シーケンスを消費する。 そして<hash-token>の値を返された文字列に設定する。
  4. <hash-token>を返す。

それ以外の場合、 <delim-token>を返し、 その値を現在の入力コードポイントに設定する。

U+0027 APOSTROPHE (')
文字列 トークンを消費する そしてそれを返す。
U+0028 LEFT PARENTHESIS (()
<(-token>を返す。
U+0029 RIGHT PARENTHESIS ())
<)-token>を返す。
U+002B PLUS SIGN (+)
入力ストリームが数値で開始する場合、 現在の入力コードポイントを再消費する。 数値 トークンを消費する。 そしてそれを返す。

それ以外の場合、 <delim-token>を返し、 その値を現在の入力コードポイントに設定する。

U+002C COMMA (,)
<comma-token>を返す。
U+002D HYPHEN-MINUS (-)
入力ストリームが数値で開始する場合、 現在の入力コードポイントを再消費する。 数値 トークンを消費する。 そしてそれを返す。

それ以外の場合、 次の 2 つの入力コードポイントが U+002D HYPHEN-MINUS U+003E GREATER-THAN SIGN (->) であれば、 それらを消費し、 <CDC-token>を返す。

それ以外の場合、 入力ストリームがident シーケンスで開始する場合、 現在の入力コードポイントを再消費する。 ident-like トークンを消費する。 そしてそれを返す。

それ以外の場合、 <delim-token>を返し、 その値を現在の入力コードポイントに設定する。

U+002E FULL STOP (.)
入力ストリームが数値で開始する場合、 現在の入力コードポイントを再消費する。 数値 トークンを消費する。 そしてそれを返す。

それ以外の場合、 <delim-token>を返し、 その値を現在の入力コードポイントに設定する。

U+003A COLON (:)
<colon-token>を返す。
U+003B SEMICOLON (;)
<semicolon-token>を返す。
U+003C LESS-THAN SIGN (<)
次の 3 つの 入力コードポイントが U+0021 EXCLAMATION MARK U+002D HYPHEN-MINUS U+002D HYPHEN-MINUS (!--) であれば、 それらを消費し、 <CDO-token>を返す。

それ以外の場合、 <delim-token>を返し、 その値を現在の入力コードポイントに設定する。

U+0040 COMMERCIAL AT (@)
次の 3 つの 入力コードポイントが ident シーケンスを開始する場合、 ident シーケンスを消費する。 その値を返された 値に設定した<at-keyword-token>を作成し、 それを返す。

それ以外の場合、 <delim-token>を返し、 その値を現在の入力コードポイントに設定する。

U+005B LEFT SQUARE BRACKET ([)
<[-token>を返す。
U+005C REVERSE SOLIDUS (\)
入力ストリームが有効なエスケープで開始する場合、 現在の入力コードポイントを再消費する。 ident-like トークンを消費する。 そしてそれを返す。
テスト

それ以外の場合、 これは構文解析エラーである。 <delim-token>を返し、 その値を現在の入力コードポイントに設定する。

U+005D RIGHT SQUARE BRACKET (])
<]-token>を返す。
U+007B LEFT CURLY BRACKET ({)
<{-token>を返す。
U+007D RIGHT CURLY BRACKET (})
<}-token>を返す。
数字
現在の入力コードポイントを再消費する。 数値 トークンを消費する。 そしてそれを返す。
U+0055 LATIN CAPITAL LETTER U (U)
u+0075 LATIN LOWERCASE LETTER U (u)
unicode ranges allowed が true であり、入力ストリームがunicode-range を開始する場合、 現在の入力コードポイントを再消費する。 unicode-range トークンを消費する。 そしてそれを返す。

それ以外の場合、 現在の入力コードポイントを再消費する。 ident-like トークンを消費する。 そしてそれを返す。

ident-start コードポイント
現在の入力コードポイントを再消費する。 ident-like トークンを消費する。 そしてそれを返す。
EOF
<EOF-token>を返す。
その他
<delim-token>を返し、 その値を現在の入力コードポイントに設定する。
テスト

4.3.2. コメントを消費する

この節では、コードポイントのストリームからコメントを消費する方法を説明する。 何も返さない。

次の 2 つの 入力コードポイントが U+002F SOLIDUS (/) の後に U+002A ASTERISK (*) が続くものであれば、 それらと、 最初の U+002A ASTERISK (*) の後に U+002F SOLIDUS (/) が続く箇所まで(それを含む)の 後続するすべてのコードポイントを消費するか、 EOF コードポイントまで消費する。 このステップの先頭に戻る。

前の段落が EOF コードポイントを消費して終了した場合、 これは構文解析エラーである。

何も返さない。

4.3.3. 数値トークンを消費する

この節では、コードポイントのストリームから数値トークンを消費する方法を説明する。 <number-token>、<percentage-token>、または <dimension-token>のいずれかを返す。

数値を消費する。その結果を number とする。

次の 3 つの 入力コードポイントが ident シーケンスを開始する場合、 次を行う:

  1. number と同じ値、type フラグ、および 符号文字を持ち、単位が最初は空文字列に設定された<dimension-token>を作成する。
  2. ident シーケンスを消費する。 <dimension-token>の単位を返された値に設定する。
  3. <dimension-token>を返す。

それ以外の場合、 次の入力 コードポイントが U+0025 PERCENTAGE SIGN (%) であれば、 それを消費する。 number と同じ値および符号文字 を持つ<percentage-token>を作成し、 それを返す。

それ以外の場合、 number と同じ値、type フラグ、および符号 文字を持つ<number-token>を作成し、 それを返す。

4.3.4. ident-like トークンを消費する

この節では、コード ポイントのストリームからident-like トークンを消費する方法を説明する。 <ident-token>、<function-token>、<url-token>、または <bad-url-token>を返す。

ident シーケンスを消費する。その結果を string とする。

string の値が "url" とASCII 大文字・小文字を区別せず一致し、 次の 入力コードポイントが U+0028 LEFT PARENTHESIS (() であれば、 それを消費する。 次の 2 つの入力コードポイントが 空白である間、 次の入力コードポイントを消費する。 次の 1 つまたは 2 つの入力コードポイントが U+0022 QUOTATION MARK (")、 U+0027 APOSTROPHE (')、 または空白の後に U+0022 QUOTATION MARK (") または U+0027 APOSTROPHE (') が続くものであれば、 <function-token>を作成し、 その値を string に設定して それを返す。 それ以外の場合、 url トークンを消費する。 そしてそれを返す。

それ以外の場合、 次の入力 コードポイントが U+0028 LEFT PARENTHESIS (() であれば、 それを消費する。 <function-token>を作成し、 その値を string に設定して それを返す。

それ以外の場合、 <ident-token>を作成し、 その値を string に設定して それを返す。

4.3.5. 文字列トークンを消費する

この節では、コードポイントのストリームから文字列トークンを消費する方法を説明する。 <string-token>または <bad-string-token>のいずれかを返す。

このアルゴリズムは ending code point を指定して呼び出してもよく、 これは文字列を終了するコードポイントを示す。 ending code point が指定されていない場合、 現在の 入力コードポイントを使用する。

最初に、値を空文字列に設定した<string-token>を作成する。

ストリームから次の入力コードポイントを繰り返し消費する:

ending code point
<string-token>を返す。
EOF
これは構文解析エラーである。 <string-token>を返す。
改行
これは構文解析エラーである。 現在の入力コードポイントを再消費する。 <bad-string-token>を作成し、それを返す。
U+005C REVERSE SOLIDUS (\)
次の 入力コードポイントが EOF であれば、 何もしない。

それ以外の場合、 次の入力コードポイントが改行であれば、 それを消費する。

それ以外の場合、 (ストリームが有効な エスケープで開始する) エスケープされたコードポイントを消費する。 返されたコードポイントを<string-token>の値に追加する。

その他
現在の入力コードポイントを<string-token>の値に追加する。
テスト

4.3.6. url トークンを消費する

この節では、コードポイントのストリームからurl トークンを消費する方法を説明する。 <url-token>または <bad-url-token>のいずれかを返す。

注: このアルゴリズムは、最初の "url(" が すでに消費されていることを前提とする。 また、このアルゴリズムは、url(foo) のような 「引用符なし」の値を消費するために呼び出されていることを前提とする。 url("foo") のような引用符付きの値は、 <function-token>として構文解析される。 ident-like トークンを消費するは、この 区別を自動的に処理する。 それ以外の場合、このアルゴリズムを直接呼び出すべきではない。

  1. 最初に、値を空文字列に設定した<url-token>を作成する。
  2. 可能な限り多くの空白を 消費する。
  3. ストリームから次の入力コードポイントを繰り返し消費する:
    U+0029 RIGHT PARENTHESIS ())
    <url-token>を返す。
    EOF
    これは構文解析エラーである。 <url-token>を返す。
    空白
    可能な限り多くの空白を消費する。 次の入力コードポイントが U+0029 RIGHT PARENTHESIS ()) または EOF であれば、 それを消費し、<url-token>を返す (EOF に遭遇した場合、これは構文解析エラーである)。 それ以外の場合、 不正な url の残りを消費する。 <bad-url-token>を作成し、 それを返す。
    U+0022 QUOTATION MARK (")
    U+0027 APOSTROPHE (')
    U+0028 LEFT PARENTHESIS (()
    印字不能コードポイント
    これは構文解析エラーである。 不正な url の残りを消費する。 <bad-url-token>を作成し、 それを返す。
    U+005C REVERSE SOLIDUS (\)
    ストリームが有効なエスケープで開始する場合、 エスケープされたコードポイントを消費する。 返されたコードポイントを<url-token>の値に追加する。

    それ以外の場合、 これは構文解析 エラーである。 不正な url の残りを消費する。 <bad-url-token>を作成し、 それを返す。

    その他
    現在の入力コードポイント を<url-token>の値に追加する。
テスト

4.3.7. エスケープされたコードポイントを消費する

この節では、エスケープされたコードポイントを消費する方法を説明する。 U+005C REVERSE SOLIDUS (\) がすでに消費されており、 次の入力コードポイントが 有効なエスケープの一部であることがすでに検証されていることを前提とする。 コードポイントを返す。

次の 入力コードポイントを消費する。

16 進数字
可能な限り多くの16 進数字を 消費するが、5 個を超えてはならない。 これは合計で 1-6 個の 16 進数字が消費されたことを意味する点に注意。 次の 入力コードポイントが 空白であれば、 それも消費する。 16 進数字を 16 進数として解釈する。 この数値が 0 である場合、 またはサロゲートに対応する場合、 または許可される最大コードポイントより大きい場合、 U+FFFD REPLACEMENT CHARACTER (�) を返す。 それ以外の場合、その値を持つコードポイントを返す。
EOF
これは構文解析エラーである。 U+FFFD REPLACEMENT CHARACTER (�) を返す。
その他
現在の入力コードポイントを返す。
テスト

4.3.8. 2 つのコードポイントが有効なエスケープであるかを確認する

この節では、2 つのコードポイントが有効な エスケープであるかを確認する方法を説明する。 ここで説明するアルゴリズムは、2 つのコードポイントを明示的に指定して呼び出すことも、 入力ストリーム自体を指定して呼び出すこともできる。 後者の場合、対象となる 2 つのコードポイントは、 現在の 入力コードポイント と次の 入力コードポイントであり、 この順序である。

注: このアルゴリズムは追加のコード ポイントを消費しない。

最初のコードポイントが U+005C REVERSE SOLIDUS (\) でない場合、 false を返す。

それ以外の場合、 2 番目のコードポイントが改行であれば、 false を返す。

それ以外の場合、true を返す。

4.3.9. 3 つのコードポイントが ident シーケンスを開始するかを確認する

この節では、 3 つのコードポイントが ident シーケンスを開始するかを確認する方法を説明する。 ここで説明するアルゴリズムは、3 つのコードポイントを明示的に指定して呼び出すことも、 入力ストリーム自体を指定して呼び出すこともできる。 後者の場合、対象となる 3 つのコードポイントは、 現在の 入力コードポイント と次の 2 つの 入力コードポイントであり、 この順序である。

注: このアルゴリズムは追加のコード ポイントを消費しない。

最初のコードポイントを見る:

U+002D HYPHEN-MINUS
2 番目のコードポイントがident-start コードポイント または U+002D HYPHEN-MINUS であるか、 2 番目と 3 番目のコードポイントが有効なエスケープである場合、 true を返す。 それ以外の場合、false を返す。
ident-start コードポイント
true を返す。
U+005C REVERSE SOLIDUS (\)
1 番目と 2 番目のコードポイントが有効なエスケープである場合、 true を返す。 それ以外の場合、false を返す。
その他
false を返す。
テスト

4.3.10. 3 つのコードポイントが数値を開始するかを確認する

この節では、3 つのコードポイントが 数値を開始するかを確認する方法を説明する。 ここで説明するアルゴリズムは、3 つのコードポイントを明示的に指定して呼び出すことも、 入力ストリーム自体を指定して呼び出すこともできる。 後者の場合、対象となる 3 つのコードポイントは、 現在の 入力コードポイント と次の 2 つの 入力コードポイントであり、 この順序である。

注: このアルゴリズムは追加のコード ポイントを消費しない。

最初のコードポイントを見る:

U+002B PLUS SIGN (+)
U+002D HYPHEN-MINUS (-)
2 番目のコードポイント が数字であれば、 true を返す。

それ以外の場合、 2 番目のコードポイント が U+002E FULL STOP (.) であり、 3 番目のコードポイント が数字であれば、 true を返す。

それ以外の場合、false を返す。

U+002E FULL STOP (.)
2 番目のコードポイント が数字であれば、 true を返す。 それ以外の場合、false を返す。
数字
true を返す。
その他
false を返す。

4.3.11. 3 つのコードポイントが unicode-range を開始するかを確認する

この節では、 3 つのコードポイントが unicode-range を開始するかを確認する方法を説明する。 ここで説明するアルゴリズムは、3 つのコードポイントを明示的に指定して呼び出すことも、 入力ストリーム自体を指定して呼び出すこともできる。 後者の場合、対象となる 3 つのコードポイントは、 現在の 入力コードポイント と次の 2 つの 入力コードポイントであり、 この順序である。

注: このアルゴリズムは追加のコード ポイントを消費しない。

次のすべてが true である場合:

その場合、true を返す。

それ以外の場合、false を返す。

4.3.12. ident シーケンスを消費する

この節では、ident シーケンスを消費する方法をコードポイントのストリームについて説明する。 最初から始めて、ストリーム内の隣接するコードポイントから 形成できる最大の名前を含む文字列を返す。

注: このアルゴリズムは、返される コードポイントが <ident-token>を構成することを保証するために必要な、 最初のいくつかのコードポイントの検証を行わない。 それが意図した用途である場合、 このアルゴリズムを呼び出す前に、ストリームがident シーケンスで開始する ことを確認する。

最初に result を空文字列とする。

ストリームから次の入力コードポイントを繰り返し消費する:

ident コードポイント
コードポイントを result に追加する。
ストリームが有効なエスケープで開始する
エスケープされたコードポイントを消費する。 返されたコードポイントを result に追加する。
その他
現在の入力コードポイントを再消費する。 result を返す。

4.3.13. 数値を消費する

この節では、コードポイントのストリームから数値を消費する方法を説明する。 数値の value、 "integer" または "number" のいずれかである文字列 type、 および "+"、"-"、または欠落のいずれかである任意の sign character を返す。

注: このアルゴリズムは、 ストリームから数値を取得できることを保証するために必要な 最初のいくつかのコードポイントの検証を行わない。 このアルゴリズムを呼び出す前に、ストリームが数値で開始する ことを確認する。

次のステップを順に実行する:

  1. type を文字列 "integer" とする。 number part と exponent part を空文字列とする。
  2. 次の 入力コードポイントが U+002B PLUS SIGN (+) または U+002D HYPHEN-MINUS (-) であれば、 それを消費する。 それを number part に追加し、 sign character をそれに設定する。
  3. 次の入力コードポイントが数字である間、 それを消費し、number part に追加する。
  4. 次の 2 つの 入力コードポイントが、 U+002E FULL STOP (.) の後に数字が続くものであれば、 次を行う:
    1. 次の入力コードポイントを消費し、number part に追加する。
    2. 次の入力コードポイントが数字である間、それを消費して number part に追加する。
    3. type を "number" に設定する。
  5. 次の 2 つ または 3 つの入力コードポイントが、 U+0045 LATIN CAPITAL LETTER E (E) または U+0065 LATIN SMALL LETTER E (e) で始まり、 任意で U+002D HYPHEN-MINUS (-) または U+002B PLUS SIGN (+) が続き、 その後に数字が続くものであれば、 次を行う:
    1. 次の入力コードポイントを消費する。
    2. 次の入力コードポイントが "+" または "-" であれば、 それを消費し、exponent part に追加する。
    3. 次の入力コードポイントが数字である間、それを消費して exponent part に追加する。
    4. type を "number" に設定する。
  6. number part を 10 進数として解釈した結果を value とする。

    exponent part が空でない場合、 それを 10 進整数として解釈し、 10 をその結果の累乗にし、 それに value を乗算し、 value をその結果に設定する。

  7. value、type、および sign character を返す。
テスト

4.3.14. unicode-range トークンを消費する

この節では、unicode-range トークンを消費する方法を コードポイントのストリームについて説明する。 <unicode-range-token>を返す。

注: このアルゴリズムは、返されるコードポイントが <unicode-range-token>を構成することを保証するために必要な 最初のいくつかのコードポイントの 検証を行わない。 このアルゴリズムを呼び出す前に、ストリームがunicode-range を開始する ことを確認する。

注: このトークンは、通常の状況ではトークナイザーによって 生成されない。 このアルゴリズムが呼び出されるのは、 unicode-range 記述子の値を消費する間のみであり、 それ自体も特殊な場合としてのみ呼び出される。 unicode-range 記述子を構文解析するためである。 言語全体でこの 1 回だけ呼び出されるのは、 初期の CSS における不適切な構文設計によるものである。

  1. 次の 2 つの入力コードポイントを消費し、それらを破棄する。

  2. 可能な限り多くの16 進数字を 消費するが、 6 個を超えてはならない。 消費された 16 進数字が 6 個未満であれば、 可能な限り多くの U+003F QUESTION MARK (?) コードポイントを消費するが、 16 進数字と U+003F QUESTION MARK (?) コードポイントの 合計が 6 になるために必要な数を 超えてはならない。

    消費されたコードポイントを first segment とする。

  3. first segment に疑問符コードポイントが含まれている場合、次を行う:

    1. first segment 内の疑問符を U+0030 DIGIT ZERO (0) コードポイントに置き換え、 その結果を 16 進数として解釈する。 これを start of range とする。

    2. first segment 内の疑問符を U+0046 LATIN CAPITAL LETTER F (F) コードポイントに置き換え、 その結果を 16 進数として解釈する。 これを end of range とする。

    3. start of range で始まり end of range で終わる新しい<unicode-range-token>を返す。

  4. それ以外の場合、first segment を 16 進数として解釈し、 その結果を start of range とする。

  5. 次の 2 つの入力コードポイントが U+002D HYPHEN-MINUS (-) の後に16 進数字が続くものであれば、 次を行う:

    1. 次の入力コードポイントを消費する。

    2. 可能な限り多くの16 進 数字を消費するが、6 個を超えてはならない。 消費したコードポイントを 16 進数として解釈する。 これを end of range とする。

    3. start of range で始まり end of range で終わる新しい<unicode-range-token>を返す。

  6. それ以外の場合、開始と終了の両方が start of range である新しい<unicode-range-token>を返す。

4.3.15. 不正な url の残りを消費する

この節では、コード ポイントのストリームから不正な url の残りを消費する方法を説明し、 トークナイザーが <bad-url-token>ではなく <url-token>の途中にいることを認識した後に「後始末」する。 何も返さない。 唯一の用途は、通常のトークン化を再開できる回復地点に到達するのに十分な 入力ストリームを消費することである。

ストリームから次の入力コードポイントを繰り返し消費する:

U+0029 RIGHT PARENTHESIS ())
EOF
戻る。
入力ストリームが有効なエスケープで開始する
エスケープされたコードポイントを消費する。 これにより、エスケープされた右丸括弧 ("\)") に遭遇しても、 <bad-url-token>が終了しないようにできる。 それ以外は「その他」の節と同一である。
その他
何もしない。

5. 構文解析

CSS パーサーはトークンストリーム (この仕様で先に定義された トークン化処理によって生成される)を、 複数ある CSS 構成要素のうち 1 つ以上へ変換する (どの構文解析アルゴリズムが呼び出されるかによる)。

5.1. パーサーのレールロード図

この節は非規範的である。

この節では、パーサーを情報提供的な観点から、 レールロード図の形式で示す。

これらの図は情報提供的かつ不完全である。 「正しい」スタイルシートの文法を記述するが、 エラー処理についてはまったく記述しない。 構文を直感的に把握しやすくすることだけを目的として提供される。

スタイルシート
<whitespace-token> <CDC-token> <CDO-token> 修飾規則 at 規則
at 規則
<at-keyword-token> コンポーネント値 {} ブロック ;
修飾規則
コンポーネント値 {} ブロック
{} ブロック
{ ws* 宣言 ; at 規則 修飾規則 ws* ws* }
宣言
<ident-token> ws* : コンポーネント値 !important
!important
! ws* <ident-token "important"> ws*
コンポーネント値
保持トークン 単純ブロック 関数ブロック
単純ブロック
{ コンポーネント値 } ( コンポーネント値 ) [ コンポーネント値 ]
関数ブロック
<function-token> コンポーネント値 )

5.2. CSS 構文解析結果

構文解析の結果は、次のいずれか (またはそれらのリスト)となり得る:

スタイルシート

スタイルシートは規則のリストを持つ。

規則

規則は、at 規則 または修飾規則のいずれかである。

at 規則
at 規則は、文字列である名前と、 コンポーネント値のリストから成る前置部を持つ。 ブロック at 規則 ({} ブロックで終わる)は、 さらに 宣言のリスト および子規則のリストを持つ。 (文 at 規則は、 セミコロンで終わり、 これらを持たない。)
修飾規則
修飾規則は、 コンポーネント値のリストから成る前置部、 宣言のリスト、 および子規則のリストを持つ。

注: ほとんどの修飾規則はスタイル規則であり、 前置部はセレクター [selectors-4] で、その宣言はプロパティである。

宣言
宣言は、文字列である名前と、 コンポーネント値のリストから成る値と、 初期状態では設定されていない important フラグを持つ。 また、任意の original text も持ち、これは文字列である (ごく一部の宣言についてのみ取得される)。

宣言はさらに、 プロパティ宣言または記述子 宣言に分類され、 前者は CSS プロパティを設定し、 もっとも頻繁に修飾規則に現れ、 後者は CSS 記述子を設定し、 at 規則にのみ現れる。 (この分類は Syntax レベルでは行われず、 代わりに宣言が現れる場所によって決まり、 該当する規則を定義するそれぞれの仕様によって定義される。)

コンポーネント値
コンポーネント値は、保持トークン、 関数、 または単純ブロックのいずれかである。
保持トークン
トークナイザーによって生成される任意のトークンのうち、 <function-token>、 <{-token>、 <(-token>、 および<[-token>を除くもの。

注: 上記の非保持トークンは、 常により高レベルのオブジェクト、 すなわち関数または単純ブロックに取り込まれるため、 それ自体がパーサー出力に現れることはない。

注: トークン <}-token>、<)-token>、<]-token>、<bad-string-token>、および<bad-url-token>は常に構文解析エラーであるが、 Media Queries などの他の仕様が、 宣言またはブロック全体を単に破棄するよりも きめ細かなエラー処理を定義できるようにするため、 この仕様ではトークンストリーム内に保持される。

関数
関数は名前と、 コンポーネント値のリストから成る値を持つ。
単純 ブロック
{} ブロック
[] ブロック
() ブロック
単純ブロックは、関連付けられたトークン(<[-token>、<(-token>、または<{-token>のいずれか) と、コンポーネント値のリストから成る値を持つ。

{} ブロック、[] ブロック、および() ブロックは、 具体的には、 対応する関連付けられたトークンを持つ単純ブロック を指す。

テスト

5.3. トークンストリーム

トークン ストリームは、 トークンおよび/またはコンポーネント値のストリームを表す構造体である。 次の項目を持つ:

トークン

トークン および/またはコンポーネント 値のリスト。

注: この仕様では、簡単のため、 入力ストリームが完全にトークン化された 後に構文解析が開始すると仮定している。 ただし、構文解析アルゴリズムが使用する「先読み」は 1 トークンだけなので、 実際にはトークン化と構文解析を 同期して行うことができる。

インデックス

トークンへのインデックスであり、 構文解析の進行状況を表す。 初期値は 0 である。

注: マークを除き、 インデックスが 後戻りすることはない。 したがって、すでに処理されたトークンの接頭部分は、 処理され次第破棄できる。

マークされたインデックス

インデックス値のスタックであり、 パーサーが戻る可能性のある地点を 表す。 初期状態では空である。

CSS には、 宣言の値として構文解析された 正確なテキストを参照する必要がある箇所が少数存在する (そのテキストから生成されたトークンだけではない)。 これはここでのアルゴリズム構造には明示的に記述されていないが、 そのためトークンストリームは、 必要に応じて宣言の元のテキストを再現する能力を 持たなければならない。 これが必要になる場合の詳細については、宣言を 消費するを参照。

トークンストリームに対して、いくつかの操作を実行できる:

次のトークン

インデックスにあるトークンの項目。

そのインデックスがリスト終端の範囲外となる場合、 代わりに<eof-token>となる。

空

次のトークンが<eof-token>である場合、トークンストリームは空である。

トークンを消費する

token を次のトークンとする。 インデックスを増加させ、 その後 token を返す。

トークンを破棄する

トークン ストリームが空でない場合、 インデックスを増加させる。

マークする

インデックスを マークされたインデックスに追加する。

マークを復元する

マークされたインデックスからポップし、 インデックスをポップされた値に設定する。

マークを破棄する

マークされたインデックスからポップし、 ポップされた値については何もしない。

空白を破棄する

次のトークンが<whitespace-token>である間、 トークンを破棄する。

処理する

後続するトークン型と関連するアクションのリストが与えられたとき、 次のトークンに関連付けられたアクションを実行することによって処理する。 いずれかのアクションが何かを返すまで繰り返し、 その後それを返す。

<eof-token>は概念上のトークンであり、 実際にはトークナイザーによって生成されず、 トークンストリームが使い尽くされたことを示すために使用される。

5.4. パーサーのエントリーポイント

この節で定義されるアルゴリズムは、 CSS トークンのリストから高レベルの CSS オブジェクトを生成する。

ここでのアルゴリズムは、入力としてトークンストリームを扱うが、 利便性のため、 他のいくつかの型の値を指定して呼び出すこともできる。

与えられた input をトークンストリームに正規化するには:

  1. input がすでにトークンストリームである場合、 それを返す。

  2. input が CSS トークンおよび/またはコンポーネント値のリストである場合、 新しいトークンストリームを作成し、 input をそのトークンとし、 それを返す。

  3. input が文字列である場合、 input からコードポイントをフィルターし、 その結果をトークン化し、 トークンのストリームを返す。

  4. 表明: input として渡されるのは、上記の型のみであるべきである。

注: 他の仕様は、 独自の目的のために追加のエントリーポイントを定義できる。

次の注記は、おそらく関連する仕様で規範的な文章に変換し、 この仕様の用語に結び付けるべきである:

5.4.1. CSS 文法に従って何かを構文解析する

文字列またはトークンリストを構文解析して、 ある CSS 文法に一致するかどうかを確認し、 一致する場合には、 文法に従ってそれを分解することが望ましい場合がよくある。 この節では、この種の操作のための汎用的なフックを提供する。 次のように呼び出すべきである: 「foo を CSS <color> として構文解析する」、または同様に。

このアルゴリズムは、入力が指定された文法に一致しない場合は 失敗を返し、 それ以外の場合は文法に従って入力を構文解析した結果を返す。 これは指定された文法仕様に対応する未規定の構造である。 戻り値は仕様の文章によってのみ操作されなければならず、 その場合、表現の曖昧さは問題にならない。 仕様言語の外部に公開することを意図する場合、 結果を使用する仕様は、明確に規定された表現へ明示的に変換しなければならない。 例えば、CSS シリアル化アルゴリズムを呼び出すことによって (「CSS <string> 値としてシリアル化する」のように)。

注: このアルゴリズムと、 CSS 文法に従ってカンマ区切りリストを 構文解析するは、 通常、他の仕様が呼び出したい構文解析アルゴリズムのすべてである。 残りの構文解析アルゴリズムは、主として [CSSOM] および関連する「CSS 構造を明示的に構築する」場合を意図している。 他のアルゴリズムのいずれかを使用する必要があると思う場合は、 まず CSSWG に助言を求めること。

input と CSS grammar 生成規則が与えられたとき、 CSS 文法に従って何かを構文解析する (単に構文解析するともいう)には:
  1. input を正規化し、 input をその結果に設定する。
  2. input からコンポーネント値のリストを構文解析し、 戻り値を result とする。
  3. result を grammar と照合する。 成功した場合、 一致した結果を返す。 それ以外の場合、失敗を返す。

5.4.2. CSS 文法に従ってカンマ区切りリストを構文解析する

カンマを含む文法に従って値を構文解析することはもちろん可能だが、 値のいずれかの部分が構文解析に失敗すると、 全体が構文解析されず、 失敗を返す。

それが望ましい場合もある (リスト値の CSS プロパティなど)。 一方で、 値のカンマ区切りの各部分を個別に構文解析し、 正常に構文解析された部分をある方法で処理し、 構文解析に失敗した部分を別の方法で処理する方がよい場合もある (通常はそれらを無視する。 例えば <img sizes>)。

このアルゴリズムは、まさにそれを実現するための簡単なフックを提供する。 「トップレベル」のカンマで分割された値のリストを返し、 各値は失敗 (構文解析に失敗した場合) または構文解析の結果 (構文解析アルゴリズムで説明される 未規定の構造)のいずれかとなる。

input と CSS grammar 生成規則が与えられたとき、 CSS 文法に従ってカンマ区切りリストを構文解析する (別名リストを構文解析する)には:
  1. input を正規化し、 input をその結果に設定する。
  2. input が<whitespace-token>のみを含む場合、 空のリストを返す。
  3. input からコンポーネント値のカンマ区切りリストを 構文解析し、 戻り値を list とする。
  4. list の各 item について反復し、 item を、 grammar を使用して item を構文解析した結果に 置き換える。
  5. list を返す。

5.4.3. スタイルシートを構文解析する

任意のurl location が与えられたとき、 input からスタイルシートを構文解析するには:
  1. input がスタイルシートのバイトストリームである場合、 input からバイトを復号し、 input をその結果に設定する。
  2. input を正規化し、 input をその結果に設定する。
  3. 新しいスタイルシートを作成し、 その場所を location に設定する (location が渡されなかった場合は null)。
  4. input からスタイルシートの内容を消費し、 スタイルシートの規則をその結果に設定する。
  5. スタイルシートを返す。

5.4.4. スタイルシートの内容を構文解析する

input からスタイルシートの 内容を構文解析するには:
  1. input を正規化し、 input をその結果に設定する。
  2. input からスタイルシートの内容を消費し、 その結果を返す。

5.4.5. ブロックの内容を構文解析する

input からブロックの 内容を構文解析するには:
  1. input を正規化し、 input をその結果に設定する。
  2. input からブロックの内容を消費し、 その結果を返す。

5.4.6. 規則を構文解析する

input から規則を構文解析するには:
  1. input を正規化し、 input をその結果に設定する。
  2. input から空白を破棄する。
  3. input の次のトークンが<EOF-token>である場合、 構文エラーを返す。

    それ以外の場合、 input の次のトークンが<at-keyword-token>であれば、 input からat 規則を消費し、 戻り値を rule とする。

    それ以外の場合、 input から修飾規則を消費し、 戻り値を rule とする。 何も返されなかった場合、または無効な規則エラーが返された場合、 構文エラーを返す。

  4. input から空白を破棄する。
  5. input の次のトークンが<EOF-token>である場合、 rule を返す。 それ以外の場合、構文エラーを返す。

5.4.7. 宣言を構文解析する

注: 「宣言のリストを構文解析する」とは異なり、 これは宣言のみを構文解析し、at 規則は構文解析しない。

input から宣言を 構文解析するには:
  1. input を正規化し、 input をその結果に設定する。
  2. input から空白を破棄する。
  3. input から宣言を 消費する。 何かが返された場合、それを返す。 それ以外の場合、構文エラーを返す。

5.4.8. コンポーネント値を構文解析する

input からコンポーネント 値を構文解析するには:
  1. input を正規化し、 input をその結果に設定する。
  2. input から空白を破棄する。
  3. input が空である場合、 構文エラーを返す。
  4. input からコンポーネント値を消費し、 戻り値を value とする。
  5. input から空白を破棄する。
  6. input が空である場合、 value を返す。 それ以外の場合、 構文エラーを返す。

5.4.9. コンポーネント値のリストを構文解析する

input からコンポーネント値の リストを構文解析するには:
  1. input を正規化し、 input をその結果に設定する。

  2. input からコンポーネント値のリストを消費し、 その結果を返す。

5.4.10. コンポーネント値のカンマ区切りリストを構文解析する

input からコンポーネント値のカンマ区切りリストを構文解析するには:
  1. input を正規化し、 input をその結果に設定する。

  2. groups を空のリストとする。

  3. input が空でない間:

    1. input からコンポーネント 値のリストを消費し、 <comma-token>を停止トークンとして、 その結果を groups に追加する。

    2. input からトークンを破棄する。

  4. groups を返す。

5.5. パーサーアルゴリズム

次のアルゴリズムがパーサーを構成する。 これらは上記のパーサーエントリーポイントから呼び出され、 通常、他の仕様から直接呼び出すべきではない。

CSS の構文解析では大文字と小文字が区別され、 特定の文脈における構成要素の有効性の確認は、 少なくとも一部の状況では構文解析中に行わなければならないことに注意すること。 この仕様は意図的に、 有効性の確認を可能にするために十分な文脈を どのように受け渡すべきかを規定しない。

5.5.1. スタイルシートの内容を消費する

トークンストリーム input からスタイルシートの 内容を消費するには:

rules を、初期状態では空の規則のリストとする。

input を処理する:

<whitespace-token>
input からトークンを破棄する。
<EOF-token>
rules を返す。
<CDO-token>
<CDC-token>
input からトークンを破棄する。
これは何のためか?

CSS が初めて導入された当時、 style 要素は古いブラウザーによって 未知の要素として扱われていた。 これらのレガシーブラウザーで その内容がページに表示されることを避けるため、 スタイルシートを HTML コメントで 囲むことが一般的になり、 新しいブラウザーは単に HTML コメント構文を無視していた。 この要件は、 数十年後の現在まで引き継がれている。

同じ慣行は script 要素でも行われ、 HTML コメント構文は同じ理由から JS で 行コメント(// と同様)として扱われる。

<at-keyword-token>
input からat 規則を消費する。 何かが返された場合、 それを rules に追加する。
その他
input から修飾 規則を消費する。 規則が返された場合、 それを rules に追加する。

5.5.2. at 規則を消費する

任意の bool nested(デフォルトは false)が与えられたとき、 トークンストリーム input からat 規則を消費するには:

表明: 次のトークンは<at-keyword-token>である。

input からトークンを消費する。 rule を、名前が返されたトークンの値に設定され、 前置部が初期状態では空のリストに設定され、 宣言も子規則も持たない新しいat 規則とする。

input を処理する:

<semicolon-token>
<EOF-token>
input からトークンを破棄する。 rule が現在の文脈で有効であれば、 それを返す。 それ以外の場合は何も返さない。
<}-token>
nested が true の場合:
  • rule が現在の文脈で有効であれば、 それを返す。

  • それ以外の場合は何も返さない。

それ以外の場合、トークンを消費し、 その結果を rule の前置部に追加する。

<{-token>
input からブロックを消費し、 その結果を rule の子規則に代入する。

注: 結果に 宣言のリストが含まれる場合、 CSSOM でそれらをどのように具現化するかは 規則によって異なる。 すべてをネストされた宣言規則に変換するものもあれば、 すべてを宣言として扱うものもあり、 最初の項目を残りとは異なる方法で扱うものもある。

rule が現在の文脈で有効であれば、 それを返す。 それ以外の場合は何も返さない。

その他
input からコンポーネント値を消費する。 返された値を rule の前置部に追加する。

5.5.3. 修飾規則を消費する

任意のトークン stop token および任意の bool nested(デフォルトは false)が与えられたとき、 トークンストリーム input から修飾 規則を消費するには:

rule を、新しい修飾規則とし、 その前置部、宣言、および子規則を すべて初期状態では空のリストに設定する。

input を処理する:

<EOF-token>
stop token(渡された場合)
これは構文解析エラーである。 何も返さない。
<}-token>
これは構文解析エラーである。 nested が true の場合、 何も返さない。 それ以外の場合、 トークンを消費し、 その結果を rule の前置部に追加する。
<{-token>
rule の前置部の最初の 2 つの非<whitespace-token>値が、 値が "--" で始まる<ident-token>と、 その後に続く<colon-token>である場合、次を行う:
この確認は何のためか?

宣言と修飾規則は、 許可される構文が通常重複しない。 現在定義されている CSS プロパティでは、その値に {} ブロックを使用できないため、 foo:bar {}; は確実に規則であり、 foo: bar; は確実にプロパティである。 将来の CSS プロパティがその値に {} ブロックを許可するとしても、 許可される構文では {} ブロックが値全体となるよう制限され、 例えば foo: {...}; のようになる。 これは有効な規則にはならないことが保証される。 : の後に ident または関数が続かず、 疑似クラスであることを示さないためである。

これにより、宣言と規則を同じ文脈で混在させることができる: まず何かを宣言として構文解析しようとし、 それが有効な宣言にならなければ、 代わりに規則として再構文解析する。 誤って無効になった宣言は、代わりに規則として構文解析されるが、 それで問題ない: パーサーは宣言の終端セミコロンで停止し、 それを無効な規則と見なす。 (または {} ブロックを含むプロパティの場合、 セミコロンの直前で停止し、 それでも無効な規則と見なし、 次に何かを構文解析しようとすると、 単独のセミコロンが無効として破棄される。) したがって、消費されるトークンの総量はいずれの場合も同じである。

ただし、カスタムプロパティの構文は CSSWG によって 慎重に精査されるものではない。 作者は値に {} ブロックを取るカスタムプロパティを 記述でき、 他のものと組み合わせることさえできる。 そのカスタムプロパティが無効になった場合 (例えば、不正に記述された var() 関数による場合)、 規則として再構文解析されると、 {} ブロックのところで早期に停止する。 その後、カスタムプロパティ値の残りのトークンは 新しい構成要素として構文解析され、 予期しない宣言または規則が 作成される可能性がある。

この(確かに非常に特殊な)コーナーケースを避けるため、 カスタムプロパティの構文を 修飾規則の構文から除外する。 プロパティと規則の混在を許可する文脈にいて、 何らかの理由でカスタムプロパティのように見える 規則を構文解析することになった場合、 何かを誤っており、 代わりにカスタムプロパティ全体を (終端セミコロンまで)消費する必要がある。

(プロパティを許可しない文脈にいる場合、 規則がカスタムプロパティのように見えれば 単にそれを破棄する。 これにより、--foo:hover { color: blue; } が どこでも一貫して無効となり、 存在しない終端セミコロンを探して スタイルシートの大量の部分を消費する可能性を回避する。)

それ以外の場合、input からブロックを 消費し、 その結果を child rules とする。 child rules の最初の項目が宣言のリストである場合、 それを child rules から削除し、 rule の宣言に代入する。 child rules に残っている項目のいずれかが宣言のリストである場合、 それらを、そのリストのみを子として含む ネストされた宣言規則に置き換える。 child rules を rule の子規則に代入する。

rule が現在の文脈で有効であれば、 それを返す。 それ以外の場合は無効な規則エラーを返す。

テスト
その他
input からコンポーネント値を消費する。 その結果を rule の前置部に追加する。
テスト

5.5.4. ブロックを消費する

トークンストリーム input からブロックを消費するには:

表明: 次のトークン は<{-token>である。

input からトークンを破棄する。 input からブロックの 内容を消費する。 その結果を rules とする。 input からトークンを破棄する。

rules を返す。

5.5.5. ブロックの内容を消費する

トークンストリーム input からブロックの 内容を消費するには:

注: このアルゴリズムは、 規則および宣言のリストから成るリストを返す。 親の文脈に応じて、 宣言のリストは、 CSSOM で、 CSSStyleDeclaration または CSSNestedDeclarations 規則のいずれかとして具現化されることがある。

rules を空のリストとし、 規則 または宣言のリストのいずれかを含むものとする。

decls を宣言の空のリストとする。

input を処理する:

<whitespace-token>
<semicolon-token>
input からトークンを破棄する。
<EOF-token>
<}-token>
rules を返す。
<at-keyword-token>
decls が空でない場合、 それを rules に追加し、 decls を宣言の新しい空のリストに設定する。

input からat 規則を消費し、 nested を true に設定する。 規則が返された場合、 それを rules に追加する。

その他
input をマークする。

input から宣言を 消費し、 nested を true に設定する。 宣言が 返された場合、 それを decls に追加し、 input からマークを破棄する。

それ以外の場合、input からマークを復元し、 次に input から修飾規則を消費し、 nested を true に設定し、 <semicolon-token>を stop token とする。

何も返されなかった場合

何もしない

無効な規則エラーが返された場合

decls が空でない場合、 decls を rules に追加し、 decls を宣言の新しい空のリストに設定する。 (それ以外の場合は何もしない。)

規則が 返された場合

decls が空でない場合、 decls を rules に追加し、 decls を宣言の新しい空のリストに設定する。 規則を rules に追加する。

実装注記

この仕様は、多くの CSS 仕様と同様に、 効率性よりも 理解しやすさを優先して記述されている。 多くのアルゴリズム、 特に上記の「宣言として構文解析し、その後規則として構文解析する」という動作は、 説明どおりに素朴に実装すると かなり非効率になる可能性がある。

ただし、この動作は、 可能な限り「早期終了」を可能にするよう慎重に記述されている。 特に、 おおよそ終了可能になる順に挙げると:

同様に、 構文解析要件は、 構文解析中に宣言の文法を確認することに依存するよう 規定されているが、 汎用 CSS 構文の上に CSS 以外の言語を実装しようとする汎用プロセッサーでも、 宣言が ident、コロンで始まり、 その後に {} ブロックのみを含むか、 {} ブロックをまったく含まないことだけを確認すればよい。 foo:hover ... {} のような場合には、 最初のトークンで早期終了できないため、 文法を知る実装より 構文解析に少し余分な時間がかかるだけである。

テスト

5.5.6. 宣言を消費する

任意の bool nested(デフォルトは false)が与えられたとき、 トークンストリーム input から宣言を 消費するには:

decl を新しい宣言とし、 名前は初期状態では空で、 値は空のリストに設定する。

  1. 次のトークンが<ident-token>である場合、 input からトークンを消費し、 decl の名前を そのトークンの値に設定する。

    それ以外の場合、 input から不正な 宣言の残りを消費し、 nested を使用し、 何も返さない。

  2. input から空白を破棄する。
  3. 次のトークンが<colon-token>である場合、 input からトークンを破棄する。

    それ以外の場合、 input から不正な 宣言の残りを消費し、 nested を使用し、 何も返さない。

  4. input から空白を破棄する。
  5. nested を使用し、 <semicolon-token>を停止トークンとして、 input からコンポーネント値のリストを消費し、 その結果を decl の値に設定する。
  6. decl の値にある最後の 2 つの非<whitespace-token>が、 値が "!" の<delim-token>と、 その後に続く、値が "important" とASCII 大文字・小文字を区別せず一致する<ident-token>である場合、 それらを decl の値から削除し、 decl の important フラグを設定する。
  7. decl の値の最後の項目が<whitespace-token>である間、 そのトークンを削除する。
  8. decl の名前がカスタムプロパティ名文字列である場合、 decl の original text を、 decl の値のトークンに 対応する元のソーステキスト文字列の セグメントに設定する。

    それ以外の場合、decl の値に、関連付けられたトークンが <{-token>であるトップレベルの単純ブロック が含まれ、さらにその他の任意の非<whitespace-token>値も含まれる場合、 何も返さない。 (つまり、トップレベルの {} ブロックが許可されるのは、 非カスタムプロパティの値全体である場合だけである。)

    それ以外の場合、decl の名前が "unicode-range" とASCII 大文字・小文字を区別せず一致する場合、 コンポーネント値のリストを消費する呼び出しによって 返されたトークンに 対応する元のソーステキスト文字列のセグメントから unicode-range 記述子の 値を消費し、 decl の値をその結果で置き換える。

    テスト
  9. decl が現在の文脈で有効であれば、 それを返す。 それ以外の場合は何も返さない。
bool nested が与えられたとき、 トークンストリーム input から不正な宣言の残りを消費するには:

input を処理する:

<eof-token>
<semicolon-token>

input からトークンを破棄し、 何も返さない。

<}-token>

nested が true の場合、 何も返さない。 それ以外の場合、 トークンを破棄する。

その他

input からコンポーネント値を消費し、 何もしない。

5.5.7. コンポーネント値のリストを消費する

任意のトークン stop token および任意の boolean nested(デフォルトは false)が与えられたとき、 トークンストリーム input からコンポーネント値の リストを消費するには:

values をコンポーネント値の空のリストとする。

input を処理する:

<eof-token>
stop token(渡された場合)

values を返す。

<}-token>

nested が true の場合、 values を返す。

それ以外の場合、 これは構文解析エラーである。 input からトークンを消費し、 その結果を values に追加する。

その他

input からコンポーネント値を消費し、 その結果を values に追加する。

テスト

5.5.8. コンポーネント値を消費する

トークンストリーム input からコンポーネント 値を消費するには:

input を処理する:

<{-token>
<[-token>
<(-token>

input から単純 ブロックを消費し、 その結果を返す。

<function-token>

input から関数を 消費し、 その結果を返す。

その他

input からトークンを消費し、 その結果を返す。

5.5.9. 単純ブロックを消費する

トークンストリーム input から単純 ブロックを消費するには:

表明: input の次のトークンは、 <{-token>、 <[-token>、 または<(-token>である。

ending token を次のトークンの対になる変種とする。 (例えば、<[-token>を指定して呼び出された場合、 ending token は<]-token>である。)

block を新しい単純 ブロックとし、 関連付けられたトークンを次のトークンに設定し、 値を初期状態では空のリストに設定する。

input からトークンを破棄する。

input を処理する:

<eof-token>
ending token

input からトークンを破棄する。 block を返す。

その他

input からコンポーネント値を消費し、 その結果を block の値に追加する。

5.5.10. 関数を消費する

トークンストリーム input から関数を 消費するには:

表明: 次のトークンは<function-token>である。

input からトークンを消費し、 function を、名前が返されたトークンの値と等しい新しい関数とし、 値を空のリストに設定する。

input を処理する:

<eof-token>
<)-token>

input からトークンを破棄する。 function を返す。

その他

input からコンポーネント値を消費し、 その結果を function の値に追加する。

5.5.11. unicode-range 値を消費する

文字列 input string からunicode-range 記述子の値を消費するには:

  1. tokens を、unicode ranges allowed を true に設定して input string をトークン化した結果とする。

  2. tokens からコンポーネント値のリストを消費し、 その結果を返す。

注: このアルゴリズムが存在するのは、 初期の CSS における設計上の誤りによるものである。 決して再現すべきではない。

6. An+B マイクロ構文

CSS のいくつかのもの、 例えば :nth-child() 疑似クラスでは、 リスト内のインデックスを示す必要がある。 An+B マイクロ構文はこれに有用であり、 作者が単一の要素、 またはリスト内で一定間隔にあるすべての要素を簡単に示せる。

An+B 表記は、整数の ステップ(A)とオフセット(B)を定義し、 n の各正の整数または 0 の値について、 リスト内の An+B 番目の要素を表し、 リストの最初の要素のインデックスは 1(0 ではない)である。

A と B の値が 0 より大きい場合、 これは実質的にリストを A 個の要素のグループに分割し、 (最後のグループは余りを取る)、 各グループの B 番目の要素を選択する。

An+B 表記は、even および odd キーワードも受け入れ、 それぞれ 2n および 2n+1 と同じ意味を持つ。

例:

2n+0   /* リスト内のすべての偶数番目の要素を表す */
even   /* 同じ */
4n+1   /* リスト内の 1 番目、5 番目、9 番目、13 番目などの要素を表す */

A と B の値は負にもできるが、 n ≥ 0 に対する An+B の正の結果だけが 使用される。

例:

-1n+6   /* リストの最初の 6 要素を表す */
-4n+10  /* リストの 2 番目、6 番目、10 番目の要素を表す */

A と B が両方とも 0 の場合、 疑似クラスはリスト内のどの要素も表さない。

6.1. 非形式的な構文の説明

この節は非規範的である。

A が 0 の場合、An 部分は省略できる (B 部分がすでに省略されている場合を除く)。 An が含まれておらず、 B が負でない場合、 B の前の+ 記号も(許可されている場合) 省略できる。 この場合、構文は単に B に簡略化される。

例:

0n+5   /* リスト内の 5 番目の要素を表す */
5      /* 同じ */

A が 1 または -1 の場合、 規則から 1 を省略できる。

例:

したがって、次の表記は同等である:

1n+0   /* リスト内のすべての要素を表す */
n+0    /* 同じ */
n      /* 同じ */

B が 0 の場合、A 番目ごとの要素が選択される。 この場合、 A 部分がすでに省略されていない限り、 +B(または -B)部分を省略できる。

例:

2n+0   /* リスト内の偶数番目の各要素を表す */
2n     /* 同じ */

B が負の場合、そのマイナス記号が+ 記号に置き換わる。

有効な例:

3n-6

無効な例:

3n + -6

An と B の両方が存在する場合、それらを区切る+ または - の いずれの側にも空白が許可される。

空白を含む有効な例:

3n + 1
+3n - 2
-n+ 6
+6

空白を含む無効な例:

3 n
+ 2n
+ 2

6.2. <a-n-plus-b> 型

An+B 表記は元々、CSS の他の部分とはわずかに異なるトークナイザーを使用して定義されており、 CSS、 そのため CSS トークンの観点から表現すると、やや奇妙な定義になる。 この節では、CSS トークンの観点から An+B 表記を認識する方法 (したがって、CSS 文法の目的で <a-n-plus-b> 型を定義する)、 および A と B の値を得るために CSS トークンを解釈する方法を説明する。

テスト

<a-n-plus-b> 型は、 (Values & Units 仕様の値定義構文を使用して) 次のように定義される:

<a-n-plus-b> =
  odd | even |
  <integer> |

  <n-dimension> |
  '+'?† n |
  -n |

  <ndashdigit-dimension> |
  '+'?† <ndashdigit-ident> |
  <dashndashdigit-ident> |

  <n-dimension> <signed-integer> |
  '+'?† n <signed-integer> |
  -n <signed-integer> |

  <ndash-dimension> <signless-integer> |
  '+'?† n- <signless-integer> |
  -n- <signless-integer> |

  <n-dimension> ['+' | '-'] <signless-integer> |
  '+'?† n ['+' | '-'] <signless-integer> |
  -n ['+' | '-'] <signless-integer>

ここで:

†: 上記で印を付けた場合のように、プラス記号 (+) が "n" で始まる ident の前にある場合、 2 つのトークンの間に空白があってはならず、 そうでなければトークンは上記の文法に一致しない。 その他の任意の 2 つのトークン間では空白は有効である(かつ無視される)。

生成規則の各節は次のように解釈される:

odd
A は 2、B は 1。
even
A は 2、B は 0。
<integer>
A は 0、B は整数の値。
<n-dimension>
'+'? n
-n
A は、それぞれ dimension の値、1、または -1。 B は 0。
<ndashdigit-dimension>
'+'? <ndashdigit-ident>
A は、それぞれ dimension の値または 1。 B は、それぞれ dimension の単位または ident の値であり、 最初のコードポイントを削除し、残りを 10 進数として解釈する。 B は負である。
<dashndashdigit-ident>
A は -1。 B は ident の値であり、最初の 2 つのコードポイントを削除し、 残りを 10 進数として解釈する。 B は負である。
<n-dimension> <signed-integer>
'+'? n <signed-integer>
-n <signed-integer>
A は、それぞれ dimension の値、1、または -1。 B は整数の値。
<ndash-dimension> <signless-integer>
'+'? n- <signless-integer>
-n- <signless-integer>
A は、それぞれ dimension の値、1、または -1。 B は整数値の符号を反転したもの。
<n-dimension> ['+' | '-'] <signless-integer>
'+'? n ['+' | '-'] <signless-integer>
-n ['+' | '-'] <signless-integer>
A は、それぞれ dimension の値、1、または -1。 B は整数の値。 2 つの間に '-' が指定された場合、B は代わりに 整数値の符号を反転したものとなる。

7. 規則およびその他の値の文法の定義

CSS Values 4 § 2 値定義 構文は、プロパティおよびその他の CSS 構文構造の文法を指定する方法を定義する。

テスト

7.1. ブロック内容の定義: <block-contents>、<declaration-list>、<qualified-rule-list>、<declaration-rule-list>、および <rule-list> 生成規則

CSS パーサーはブロックの内容を区別しない—​すべて同じ アルゴリズムで構文解析され、 どの構成要素が有効かという点だけで区別される。

規則の文法を記述する際、 <block-contents> は、この区別しない構文解析を表す。 ブロック内の唯一の値としてのみ使用しなければならず、 ブロックが含められるものに暗黙の制限が 課されないことを表す。

付随する文章は、この文脈で何が有効で何が無効かを定義しなければならない。 宣言が有効であり、 かつプロパティ宣言である場合、 カスケードと相互作用するかどうかを定義しなければならない。 相互作用する場合、その詳細度と !important の使用方法を定義しなければならない。

ただし、多くの場合、 ブロックは特定の型のいかなる構成要素も有効には含められない。 これらの場合をより明示的に表すため、 次の生成規則を使用できる

これらはすべて構文解析の点では<block-contents>と完全に同等だが、 付随する文章で有効性を定義する必要があるのは、 自動的に無効とならないカテゴリについてだけである。

各種生成規則の例:
例えば、@font-face の文法は次のように記述できる:
<@font-face> = @font-face { <declaration-list> }

そして、付随する文章でブロック内で許可される有効な記述子 を定義する。

@keyframes の文法は次のように記述できる:

<@keyframes> = @keyframes { <qualified-rule-list> }
<keyframe-rule> = <keyframe-selector> { <declaration-list> }

そして、付随する文章で<keyframe-rule>のみが @keyframes内で許可されること、 また <keyframe-rule> がすべてのアニメーション可能な CSS プロパティと、 animation-timing-function プロパティを受け入れるが、 カスケードとは相互作用しないことを定義する。

7.2. 任意の内容の定義: <declaration-value> および <any-value> 生成規則

一部の文法では、 文法内で妥当な任意の入力を受け入れ、 内容に対してより具体的なエラー処理を手動で行うことが有用である (文法の不一致で通常行われるように、 単に構成要素全体を無効化するのではなく)。

例えば、カスタム プロパティは妥当な任意の値を許可する。 他の CSS プロパティの任意の断片を含むことができ、 または既存の CSS にまったく含まれないものに使用できるためである。 別の例として、Media Queries の<general-enclosed> 生成規則は、 将来の MQ 構文が許可する範囲を定義し、 「未知」の値を処理するために特別なロジックを使用する。

これを支援するため、2 つの追加の生成規則を定義する:

<declaration-value> 生成規則は、1 個以上のトークンからなる任意のシーケンスに一致する。 ただし、そのシーケンスに <bad-string-token>、 <bad-url-token>、 対応していない<)-token>、<]-token>、または<}-token>、 またはトップレベルの<semicolon-token>トークン、あるいは値が "!" の<delim-token>トークンを含んではならない。 これは、有効な宣言がその値として持てるものすべてを表す。

<any-value> 生成規則は<declaration-value>と同一だが、 トップレベルの<semicolon-token>トークン および値が "!" の<delim-token>トークンも許可する。 これは、任意の文脈で有効な CSS となり得るものすべてを表す。

8. CSS スタイルシート

CSS スタイルシートを 構文解析するには、 まずスタイルシートを 構文解析する。 得られたトップレベルの修飾規則をすべて、以下で定義するスタイル規則として解釈する。

スタイル規則が無効である場合、 または at 規則が認識されないか、その文法または文脈に従って無効である場合、 それは構文解析エラーである。 その規則を破棄する。

8.1. スタイル規則

スタイル規則は修飾規則であり、 セレクターリストを プロパティ宣言のリスト および場合によってはネストされた規則のリストに関連付ける。 これらは、 規則集合とも[CSS2]では呼ばれる。 CSS Cascading and Inheritance [CSS-CASCADE-3]は、スタイル規則内の宣言が カスケードにどのように参加するかを定義する。

修飾規則の前置部は、 構文解析され、 <selector-list>として扱われる。 これが失敗を返した場合、 スタイル規則全体が無効となる。

修飾規則のブロックの内容は<declaration-list>として構文解析される。 このブロック内の修飾規則もスタイル規則である。 他の仕様またはこの仕様の将来のレベルで別途定義されない限り、 そのリスト内の at 規則は無効 であり、無視しなければならない。

注: [CSS-NESTING-1]は、条件付きグループ規則 およびその他の一部のat 規則が、 スタイル規則内で許可されることを定義する。

未知の CSS プロパティの宣言、 または値がそのプロパティで定義された構文に一致しない宣言は無効であり、 無視しなければならない。 スタイル規則の内容の有効性は、スタイル規則自体の有効性には影響しない。 別途指定されない限り、プロパティ名はASCII 大文字・小文字を区別しない。

注: Custom Properties [CSS-VARIABLES]の名前は 大文字と小文字が区別される。

CSS スタイルシートのトップレベルにある修飾規則はスタイル 規則である。 他の文脈にある修飾規則は、スタイル規則である場合もない場合もあり、 それは文脈によって定義される。

例えば、@media 規則 [CSS3-CONDITIONAL]内の修飾規則は スタイル規則だが、 @keyframes 規則 [CSS3-ANIMATIONS]内の修飾規則はそうではない。

8.2. at 規則

at 規則は at-keyword で始まる規則であり、 したがって同じ文脈のスタイル 規則と区別できる。

at 規則は次の目的に使用される:

at 規則は、具体的な規則とその目的に応じて多くの形式を取るが、 大まかには 2 種類ある: セミコロンで終わる、より単純な構造である 文 at 規則と、 ネストされた修飾規則、at 規則、または宣言を含むことのできる{} ブロックで 終わるブロック at 規則。

ブロック at 規則は通常、 (汎用またはat 規則固有の) at 規則、修飾規則、および/または記述子宣言の集合を含み、 at 規則によって定義された制限に従う。 記述子はプロパティに似ており、 (同じ構文で宣言される) ただしツリー内の要素やボックスではなく、 特定の型のat 規則に関連付けられる。

8.3. @charset 規則

スタイルシートのフォールバックエンコーディングを決定するために使用されるアルゴリズムは、 ファイルの最初の数バイトとして特定のバイトシーケンスを探し、 それは "@charset" という名前のat 規則の構文形式を持つ。

テスト

ただし、実際には @charset という名前のat 規則は存在しない。 スタイルシートが実際に構文解析される際、 @charset 規則の出現はすべて、認識されない規則として扱わなければならず、 したがってスタイルシートの文法が確認される際に無効として破棄される。

注: CSS 2.1 では、@charset は有効な規則だった。 一部のレガシー仕様では、今でも @charset 規則を参照し、 スタイルシート内に存在することを明示的に述べている場合がある。

テスト

9. シリアル化

この仕様で説明するトークナイザーは、コメント用のトークンを生成せず、 その他の方法でもコメントを保持しない。 実装は、コメントの内容とトークンストリーム内での位置を保持してもよい。 その場合、この保持された情報は構文解析ステップに影響してはならない。

この仕様は、一般に CSS をどのようにシリアル化するかを定義せず、 その作業を[CSSOM]および個々の機能仕様に委ねる。 特に、コメントと空白のシリアル化は定義されない。

シリアル化に対する唯一の要件は、構文解析との「ラウンドトリップ」が可能でなければならないことであり、 すなわち、スタイルシートを構文解析した場合と、 構文解析、シリアル化、再度の構文解析を行った場合とで、同じデータ構造が生成されなければならない。 ただし連続する<whitespace-token>は例外で、 単一のトークンにまとめてもよい。

注: CSS 文法では、任意の量の空白を常に単一の空白と同一に解釈するため、 この例外が存在できる。

この要件を満たすには:
ident function url bad url - number percentage dimension CDC ( * %
ident ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗
at-keyword ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗
hash ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗
dimension ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗
# ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗
- ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗
number ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗ ✗
@ ✗ ✗ ✗ ✗ ✗ ✗
. ✗ ✗ ✗
+ ✗ ✗ ✗
/ ✗
テスト

9.1. <a-n-plus-b> のシリアル化

整数値 A および B を用いて、 <a-n-plus-b> 値をシリアル化するには:
  1. A が 0 の場合、 B のシリアル化を返す。

  2. それ以外の場合、result を初期状態で空の文字列とする。

  3. A が 1

    "n" を result に追加する。

    A が -1

    "-n" を result に追加する。

    A が 0 ではない

    A をシリアル化して result に追加し、 次に "n" を result に追加する。

  4. B が 0 より大きい

    "+" を result に追加し、 次に B のシリアル化を result に追加する。

    B が 0 より小さい

    B のシリアル化を result に追加する。

  5. result を返す。

10. プライバシーに関する考慮事項

この仕様は、新たなプライバシー上の懸念を導入しない。

11. セキュリティに関する考慮事項

この仕様では CSS の構文解析がすべての入力について曖昧さなく定義されるため、セキュリティが向上する。

ホワイトリスト/フィルターなどの古いパーサーが、この仕様とは異なる方法で構文解析する範囲において、 それらは多少安全でない。 しかし以前の構文解析仕様には、ブラウザーが異なる方法で解釈する 曖昧なコーナーケースが多数残されていたため、 それらのフィルターはすでに潜在的に安全でなく、 この仕様は状況を悪化させない。

12. 変更点

この節は非規範的である。

12.1. 2021 年 12 月 24 日の候補勧告草案からの変更点

次の実質的な変更が行われた:

12.2. 2019 年 8 月 16 日の候補勧告からの変更点

次の実質的な変更が行われた:

次の編集上の変更が行われた:

12.3. 2014 年 2 月 20 日の候補勧告からの変更点

次の実質的な変更が行われた:

次の編集上の変更が行われた:

コメント処理一覧を 利用できる。

12.4. 2013 年 11 月 5 日の最終草案からの変更点

12.5. 2013 年 9 月 19 日の作業草案からの変更点

12.6. CSS 2.1 および Selectors Level 3 からの変更点

注: この仕様の目的は現実に一致させることである。 CSS2.1 からの変更は、ほぼ常に CSS 2.1 が実際のブラウザー の動作と一致しないものを規定していたか、 何かを未規定のまま残していたことによる。 何らかの詳細がブラウザーと一致しない場合、 ほぼ確実に意図したものではないため、 知らせてほしい。

バイトストリームからの復号に関する変更:

トークン化の変更:

構文解析の変更:

Selectors Level 3 [SELECT]からの An+B の変更:

謝辞

フィードバックおよび貢献を寄せてくれた Anne van Kesteren、 David Baron、 Elika J. Etemad (fantasai)、 Henri Sivonen、 Johannes Koch、 呂康豪 (Kang-Hao Lu)、 Marc O’Morain、 Raffaello Giulietti、 Simon Pieter、 Tyler Karaszewski、 および Zack Weinberg に感謝する。

適合性

文書の表記規約

適合性要件は、 記述的な表明と 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 レンダラーは 必ず 使用可能なレベルのサポートを持たない at 規則、プロパティ、プロパティ値、キーワードを無効として扱い(かつ 適切に 無視し)、 その他の構文構造についても同様に扱わなければならない。特に、ユーザーエージェントは 決して 単一の複数値プロパティ宣言内で、サポートされないコンポーネント値を選択的に 無視し、サポートされる値だけを尊重してはならない。いずれかの値が無効と見なされる場合、 (サポートされない値はそう見なされなければならない)、CSS では宣言全体を 無視することが要求される。

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

将来の安定した CSS 機能との衝突を避けるため、 CSSWG は、CSS の 不安定な機能および 独自拡張の実装について、 ベストプラクティスに従うことを推奨する。

非実験的な実装

仕様が候補勧告段階に到達すると、 非実験的な実装が可能になり、実装者は、 仕様に従って正しく実装されていることを実証できる CR レベルの機能について、 接頭辞なしの実装をリリースするべきである。

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

テストケースおよび実装レポートの提出に関する詳細情報は、 CSS ワーキンググループの Web サイト https://www.w3.org/Style/CSS/Test/ で確認できる。 質問は、 public-css-testsuite@w3.org メーリングリストに送ること。

CR 終了基準

この仕様が提案勧告へ進むためには、 各機能について少なくとも 2 つの独立した相互運用可能な実装が 存在しなければならない。各機能は異なる製品の組み合わせによって実装されてもよく、 すべての機能を単一の製品が実装する必要はない。この基準のため、 次の用語を定義する:

独立している
各実装は、 異なる主体によって開発されなければならず、別の適格な実装で使用されるコードを 共有、再利用、または派生してはならない。この仕様の実装に 関係しないコード部分は、 この要件の対象外である。
相互運用可能
公式 CSS テストスイート内の 該当するテストケースに合格すること、または実装が Web ブラウザーでない場合は同等のテストに合格すること。相互運用性を主張するためにそのようなユーザー エージェント(UA)を使用する場合、テスト スイート内の関連する各テストについて同等のテストを作成するべきである。さらに、 そのような UA を相互運用性の主張に使用する場合、 相互運用性の目的で、 同じ方法でそれらの同等のテストに合格できる 1 つ以上の追加の UA が 存在しなければならない。同等のテストは、 ピアレビューのために公開されなければならない。
実装
次の条件を満たすユーザーエージェント:
  1. 仕様を実装している。
  2. 一般に公開されている。実装は、 出荷製品またはその他の一般公開されたバージョン (例えば、ベータ版、プレビューリリース、または "nightly build")であってよい。 非出荷製品のリリースは、安定性を 実証するため、その機能を少なくとも 1 か月間 実装していなければならない。
  3. 実験的ではない(すなわち、テストスイートに合格することを目的として特別に設計され、 今後の通常利用を意図していない バージョンではない)。

この仕様は少なくとも 6 か月間、候補勧告のままとなる。

索引

この仕様で定義される 用語

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

参考文献

規範的参考文献

[CSS-CASCADE-3]
Elika Etemad; Tab Atkins Jr.. CSS カスケーディングと 継承 レベル 3. 2021 年 2 月 11 日. REC. URL: https://www.w3.org/TR/css-cascade-3/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS カスケーディングと継承 レベル 5. 2022 年 1 月 13 日. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-COUNTER-STYLES-3]
Tab Atkins Jr.. CSS カウンタースタイル レベル 3. 2021 年 7 月 27 日. CR. URL: https://www.w3.org/TR/css-counter-styles-3/
[CSS-FONTS-4]
Chris Lilley. CSS Fonts モジュール レベル 4. 2026 年 9 月 13 日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-NESTING-1]
Tab Atkins Jr.. CSS ネストモジュール レベル 1. 2026 年 1 月 22 日. WD. URL: https://www.w3.org/TR/css-nesting-1/
[CSS-PAGE-3]
Elika Etemad. CSS ページメディアモジュール レベル 3. 2023 年 9 月 14 日. WD. URL: https://www.w3.org/TR/css-page-3/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS 構文モジュール レベル 3. 2021 年 12 月 24 日. CRD. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TYPED-OM-1]
Tab Atkins Jr.; François Remy. CSS Typed OM レベル 1. 2024 年 3 月 21 日. WD. URL: https://www.w3.org/TR/css-typed-om-1/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 値と単位 モジュール レベル 4. 2024 年 3 月 12 日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-VARIABLES]
Tab Atkins Jr.. カスケーディング変数用 CSS カスタムプロパティ モジュール レベル 1. 2022 年 6 月 16 日. CR. URL: https://www.w3.org/TR/css-variables-1/
[CSS3-CONDITIONAL]
Chris Lilley; David Baron; Elika Etemad. CSS 条件付き規則モジュール レベル 3. 2024 年 8 月 15 日. CRD. URL: https://www.w3.org/TR/css-conditional-3/
[CSSOM]
Daniel Glazman; Emilio Cobos Álvarez. CSS オブジェクトモデル (CSSOM). 2021 年 8 月 26 日. WD. URL: https://www.w3.org/TR/cssom-1/
[ENCODING]
Anne van Kesteren. Encoding Standard. 現行 標準. URL: https://encoding.spec.whatwg.org/
[HTML]
Ian Hickson. HTML. 現行標準. URL: http://whatwg.org/html
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. 現行標準. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. 要件レベルを示すために RFC で使用する キーワード. 1997 年 3 月. 現行のベストプラクティス. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors レベル 4. 2026 年 1 月 22 日. WD. URL: https://www.w3.org/TR/selectors-4/
[URL]
Anne van Kesteren. URL Standard. 現行標準. URL: https://url.spec.whatwg.org/

非規範的参考文献

[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley; Lea Verou. CSS Color モジュール レベル 4. 2026 年 9 月 26 日. CRD. URL: https://www.w3.org/TR/css-color-4/
[CSS-COLOR-5]
Chris Lilley; Una Kravets; Lea Verou. CSS Color モジュール レベル 5. 2026 年 9 月 13 日. WD. URL: https://www.w3.org/TR/css-color-5/
[CSS-FONTS-5]
Chris Lilley. CSS Fonts モジュール レベル 5. 2026 年 9 月 13 日. WD. URL: https://www.w3.org/TR/css-fonts-5/
[CSS-NAMESPACES-3]
Elika Etemad. CSS 名前空間モジュール レベル 3. 2014 年 3 月 20 日. REC. URL: https://www.w3.org/TR/css-namespaces-3/
[CSS-TEXT-DECOR-3]
Elika Etemad; Koji Ishii. CSS テキスト装飾モジュール レベル 3. 2022 年 5 月 5 日. CRD. URL: https://www.w3.org/TR/css-text-decor-3/
[CSS-TEXT-DECOR-4]
Elika Etemad; Koji Ishii. CSS テキスト装飾モジュール レベル 4. 2022 年 5 月 4 日. WD. URL: https://www.w3.org/TR/css-text-decor-4/
[CSS-TRANSFORMS-1]
Simon Fraser; et al. CSS 変形モジュール レベル 1. 2019 年 2 月 14 日. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSS-VALUES-5]
Tab Atkins Jr.; Elika Etemad; Miriam Suzanne. CSS 値 と単位モジュール レベル 5. 2024 年 11 月 11 日. WD. URL: https://www.w3.org/TR/css-values-5/
[CSS2]
Bert Bos; et al. カスケーディングスタイルシート レベル 2 改訂 1 (CSS 2.1) 仕様. 2011 年 6 月 7 日. REC. URL: https://www.w3.org/TR/CSS2/
[CSS3-ANIMATIONS]
David Baron; et al. CSS アニメーション レベル 1. 2023 年 3 月 2 日. WD. URL: https://www.w3.org/TR/css-animations-1/
[MEDIAQ]
Tab Atkins Jr.; Florian Rivoal. Media Queries レベル 4. 2026 年 2 月 19 日. CRD. URL: https://www.w3.org/TR/mediaqueries-4/
[MEDIAQUERIES-5]
Tab Atkins Jr.; et al. Media Queries レベル 5. 2026 年 2 月 19 日. WD. URL: https://www.w3.org/TR/mediaqueries-5/
[SELECT]
Tantek Çelik; et al. Selectors レベル 3. 2018 年 11 月 6 日. REC. URL: https://www.w3.org/TR/selectors-3/