CSSプロパティおよび値 API レベル 1

W3C作業草案

この文書についての詳細
このバージョン:
https://www.w3.org/TR/2024/WD-css-properties-values-api-1-20240326/
最新公開バージョン:
https://www.w3.org/TR/css-properties-values-api-1/
編集者草案:
https://drafts.css-houdini.org/css-properties-values-api-1/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/css-properties-values-api-1/
フィードバック:
public-houdini@w3.org 件名 “[css-properties-values-api] … メッセージトピック …” (アーカイブ)
GitHub
編集者:
Tab Atkins-Bittner (Google)
以前の編集者:

概要

このCSSモジュールは、新しいCSSプロパティを登録するためのAPIを定義します。このAPIを使用して登録されたプロパティには、型、継承動作、および初期値を定義する構文解析シンタックスが提供されます。

この文書のステータス

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

この文書は CSS作業グループによって 作業草案として 勧告トラックを使用して公開されました。 作業草案としての公開は、W3Cおよびそのメンバーによる支持を示すものではありません。

この文書はドラフトであり、 随時更新、置換、 または他の文書によって廃止される可能性があります。 進行中の作業以外としてこの文書を引用することは適切ではありません。

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

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

この文書はW3C特許ポリシーに基づいて運営されるグループによって作成されました。 W3Cは、グループの成果物に関連して行われた特許開示の公開リストを管理しています。 そのページには特許開示の方法も記載されています。 個人が自分が本質的なクレームを含むと信じる特許について実際に知っている場合には、 W3C特許ポリシー第6節に従って情報を開示する必要があります。

1. はじめに

CSSは、ウェブドキュメントのレイアウト、描画、または動作を変更するために操作できる包括的なプロパティセットを定義しています。しかし、ウェブ著者はこのセットを追加のプロパティで拡張したい場合がよくあります。

[css-variables]は、 ユーザーが制御できるプロパティを定義するための基本的な手段を提供しますが、これらのプロパティは常にトークンリストとして値を取り、必ず継承され、 他のプロパティの値にvar()参照を使って再組み込みされることでのみドキュメントのレイアウトや描画に影響を与えることができます。

この仕様は[css-variables]を拡張し、 型、初期値、継承動作を持つプロパティの登録を可能にします。 これは二つの方法で行えます:

この仕様は[css-paint-api-1][css-layout-api-1]とも補完関係にあり、 これらはカスタムプロパティが描画やレイアウト動作に直接影響を与えることを可能にします。

2. 登録されたカスタムプロパティ

カスタムプロパティ登録されたカスタムプロパティになることができ、 UAが定義したプロパティのように振る舞います。 UAによって構文チェックされるシンタックス、初期値、特定の継承動作を持つことになります。 これは@property規則や registerProperty() JS関数によって行えます。

カスタムプロパティは、Documentに対して、 その名前の有効な@property規則がドキュメントのいずれかのスタイルシートに定義されているか、 またはその名前がドキュメントの[[registeredPropertySet]] スロットに含まれていれば登録されているとみなされます (つまり、registerProperty() が呼び出されて登録された場合です)。

登録されたカスタムプロパティは未登録の カスタムプロパティと同様に動作しますが、 以下に定義する点が異なります。

2.1. 登録の判定

登録されたカスタムプロパティカスタムプロパティ登録を持ち、 それを本物のプロパティのように扱うために必要な全データを含みます。 これは構造体であり、以下から成ります:

もしDocument[[registeredPropertySet]] スロットがそのカスタムプロパティ名を持つレコードを含んでいれば、 登録はそのレコードとなります。

そうでない場合、 Documentの アクティブなスタイルシートにそのカスタムプロパティ名を持つ有効な @property規則が一つ以上あれば、 文書順で最後のものがその登録となります。

それ以外の場合は登録がなく、 カスタムプロパティ登録されたカスタムプロパティではありません。

2.2. 構文解析時の挙動

登録されたカスタムプロパティは未登録の カスタムプロパティと全く同じようにパースされます; ほぼ何でも許可されます。 プロパティの登録された構文は構文解析時にはチェックされません

注: ただし、 構文は算出値時にチェックされ、 var()による代入の前に検証されます。 §2.4 算出値時の挙動を参照してください。

なぜカスタムプロパティは構文チェックされないのか?

ページのCSSをパースする際、 UAは速度やメモリのために様々な最適化を行います。

その最適化の一つは、実際に効果があるプロパティのみを保存することです; 無効なプロパティは破棄され、 同じ宣言ブロック内で複数回同じプロパティが書かれても、 最後の有効なもの以外はすべて破棄されます。 (これはCSSのエラー回復と将来互換性の重要な部分です。)

この動作は、プロパティの構文がページの生存期間中に変化しない場合は問題ありません。 しかし、カスタムプロパティが登録されると構文が変化する可能性があり、 以前は無効だったプロパティが突然有効になることがあります。

これに対応する方法は、最初は無効だった宣言もすべて保存する(ページのメモリコスト増加)か、 新しい構文ルールでページ全体のCSSを再パースする(カスタムプロパティ登録時の処理コスト増加)しかありません。 どちらも望ましくありません。

さらに、 UA定義プロパティの構文はユーザーが見ているUAのバージョンで決まり、 これはページ著者の制御外です。 これこそがCSSのエラー回復動作や複数宣言を書く慣習の理由です。 一方、カスタムプロパティはページ著者が制御でき、 任意のスタイルシートやスクリプトによって構文が決まります; 不確実性がありません。 構文違反のカスタムプロパティを破棄するのは著者の便宜のためだけであり、 UA定義プロパティの場合の必然性はありません。

2.3. 指定値時の挙動

未登録のカスタムプロパティと同様に、 登録されたカスタムプロパティは登録された構文に関わらず、 CSS全体キーワードinheritrevertなど)を受け入れます。 その動作はCSS Cascading 4 §7.3 明示的なデフォルト化で定義されています。

2.4. 算出値時の挙動

算出値登録されたカスタムプロパティ登録の構文によって決まります。

もし登録の構文がユニバーサル構文定義であれば、 算出値は未登録のカスタムプロパティと同じになります(変数代入後の指定値、または保証された無効値)。

それ以外の場合は、プロパティの値を登録された構文に従ってパースを試みます。 失敗した場合、その宣言は算出値時に無効となり、 算出値はそれに応じて決定されます。 成功した場合は、構文の詳細により算出値が決まります:

"<length>", "<length-percentage>", "<angle>", "<time>", "<resolution>", "<integer>", "<number>", "<percentage>"値の場合:

"<color>"値の場合、 値は色値の解決によって算出されます。 CSS Color 4 §14. 色値の解決参照。

"<custom-ident>"やident、"*"値の場合、 算出値は指定値のままです。

"<url>"値の場合、 算出値は以下のいずれかになります:

URL挙動の例
URLはそれが現れるスタイルシートの基準URLに対して解決されるため、 同じプロパティ内でも異なる基準URLに対して複数の相対URLが解決される場合があります。

例えば、--url-foo--url-bar<url>構文で登録された カスタムプロパティで、スタイルシートが/style/foo/foo.cssにあるとします:

div {
  --url-foo: url("foo.png");
}

そしてもう一つ、/style/bar/bar.cssにあるスタイルシート:

div {
  --url-bar: url("bar.png");
}

最後に/index.htmlというドキュメント:

<link href="/style/foo/foo.css" rel="stylesheet" type="text/css">
<link href="/style/bar/bar.css" rel="stylesheet" type="text/css">
<div style="background-image: var(--url-foo), var(---url-bar);">
</div>

この場合、var(--url-foo)参照は/style/fooに対してURLを解決し、 var(--url-bar)参照は/style/barに対して解決します。

一方、 --url-foo--url-barが未登録の場合は、 リテラル値(相対URL)を/index.htmlのスタイルシートに代入し、 そのURLは/index.htmlに対して解決されます。

"<image>"値の場合、 算出値はcomputed <image>となります。

"<transform-function>""<transform-list>"値の場合、 算出値は全ての長さが算出値に解決された上で指定値のままです。

乗算子付きの構文の場合、 算出値は基底型の算出値リストとなります。

|コンビネータで指定された構文の場合、 算出値は値が一致する最初の句の算出値ルールを適用して決定されます。

2.5. アニメーション動作

注: [css3-animations]および[css3-transitions]により、 カスタムプロパティを参照するアニメーションやトランジションを指定することが可能です。

アニメーションやトランジションで参照された場合、 カスタムプロパティの値は、パースされた型に従い補間され、算出値によって処理されます。

注: これは、<color>+<color>#のような値リストは単純なリストとして補間され、 各コンポーネントがインデックスごとに対応し、コンポーネント数が一致しない場合は失敗することを意味します。

上記のルールの例外として、 <transform-list><transform-function>、 または<transform-function>+としてパースされた値は、transformプロパティに準じて補間されます。

注: 何らかの理由で、カスタムプロパティが<transform-function>#構文で定義されている場合、 まず単純なリストとして補間され、その後各リスト項目がtransform値として補間されます。

注: カスタムプロパティの登録(または登録変更)は算出値を変更でき、 これがCSSトランジションを開始または中断する場合があります。

2.6. 条件付き規則

§2.2 構文解析時の挙動で述べたように、 未登録・登録済み両方のカスタムプロパティは、 構文解析時に(ほぼ)すべての値を受け入れます。 登録済み カスタムプロパティは、算出値時のみ構文を適用します。

したがって、カスタムプロパティは、 登録済みか未登録かに関わらず、 @supports規則の中で「true」と判定されます。 (非常に寛容な)カスタムプロパティの汎用構文に違反しない限りです。

例えば、 カスタムプロパティが syntax: "<color>"; で登録されていても、 @supports (--foo: 1em) {...}のような規則は依然としてtrueと判定され、スタイルが適用されます。 なぜなら宣言が有効なプロパティとして正常にパースされるからです。

2.7. var()による代入

未登録のカスタムプロパティと同様に、 登録済みカスタムプロパティの値もvar()関数で他の値に代入できます。 ただし、登録済みカスタムプロパティは元のトークン列ではなく、 算出値として代入されます。

登録済みカスタムプロパティを参照するvar()関数は、 同等のトークン列に置き換えられなければなりません。 これは、算出値を直列化し、 その文字列をトークン化した際に得られるトークン列と同等です。

例えば、--x<length>構文で登録され、 '--y'が未登録のカスタムプロパティであったとします。
div {
  font-size: 10px;
  --x: 8em;
  --y: var(--x);
}

--xの算出値(直列化時)が "80px" となるため、 --yの算出値は値 "80"、単位 "px" を持つ<dimension-token>となります。

2.7.1. var()参照のフォールバック

var()関数で登録済みカスタムプロパティを参照する場合、 フォールバック値を指定できます。 ただしフォールバック値は参照先カスタムプロパティの構文定義に一致していなければならず、 一致しない場合はその宣言は算出値時に無効となります。

注: このルールはフォールバックが実際に使われるかどうかに関わらず適用されます。

2.7.2. 相対単位による依存サイクル

登録済みカスタムプロパティは未登録のカスタムプロパティと同じ依存サイクル解決規則に従いますが、 以下の追加制約があります:

次の構文要素を持つ登録済みカスタムプロパティについて: <length> または <length-percentage>

例えば、以下の登録では:
CSS.registerProperty({
  name: "--my-font-size",
  syntax: "<length>",
  initialValue: "0px",
  inherits: false
});

次の場合、依存サイクルが発生します:

div {
  --my-font-size: 10em;
  font-size: var(--my-font-size);
}

font-sizeは、値unset が指定されたかのように振る舞います。

2.8. Shadow DOM

CSSの多くの概念と異なり (CSS Scoping 1 §3.5 名前定義構造体と継承参照)、 プロパティ登録はツリーのスコープに限定されません。 登録は、最も外側のドキュメントでもシャドウツリー内でも、 Documentのグローバル登録マップで相互に作用します。

なぜ登録をスコープできないのか?

プロパティ登録をスコープできると便利な用途があります。たとえばShadow DOMを使ったコンポーネントが 独自内部用にカスタムプロパティを登録する場合、 外部ページにはその登録が見えない方がよいでしょう。 外部ページは、そのプロパティを使っていることすら知らないからです。

しかし、登録をスコープしない理由も存在します。カスタムプロパティはコンポーネントへ データを渡す用途にも使われるため、 外部ページがカスタムプロパティを設定し、登録による構文チェックを受けることが有用です。 また、プロパティの初期値などの概念も、 プロパティ登録がグローバルでなければ意味を持ちません。 登録がグローバルであれば、ドキュメントルートにも適用されます。

上記は登録スコープを制御可能にするべきだという理由にはなりますが、 グローバルで強制すべき理由にはなりません。

登録をグローバルにする必要があるのは、 要素が複数のツリースコープに同時に存在でき、 各ツリースコープのスタイルが混在してカスケードされるからです。 これはホスト要素にも当てはまります。 ホスト要素は外部ツリーに属しつつ、シャドウツリーの :hostセレクタでスタイル可能です。 また、シャドウDOM内の要素も外部ツリーから ::part()疑似要素でターゲット可能です。

もし登録がツリースコープごとに可能で、 同じプロパティが内外両方で登録された場合、 どちらの登録を使って値をパースすべきか不明瞭になります。 どのツリー由来かを追跡し(他のツリースコープ値で実装されているように)、 対応する登録を適用しても、 シャドウDOM側が期待する値空間と外部ツリーのカスケードによって 全く異なる値が適用されることになり、想定外の挙動となる可能性があります。

カスタムプロパティがShadow DOMコンポーネントの公開APIとして公開される場合、 このグローバル登録動作は意図通りに機能します。 外部ページが同名のカスタムプロパティを別用途で使っている場合、 それは既に解決すべき競合であり、登録動作が状況を悪化させることはありません。

コンポーネントの内部用途でのみ使うカスタムプロパティの場合は、 他のコンテキストと競合しないようなるべくユニークな名前を付けることが推奨されます。 例えばプロジェクト名や、短い乱数文字列などをプロパティ名に含めることで実現できます。

3. @property規則

@property規則は、JSを実行せずにスタイルシート内で直接 カスタムプロパティ登録 を表します。 有効な@property規則は、 登録済みカスタムプロパティとなり、 registerProperty() が同等のパラメータで呼ばれた場合と同じ結果となります。

@propertyの構文は:

@property <custom-property-name> {
  <declaration-list>
}

有効な@property規則は、 プロパティ名としてその規則の前置部にある<custom-property-name>を直列化したものを持つ カスタムプロパティ登録 を表します。

@property規則にはsyntaxおよびinheritsディスクリプタが必要です。 いずれかが欠けている場合、規則全体は無効となり無視されます。 initial-valueディスクリプタは 構文がユニバーサル構文定義の場合のみ省略可能であり、 それ以外は必須です。欠けている場合は規則全体が無効となり無視されます。

未知のディスクリプタは無効として無視されますが、 @property規則自体は無効になりません。

注: §2.1 登録の判定で規定されている通り、 同じ<custom-property-name>に対して 複数の有効な@property規則が定義された場合、 スタイルシート順で最後のものが「勝ち」となります。 CSS.registerProperty() によるカスタムプロパティ登録は、同じ<custom-property-name>に対する すべての@property規則よりも優先されます。

3.1. syntaxディスクリプタ

名前: syntax
対象: @property
値: <string>
初期値: n/a(本文参照)

@property規則が表すカスタムプロパティ登録の構文を指定し、 プロパティ値の算出値時のパース方法を制御します。

syntaxディスクリプタは@property規則が有効であるために必須です。 欠けている場合@property規則は無効です。

指定された文字列が有効な構文文字列でない場合(構文定義の消費を行った際に失敗する場合)、 ディスクリプタは無効となり無視されます。

3.2. inheritsディスクリプタ

名前: inherits
対象: @property
値: true | false
初期値: n/a(本文参照)

@property規則が表すカスタムプロパティ登録のinheritフラグを指定します。 これによりプロパティがデフォルトで継承されるかどうかを制御します。

inheritsディスクリプタは@property規則が有効であるために必須です。 欠けている場合@property規則は無効です。

3.3. initial-valueディスクリプタ

名前: initial-value
対象: @property
値: <declaration-value>?
初期値: 保証された無効値(ただし本文参照)

@property規則が表すカスタムプロパティ登録の初期値を指定します。 これによりプロパティの初期値が制御されます。

syntaxディスクリプタの値がユニバーサル構文定義の場合、 initial-valueディスクリプタは省略可能です。 省略された場合、プロパティの初期値保証された無効値になります。

それ以外の場合、 syntaxディスクリプタの値がユニバーサル構文定義でない場合、 @property規則が有効であるためには以下の条件を満たす必要があります:

上記条件が満たされない場合、@property規則は無効です。

4. JSによるカスタムプロパティの登録

JSでカスタムプロパティを登録するために、 CSSオブジェクトはregisterProperty() メソッドで拡張されます:

dictionary PropertyDefinition {
  required DOMString name;
           DOMString syntax       = "*";
  required boolean   inherits;
           DOMString initialValue;
};

partial namespace CSS {
  undefined registerProperty(PropertyDefinition definition);
};

さらに、Document オブジェクトは新しい[[registeredPropertySet]] プライベートスロットを持つようになり、 これは登録済みカスタムプロパティを記述するレコードの集合です。

4.1. registerProperty() 関数

registerProperty(PropertyDefinition definition)メソッドは、 definitionで指定された設定オプションに従ってカスタムプロパティを登録します。 呼び出されると、カスタムプロパティ登録アルゴリズムを実行し、 definition引数の各オプションを同名の引数として渡します。

カスタムプロパティを登録するために、name(文字列)、 必要に応じてsyntax(文字列)、inherits(boolean)、 initialValue(文字列)を持つ場合、以下の手順を実行します:
  1. property set現在のグローバルオブジェクト関連付けられたDocument[[registeredPropertySet]] スロットの値とする。

  2. nameカスタムプロパティ名文字列でない場合、SyntaxErrorをthrowしてこのアルゴリズムを終了する。

    property setにすでにnameをプロパティ名とするエントリがある場合(コードポイント単位で比較)、InvalidModificationErrorをthrowしてこのアルゴリズムを終了する。

  3. syntaxから構文定義の消費を試みる。 失敗した場合、SyntaxErrorをthrowする。 成功した場合、返された構文定義syntax definitionとする。

  4. syntax definitionユニバーサル構文定義であり、 initialValueが存在しない場合、 parsed initial valueを空にする。 これは[css-variables]で定義されているカスタムプロパティの「デフォルト」初期値と同一に扱う。 このアルゴリズムの次のステップに進む。

    それ以外の場合、 syntax definitionユニバーサル構文定義ならば、 initialValue<declaration-value>としてパースする。 失敗した場合、SyntaxErrorをthrowしてこのアルゴリズムを終了する。 成功した場合パース結果をparsed initial valueとし、このアルゴリズムの次のステップへ進む。

    それ以外の場合、initialValueが存在しない場合、SyntaxErrorをthrowしてこのアルゴリズムを終了する。

    それ以外の場合、initialValuesyntax definitionに従ってパースする。 失敗した場合、SyntaxErrorをthrowして終了する。

    成功した場合パース結果をparsed initial valueとし、 parsed initial value計算的に独立していなければ、SyntaxErrorをthrowして終了する。

  5. inherit flaginheritsの値に設定する。

  6. registered property構造体として作成し、 プロパティ名はname、 構文はsyntax definition、 初期値はparsed initial value、 inheritフラグはinherit flagとする。 registered propertyをproperty setに追加する。

プロパティ値が計算的に独立しているとは、 その値が要素自身のプロパティ値とCSSで変更できない「グローバル」情報のみで算出値に変換可能な場合を指します。

例えば、5px計算的に独立しており、算出値に変換しても全く変化しません。 同様に、1in計算的に独立です。算出値への変換は「1inは96px」というグローバル知識だけに依存し、 CSSで変更したり調整したりできません。

一方、3em計算的に独立していません。 なぜなら要素(または親要素)のfont-size値に依存するためです。 また、var()関数を使った値も、 カスタムプロパティの値に依存するため計算的に独立ではありません。

カスタムプロパティが型付きで登録されると、 そのプロパティの指定値が算出値になる処理は選択された型によって完全に定義されます。 詳細は§2.4 算出値時の挙動を参照してください。

注: プロパティを登録解除する方法は将来追加される可能性があります。

カスタムプロパティの登録はカスケード一切影響を与えない必要があります。 登録済みプロパティにどんな構文が指定されていても、 パース時には依然としてカスタムプロパティとして通常通りパースされ、 ほぼあらゆる値を受け入れます。 指定値が登録済み構文に違反した場合のみ、 そのプロパティは算出値時に無効となり(初期値にリセットされます)。

デフォルトでは、トークン列としてパースできるすべてのカスタムプロパティ宣言は有効です。したがって、このスタイルシートの結果は:
.thing {
  --my-color: green;
  --my-color: url("not-a-color");
  color: var(--my-color);
}

「thing」クラスの要素のcolorプロパティは inheritに設定されます。 2つ目の--my-color宣言がパース時に1つ目を上書きします(両方とも有効)。 var()参照がcolorプロパティ内で算出値時に無効(url("not-a-color")が色でないため)となります。 このCSSパイプライン(算出時)では、利用可能な唯一のフォールバックはプロパティの初期値であり、 colorの場合はinheritです。 有効な値(green)が存在しても、 パース時にURLが上書きされて削除されます。

次のように呼び出した場合:

CSS.registerProperty({
  name: "--my-color",
  syntax: "<color>",
  initialValue: "black",
  inherits: false
});

パース処理自体は、登録が上記スタイルシートより前でも後でも大きくは変わりません。 唯一の違いは、算出値時に--my-colorプロパティ自体が無効となり初期値のblackにリセットされることです。 その後colorは有効に blackに設定され、 算出値時に無効となってinheritになることはありません。

4.2. PropertyDefinition 辞書

PropertyDefinition辞書は、 著者が指定したカスタムプロパティの設定オプションを表します。PropertyDefinition 辞書には以下のメンバーが含まれます:

name, 型: DOMString

定義するカスタムプロパティの名前。

syntax, 型: DOMString(デフォルトは"*"

このカスタムプロパティがどのように構文解析されるかを表す文字列。

inherits, 型: boolean

このカスタムプロパティがDOMツリー上で継承される場合はTrue、そうでなければFalse。

initialValue, 型: DOMString

このカスタムプロパティの初期値。

5. 構文文字列

構文文字列は、登録済みカスタムプロパティが受け入れる値の型を記述します。構文文字列は、構文成分名からなり、 必要に応じて乗算子コンビネータで結合されます。

構文文字列は構文定義にパース可能であり、これは以下のいずれかです:

  1. 構文成分のリスト。各成分は§ 5.1 サポートされる名前で指定された値型を受け入れます。

  2. ユニバーサル構文定義*)、すべての有効なトークンストリームを受け入れます。

注: 指定された構文に関係なく、すべてのカスタムプロパティはCSS全体キーワードを受け入れ、適切に処理します。

例えば、以下はすべて有効な構文文字列です。
"<length>"

長さ値を受け入れます

"<length> | <percentage>"

長さ、パーセンテージ、パーセンテージのcalc式、長さのcalc式を受け入れます。ただし長さとパーセンテージの混在calc式は受け入れません。

"<length-percentage>"

"<length> | <percentage>"が受け入れるすべての値に加え、長さとパーセンテージの混在calc式も受け入れます。

"big | bigger | BIGGER"

ident bigbiggerBIGGERのいずれかを受け入れます。

"<length>+"

長さ値の空白区切りリストを受け入れます。

"*"

任意の有効なトークンストリームを受け入れます

注: 構文文字列の内部文法はCSS値定義構文のサブセットです。今後の仕様レベルでは、文法の複雑さが拡張され、CSSプロパティの柔軟性に近いカスタムプロパティが可能になる予定です。

この章の残りでは、構文文字列の内部文法について説明します。

5.1. サポートされる名前

このセクションでは、サポートされる構文成分名と、それによって受け入れられる型を定義します。

"<length>"

有効な<length>

"<number>"

<number>

"<percentage>"

有効な<percentage>

"<length-percentage>"

有効な<length>または<percentage>値、さらに<calc()>式で長さとパーセンテージ成分が組み合わされた値も受け入れます。

"<color>"

有効な<color>

"<image>"

有効な<image>

"<url>"

有効な<url>

"<integer>"

有効な<integer>

"<angle>"

有効な<angle>

"<time>"

有効な<time>

"<resolution>"

有効な<resolution>

"<transform-function>"

有効な<transform-function>

"<custom-ident>"

有効な<custom-ident>

識別子として開始する任意のシーケンス(識別子の開始)、 名前として消費可能、かつ<custom-ident>生成規則に一致するもの

その識別子

注: <custom-ident>同士はコードポイント単位で比較されます。 これはUA定義CSSの通常の動作(ASCIIのみ、ASCII大文字小文字区別なし)とは異なります。 したがってRedのような識別子を指定した場合、正確な値Redのみが受け入れられ、 redREDなど他の大文字小文字パターンは一致しません。 識別子はASCIIかつ小文字で記述することが推奨されます(CSSの慣習に合わせるため)。

"<transform-list>"

有効な<transform-function>値のリスト。 "<transform-list>"乗算済みデータ型名であり "<transform-function>+"と同等です。

注: "*"という構文文字列はユニバーサル構文定義を生成し、これは構文成分ではありません。 したがって、"*"乗算子コンビネータと組み合わせることはできません。

5.2. 「+」と「#」乗算子

乗算済みデータ型名を除く全ての構文成分名は、直後に乗算子を付加できます:

U+002B PLUS SIGN (+)

空白区切りリストを示します。

U+0023 NUMBER SIGN (#)

カンマ区切りリストを示します。

"<length>+"

長さ値の空白区切りリストを受け入れます

"<color>#"

色値のカンマ区切りリストを受け入れます

注: 乗算子は直前の構文成分名の直後に記述する必要があります。

5.3. 「|」コンビネータ

構文文字列はU+007C VERTICAL LINE (|)を使って複数の構文成分名を並べることができます。このような構文文字列は複数の構文定義を持つことになります。

複数の構文成分を持つ構文定義でCSS値を解析する際は、指定順で成分がマッチされます。

注: つまり、構文文字列"red | <color>"では、 redは識別子としてパースされ、 blue<color>としてパースされます。

"<length> | auto"

長さまたはautoを受け入れます

"foo | <color># | <integer>"

foo、色値のカンマ区切りリスト、または整数値を受け入れます

5.4. 構文文字列の解析

5.4.1. 定義

データ型名

U+003C LESS-THAN SIGN (<)で始まり、0個以上のidentコードポイントが続き、U+003E GREATER-THAN SIGN (>)で終わるコードポイントの並び。

乗算済みデータ型名

乗算子を既に含む他の構文成分を表すデータ型名

構文成分

構文成分名と任意の乗算子からなるオブジェクト。

構文成分名

コードポイントの並びであり、データ型名、 または<custom-ident>を生成できる並び。

構文定義

構文成分のリストからなるオブジェクト。

ユニバーサル構文定義

すべての有効なトークンストリームを受け入れる特別な構文定義。

5.4.2. 構文定義の消費

このセクションでは、string型のstringから構文定義を消費する方法について説明します。 この手順は、構文定義構文コンポーネントのリスト付き)またはユニバーサル構文定義のいずれかを生成します。
  1. 先頭と末尾のASCII空白文字を除去する。

  2. string長さが0なら失敗を返す。

  3. string長さが1で、 唯一のコードポイントがU+002A ASTERISK (*)なら、 ユニバーサル構文定義を返す。

  4. stream入力ストリームとしてstringコードポイントから作成し、[css-syntax-3]に従って前処理する。 definitionは空のリストとして初期化する。

  5. 構文成分の消費streamから行う。 失敗なら失敗を返す。成功なら返された値をdefinition追加する。

    streamから可能な限り空白を消費する。

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

    EOF

    definitionを返す。

    U+007C VERTICAL LINE (|)

    ステップ5を繰り返す。

    その他:

    失敗を返す。

5.4.3. 構文成分の消費

構文成分の消費を、コードポイントのストリームstreamから行う方法:

streamから可能な限り空白を消費する。

componentを新しい構文成分namemultiplierは空で初期化)として作成する。

streamから次の入力コードポイントを消費する:

U+003C LESS-THAN SIGN (<)

データ型名の消費streamから行う。 文字列が返された場合、componentnameにその値をセットする。 それ以外は失敗を返す。

ident-startコードポイント
U+005C REVERSE SOLIDUS (\)

ストリームがidentシーケンスで始まる場合、 現在の入力コードポイントを再消費し、 identシーケンスの消費streamから行い、 componentnameにその値をセットする。 それ以外は失敗を返す。

componentname<custom-ident>としてパースできない場合は失敗を返す。

その他

失敗を返す。

componentname乗算済みデータ型名の場合、 componentを返す。

stream次の入力コードポイントがU+002B PLUS SIGN (+)またはU+0023 NUMBER SIGN (#)であれば、 streamから次の入力コードポイントを消費し、 componentmultiplier現在の入力コードポイントをセットする。

componentを返す。

5.4.4. データ型名の消費

データ型名の消費を、コードポイントのストリームから行う方法:

注: このアルゴリズムはU+003C LESS-THAN SIGN (<) コードポイントがすでにストリームから消費されていることを前提とします。

nameを、U+003C LESS-THAN SIGN (<) コードポイントのみを含む文字列として初期化する。

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

U+003E GREATER-THAN SIGN (>)

コードポイントnameに追加する。 nameサポートされる構文成分名であればnameを返し、 それ以外は失敗を返す。

identコードポイント

コードポイントnameに追加する。

その他

失敗を返す。

6. CSSOM

登録済みカスタムプロパティに指定された値は、算出値時まで解釈されません。つまり算出値を取得するAPIのみが影響を受けます。他のAPIは関連付けられた[[registeredPropertySet]] スロットを無視し、 すべてのカスタムプロパティを未登録として扱う必要があります。

6.1. CSSPropertyRule インターフェイス

CSSPropertyRule インターフェイスは@property規則を表します。

[Exposed=Window]
interface CSSPropertyRule : CSSRule {
  readonly attribute CSSOMString name;
  readonly attribute CSSOMString syntax;
  readonly attribute boolean inherits;
  readonly attribute CSSOMString? initialValue;
};
name, 型:CSSOMString、読み取り専用
@property 規則に関連付けられたカスタムプロパティ名です。
syntax, 型:CSSOMString、読み取り専用
@property に関連付けられた構文。指定されたままの内容です。
inherits, 型:boolean、読み取り専用
@property 規則に関連付けられた inherits 記述子です。
initialValue, 型:CSSOMString、読み取り専用、nullable
@property 規則に関連付けられた初期値です。 存在しない場合もあります。
CSSPropertyRuleの直列化は、以下の連結結果を返す:
  1. 文字列 "@property"、続いて1つのスペース (U+0020)。

  2. 規則のnameに対して識別子の直列化を実行した結果、続いてスペース。

  3. 文字列 "{ "(左中括弧とスペース)。

  4. 文字列 "syntax:"、続いてスペース。

  5. 規則のsyntaxに対して文字列の直列化を実行した結果、続いてセミコロン、スペース。

  6. 文字列 "inherits:"、続いてスペース。

  7. 規則のinherits属性値に応じて:

    true

    文字列 "true"、続いてセミコロン、スペース。

    false

    文字列 "false"、続いてセミコロン、スペース。

  8. 規則のinitial-valueが存在する場合は、以下の手順:

    1. 文字列 "initial-value:"

    2. 規則のinitial-valueCSS値の直列化を実行した結果、続いてセミコロン、スペース。

  9. 右中括弧 (U+007D)。

6.2. CSSStyleValue 具現化

登録済みカスタムプロパティ値の具現化は、プロパティproperty構文定義syntaxを与えて、以下のステップで実行する:

指定値の場合、値から構成値リストの具現化を行い、結果を返す。

算出値の場合:

  1. 値が<length>, <integer>, <number>, <angle>, <time>, <resolution>, <percentage>または<length-percentage>の場合、数値値の具現化を行い、結果を返す。

  2. 値が<transform-function>の場合は<transform-function>の具現化を行い、結果を返す。

  3. 値が<transform-list>の場合は<transform-list>の具現化を行い、結果を返す。

  4. 値が<image>の場合はCSSImageValueとして具現化し、結果を返す。

  5. 値が識別子の場合、識別子の具現化を行い、結果を返す。

  6. syntaxユニバーサル構文定義の場合、値から構成値リストの具現化を行い、結果を返す。

  7. それ以外の場合はCSSStyleValueとして具現化し、[[associatedProperty]] 内部スロットにpropertyをセットし、結果を返す。

7.

7.1. 例1: カスタムプロパティによるアニメーション動作の追加

<script>
CSS.registerProperty({
  name: "--stop-color",
  syntax: "<color>",
  inherits: false,
  initialValue: "rgba(0,0,0,0)"
});
</script>

<style>
.button {
  --stop-color: red;
  background: linear-gradient(var(--stop-color), black);
  transition: --stop-color 1s;
}

.button:hover {
  --stop-color: green;
}
</style>

7.2. 例2: @propertyでプロパティを登録

<script>
  CSS.paintWorklet.addModule('circle.js');
</script>
<style>
  @property --radius {
    syntax: "<length>";
    inherits: false;
    initial-value: 0px;
  }

  div {
    width: 100px;
    height: 100px;
    --radius: 10px;
    background: paint(circle);
    transition: --radius 1s;
  }

  div:hover {
    --radius: 50px;
  }
</style>
<div></div>
// circle.js
registerPaint('circle', class {
    static get inputProperties() { return ['--radius']; }
    paint(ctx, geom, properties) {
      let radius = properties.get('--radius').value;
      ctx.fillStyle = 'black';
      ctx.beginPath();
      ctx.arc(geom.width / 2, geom.height / 2, radius, 0, 2 * Math.PI);
      ctx.fill();
    }
});

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

これらの機能によって新たなセキュリティ問題は現時点では知られていません。

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

これらの機能によって新たなプライバシー問題は現時点では知られていません。

10. 変更点

10.1. 2020年10月13日作業草案以降の変更点 Working Draft of 13 October 2020

/* 2024年3月20日まで */

適合性

文書の慣例

適合性要件は、記述的な断定とRFC 2119の用語の組み合わせで表現されます。規範的な部分で使われている「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」というキーワードは、RFC 2119で説明されている通りに解釈してください。ただし、可読性のため、本仕様ではこれらの単語をすべて大文字では記載していません。

本仕様のすべてのテキストは規範的ですが、明示的に非規範的であると記載された節、例、および注記は除きます。[RFC2119]

本仕様の例は「for example」という語で導入されるか、またはclass="example"で規範的なテキストから区別されます。例:

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

参考注記は「Note」という語で始まり、class="note"で規範的なテキストから区別されます。例:

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

勧告は規範的なセクションであり、特別な注意を喚起するためにスタイルされ、<strong class="advisement">で他の規範的テキストから区別されます。例:UAはアクセシブルな代替手段を提供しなければならない

適合性クラス

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

スタイルシート
CSSスタイルシート
レンダラー
UA(スタイルシートの意味を解釈し、それを使用する文書をレンダリングするもの)
オーサリングツール
UA(スタイルシートを作成するもの)

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

レンダラーは、本仕様に適合するために、適切な仕様で定義された通りにスタイルシートを解釈することに加え、本仕様で定義されたすべての機能を正しくパースし、文書を正しくレンダリングする必要があります。ただし、デバイスの制限によりUAが文書を正しくレンダリングできない場合でも、UAが不適合であるとは限りません。(例:モノクロモニターの場合、UAは色のレンダリングを要求されません。)

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

部分的な実装

著者が将来互換性のあるパース規則を利用してフォールバック値を設定できるように、CSSレンダラーは、利用可能なレベルのサポートがないすべてのat規則、プロパティ、プロパティ値、キーワード、その他の構文要素を無効として適切に無視しなければなりません。特に、UAはサポートされていないコンポーネント値のみを選択的に無視し、単一の複数値プロパティ宣言内でサポートされている値のみを採用してはなりません。いずれかの値が無効(サポートされていない値は必ず無効)と見なされる場合、CSSの要件により宣言全体が無視されます。

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

将来の安定したCSS機能との競合を避けるため、CSSWGはベストプラクティスに従って、不安定な機能独自拡張の実装を行うことを推奨します。

非実験的な実装

仕様が候補勧告(CR)段階に達すると、非実験的な実装が可能となり、実装者は仕様通りに正しく実装できることを示せるCRレベルの機能については、プリフィックスなしの実装をリリースすべきです。

CSSの相互運用性を確立・維持するため、CSS作業グループは非実験的なCSSレンダラーに対し、プリフィックスなしのCSS機能をリリースする前に実装報告書(および必要ならそのために使用したテストケース)をW3Cへ提出することを要請します。W3Cへ提出されたテストケースは、CSS作業グループによるレビューと修正の対象となります。

テストケースや実装報告書の提出方法などの詳細は、CSS作業グループのWebサイトhttps://www.w3.org/Style/CSS/Test/をご参照ください。質問はpublic-css-testsuite@w3.orgメーリングリストへお送りください。

索引

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

参照定義用語

参考文献

規範参考文献

[CSS-CASCADE-4]
Elika Etemad; Tab Atkins Jr.. CSS Cascading and Inheritance Level 4. 2022年1月13日. CR. URL: https://www.w3.org/TR/css-cascade-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022年1月13日. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-CASCADE-6]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 6. 2023年3月21日. WD. URL: https://www.w3.org/TR/css-cascade-6/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley; Lea Verou. CSS Color Module Level 4. 2022年11月1日. CR. URL: https://www.w3.org/TR/css-color-4/
[CSS-COLOR-5]
Chris Lilley; et al. CSS Color Module Level 5. 2022年6月28日. WD. URL: https://www.w3.org/TR/css-color-5/
[CSS-CONDITIONAL-3]
David Baron; Elika Etemad; Chris Lilley. CSS Conditional Rules Module Level 3. 2022年1月13日. CR. URL: https://www.w3.org/TR/css-conditional-3/
[CSS-FONTS-4]
Chris Lilley. CSS Fonts Module Level 4. 2024年2月1日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 3. 2023年12月18日. CR. URL: https://www.w3.org/TR/css-images-3/
[CSS-IMAGES-4]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 4. 2023年2月17日. WD. URL: https://www.w3.org/TR/css-images-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-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021年12月24日. CR. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TRANSFORMS-1]
Simon Fraser; et al. CSS Transforms Module Level 1. 2019年2月14日. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSS-TYPED-OM-1]
Shane Stephens; Tab Atkins Jr.; Naina Raisinghani. CSS Typed OM Level 1. 2018年4月10日. WD. URL: https://www.w3.org/TR/css-typed-om-1/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2023年12月18日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-VARIABLES]
Tab Atkins Jr.. CSS Custom Properties for Cascading Variables Module Level 1. 2022年6月16日. CR. URL: https://www.w3.org/TR/css-variables-1/
[CSS22]
Bert Bos. Cascading Style Sheets Level 2 Revision 2 (CSS 2.2) Specification. 2016年4月12日. WD. URL: https://www.w3.org/TR/CSS22/
[CSS3-VALUES]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2022年12月1日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 2021年8月26日. WD. URL: https://www.w3.org/TR/cssom-1/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEB-ANIMATIONS-1]
Brian Birtles; et al. Web Animations. 2023年6月5日. WD. URL: https://www.w3.org/TR/web-animations-1/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

参考情報

[CSS-LAYOUT-API-1]
Greg Whitworth; et al. CSS Layout API Level 1. 2018年4月12日. WD. URL: https://www.w3.org/TR/css-layout-api-1/
[CSS-PAINT-API-1]
Ian Kilpatrick; Dean Jackson. CSS Painting API Level 1. 2021年12月16日. CR. URL: https://www.w3.org/TR/css-paint-api-1/
[CSS-SHADOW-PARTS-1]
Tab Atkins Jr.; Fergal Daly. CSS Shadow Parts. 2018年11月15日. WD. URL: https://www.w3.org/TR/css-shadow-parts-1/
[CSS3-ANIMATIONS]
David Baron; et al. CSS Animations Level 1. 2023年3月2日. WD. URL: https://www.w3.org/TR/css-animations-1/
[CSS3-TRANSITIONS]
David Baron; et al. CSS Transitions. 2018年10月11日. WD. URL: https://www.w3.org/TR/css-transitions-1/

プロパティ索引

定義されたプロパティはありません。

@property ディスクリプタ

名前 初期値
inherits true | false n/a(本文参照)
initial-value <declaration-value>? 保証された無効値(本文参照)
syntax <string> n/a(本文参照)

IDL索引

dictionary PropertyDefinition {
  required DOMString name;
           DOMString syntax       = "*";
  required boolean   inherits;
           DOMString initialValue;
};

partial namespace CSS {
  undefined registerProperty(PropertyDefinition definition);
};

[Exposed=Window]
interface CSSPropertyRule : CSSRule {
  readonly attribute CSSOMString name;
  readonly attribute CSSOMString syntax;
  readonly attribute boolean inherits;
  readonly attribute CSSOMString? initialValue;
};

MDN

CSS/registerProperty_static

In all current engines.

Firefoxpreview+Safari16.4+Chrome78+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CSSPropertyRule/inherits

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CSSPropertyRule/initialValue

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CSSPropertyRule/name

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CSSPropertyRule/syntax

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

CSSPropertyRule

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

@property/inherits

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

@property/initial-value

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

@property/syntax

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

@property

In all current engines.

Firefoxpreview+Safari16.4+Chrome85+
Opera?Edge85+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?