CSSのカスケーディングと継承 レベル4

W3C 候補勧告スナップショット,

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2022/CR-css-cascade-4-20220113/
最新公開バージョン:
https://www.w3.org/TR/css-cascade-4/
編集者ドラフト:
https://drafts.csswg.org/css-cascade-4/
過去のバージョン:
履歴:
https://www.w3.org/standards/history/css-cascade-4
実装レポート:
https://wpt.fyi/results/css/css-cascade
フィードバック:
CSSWG イシューレポジトリ
編集者:
Elika J. Etemad / fantasai (招待専門家)
Tab Atkins Jr. (Google)
この仕様への編集提案:
GitHub エディター

概要

このCSSモジュールは、スタイル規則を整理し、すべての要素のすべてのプロパティに値を割り当てる方法について説明します。カスケーディングと継承によって、すべての要素のすべてのプロパティに値が伝播します。

このレベルで新たに追加されたのは、revert キーワードと、 <supports-condition>@import ルールで使用できることです。

CSS は、構造化文書(HTMLやXMLなど)の表示方法を記述するための言語です。 画面や印刷など、様々な媒体に対応しています。

この文書のステータス

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

この文書は CSS作業グループ により、候補勧告スナップショットとして 勧告トラックを使用して公開されました。 候補勧告として公開されることは、W3Cおよびその会員による承認を意味しません。 候補勧告スナップショットは 広範なレビューを受けており、 実装経験の収集を目的としており、作業グループのメンバーからの ロイヤリティフリーライセンスの約束があります。 この文書はW3C勧告となる予定です; 追加のフィードバックを集めるため、 までは候補勧告のままとなります。

フィードバックは GitHubでIssueとして提出(推奨)してください。 件名に仕様コード「css-cascade」を含めてください(例: “[css-cascade] ...コメント概要...”)。 すべてのIssueやコメントはアーカイブされます。 または、(アーカイブされる) 公開メーリングリスト www-style@w3.org に送信することもできます。

この文書は 2021年11月2日 W3Cプロセス文書 に準拠しています。

この文書は W3C特許ポリシーに基づいて運営されているグループによって作成されました。 W3Cは、グループの成果物に関連して行われた特許開示の 公開リスト を維持しています。 このページには特許を開示するための手順も記載されています。 個人が特許について事実上の知識があり、その特許が 必須クレーム を含むと考える場合は、 W3C特許ポリシー第6節 に従って情報を開示しなければなりません。

1. はじめに

CSSは、文書のレンダリングを指示する有限のパラメータセット「プロパティ」を定義します。 各プロパティには名前(例: colorfont-sizeborder-styleなど)、 値空間(例: <color><length-percentage>[ solid | dashed | dotted | … ]など)、 文書のレンダリングに関する定義済みの挙動があります。 プロパティ値はプロパティ宣言を介して文書の各部分に割り当てられ、 その要素やボックスに対してプロパティ値(例: red12ptdotted)が割り当てられます。

CSSの基本的な設計原則の1つはカスケーディングであり、 複数のスタイルシートが文書の表示に影響を与えることを可能にします。 異なる宣言が同じ要素・プロパティの組み合わせに値を設定しようとした場合、 その衝突を解決する必要があります。

逆に、どの宣言も要素・プロパティの組み合わせに値を設定しない場合には、 継承やプロパティの初期値によって値が決定されます。

カスケーディングデフォルト化の処理は宣言の集合を入力として受け取り、 各要素の各プロパティに対して指定値を出力します。

文書内のすべての要素のすべてのプロパティの指定値を決定するためのルールは本仕様で記述されています。 ページコンテキストおよびマージンボックス内の指定値を決定するためのルールは[css-page-3]で説明されています。

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

このセクションは標準です。

このモジュールは、[CSS2] 第6章で定義されたプロパティ値の割り当て、カスケーディング、継承のルールを置き換え、拡張します。

他のCSSモジュールは、ここで定義されている構文や機能の定義を拡張する場合があります。 例えば、Media Queries Level 4仕様は このモジュールと組み合わせることで、 本仕様で用いられる<media-query>値型の定義を拡張します。

本仕様の目的では、テキストノードは、 対応する要素の子要素として扱われ、 全てのプロパティを持ちます。 ただしセレクターでターゲットにできないため、 その計算値は全てデフォルト化によって割り当てられます。

2. スタイルシートのインポート: @import ルール

@importルールは、他のスタイルシートからスタイル規則をインポートすることを可能にします。 @importルールが有効なスタイルシートを参照する場合、 ユーザーエージェントはそのスタイルシートの内容を@importルールの代わりに書かれているかのように扱う必要があります。ただし例外が2つあります:

例えば、インポートされたスタイルシートのスタイル規則内の宣言は、@importの位置に直書きされたかのようにカスケードに作用します。

いかなる@importルールも、スタイルシート内の他の有効なatルールやスタイル規則よりも先に記述されなければなりません (@charsetは無視する)、そうでなければ@importルールは無効となります。 @importの構文は次の通りです:

@import [ <url> | <string> ]
        [ supports( [ <supports-condition> | <declaration> ] ) ]?
        <media-query-list>? ;

ここで<url>または<string>はインポートするスタイルシートのURLを指定し、 オプションの[<supports-condition>|<declaration>]や<media-query-list>(まとめてimport条件)は適用される条件を示します。

次の条件付き@importルールは、UAがdisplay: flexサポートしている場合のみスタイルシートを読み込み、 かつハンドヘルドデバイスで、最大ビューポート幅が400pxのときのみスタイルシートを適用します。
@import url("narrow.css") supports(display: flex) handheld and (max-width: 400px);

<string>が指定された場合、 同じ値の<url>として解釈しなければなりません。

次の2行は同じ意味であり、 @importの2つの構文(url()使用と裸の文字列)を示しています:
@import "mystyle.css";
@import url("mystyle.css");

2.1. 条件付き @import ルール

import条件によって、インポートをメディア依存または機能サポート依存にできます。 import条件がない場合、インポートは無条件です。 (all<media-query-list>に指定すると同様の効果です。) import条件が一致しない場合、 インポートされたスタイルシート内の規則は適用されません。これは、インポートされたスタイルシートが指定条件で@media@supportsブロックでラップされている場合と全く同じです。

次の規則は@importルールでメディア依存にできる例です:
@import url("fineprint.css") print;
@import url("bluish.css") projection, tv;
@import url("narrow.css") handheld and (max-width: 400px);

ユーザーエージェントは、import条件が一致しない限り、条件付きインポートの取得を回避できます。 さらに、<supports-condition>がインポートされたスタイルシートの適用を妨げる場合、 UAはスタイルシートを取得してはならず(他のリンク経由で取得される場合を除く)、 インポートルールのCSSImportRule.styleSheet値には必ずnullを返す必要があります(他のリンク経由でロードされていても)。

次の規則は、著者がレガシーユーザーエージェント向けにフォールバック規則を提供しつつ、 新しいユーザーエージェントでネットワークパフォーマンスに影響を与えない方法を示しています:
@import url("fallback-layout.css") supports(not (display: flex));
@supports (display: flex) {
  ...
}

import条件は、<media-query-list>によって与えられ、これはメディアクエリリストとして解析・解釈されます。 また、<supports-condition>は[[supports query]]として解析・解釈されます。 <supports-condition>の代わりに<declaration>が指定された場合、 それは<supports-decl>(括弧が追加される)として解釈され、 <supports-condition>として扱われます。

例えば、次の2行は同じ意味になります:
@import "mystyle.css" supports(display: flex);
@import "mystyle.css" supports((display: flex));

import条件の評価と完全な構文は、Media Queries [MEDIAQ] および CSS Conditional Rules [CSS-CONDITIONAL-3]仕様で定義されています。

2.2. スタイルシートのインポート処理

同じスタイルシートが複数箇所から文書にインポートまたはリンクされた場合、 ユーザーエージェントは、それぞれのリンクを独立したスタイルシートへのリンクとして処理(またはそのように振る舞う)しなければなりません。

注: これはリソースの取得方法には要件を課しません。CSSOMでの反映や本仕様のような仕様での利用方法のみを規定します。 適切なキャッシュがあれば、UAはスタイルシートを1度だけ取得しても問題ありません。 たとえ複数回リンク・インポートされていたとしてもです。

インポートされたスタイルシートのカスケード起源は、インポート元のスタイルシートのカスケード起源です。

インポートされたスタイルシートの環境エンコーディングは、インポート元のスタイルシートのエンコーディングです。[css-syntax-3]

@importの取得を、@importルールruleに対して実行する場合:
  1. parentStylesheetrule親CSSスタイルシートとする。[CSSOM]

  2. rule<supports-condition>を持ち、 その条件が偽の場合は終了。

  3. parsedUrlruleのURLとparentStylesheetlocationを使ってURLパーサー手順を実行した結果とする。 このアルゴリズムがエラーを返した場合、終了。[CSSOM]

  4. スタイルリソースの取得parsedUrl、スタイルシートparentStylesheet、destination "style"、CORS mode "no-cors"で実行し、 processResponseはresponse responseと バイトストリーム、nullまたは失敗byteStreamを受け取る以下の手順とする:

    1. maybeByteStreamがバイトストリームでなければ終了。

    2. parentStylesheetquirks modeかつresponseCORS-same-originの場合は、content type"text/css"とする。 それ以外の場合はcontent typeresponseのContent Typeメタデータとする。

    3. content type"text/css"でなければ終了。

    4. importedStylesheetbyteStramparsedUrlを使ってスタイルシートのパースした結果とする。

    5. importedStylesheetorigin-cleanフラグparentStylesheetorigin-cleanフラグと同じ値に設定する。

    6. responseCORS-same-originでなければ、 importedStylesheetorigin-cleanフラグを未設定にする。

    7. rulestyleSheetimportedStylesheetを設定する。

2.3. CSSスタイルシートのContent-Type

インポートされたスタイルシートの処理は、リンクされたリソースの実際の型によって決定されます:

リンクされたリソースの型がtext/cssの場合は、CSSスタイルシートとして解釈されなければなりません。 それ以外の場合はネットワークエラーとして扱われなければなりません。

3. ショートハンドプロパティ

一部のプロパティはショートハンドプロパティです。 これは、1つのプロパティで複数のプロパティの値を指定できることを意味します。 ショートハンドプロパティは、そのロングハンドサブプロパティすべてを、 その場所で展開したかのように設定します。

ショートハンド形式で値を省略した場合、 特に定義がない限り、各「省略された」サブプロパティにはその初期値が割り当てられます。

これは、ショートハンドプロパティの宣言は、明示的に設定されていないものも含めてすべてサブプロパティを設定するということです。 不注意に使うと、意図せず一部のサブプロパティをリセットしてしまう場合があります。 注意して使えば、ショートハンドを利用して他のソースからカスケードされたサブプロパティをリセットし「白紙状態」を保証できます。

例えば、background: greenと書くことで、background-color: greenよりも優先して背景色を上書きでき、 以前の宣言でbackground-imageで画像が設定されていた場合でも上書きできます。

例えば、CSS Level 1のfontプロパティは ショートハンドプロパティであり、 font-stylefont-variantfont-weightfont-sizeline-heightfont-familyを一度に設定できます。 この例の複数宣言は:
h1 {
  font-weight: bold;
  font-size: 12pt;
  line-height: 14pt;
  font-family: Helvetica;
  font-variant: normal;
  font-style: normal;
}

次のように書き換えられます:

h1 { font: bold 12pt/14pt Helvetica }

CSSによりさらにfontサブプロパティが追加された場合でも、 ショートハンド宣言によりそれらも初期値にリセットされます。

場合によっては、ショートハンドが異なる構文 または、その サブプロパティの値に直接対応しない 特別なキーワードを持つことがある。 (このような場合、ショートハンドは、その値の 展開方法を明示的に定義する。)

別の場合には、あるプロパティがショートハンドの リセット専用サブプロパティであることがある: 他の サブプロパティと同様に、指定されていない場合にはショートハンドによって 初期値にリセットされるが、 ショートハンドには、その サブプロパティを その他の値に設定するための構文が含まれていないことがある。 たとえば、border ショートハンドは border-image をその初期値である none にリセットするが、 それ以外の値に設定するための構文は持たない。 [css-backgrounds-3]

ショートハンドCSS 全体キーワード [css-values-3] のいずれかとして指定された場合、 リセット専用サブプロパティであるものも含め、 そのすべての サブプロパティを そのキーワードに設定する。 (これらのキーワードは、ショートハンドであっても、単一の宣言内で他の値と組み合わせることはできないことに注意。)

ショートハンド プロパティを !important として宣言することは、そのすべての サブプロパティ!important として宣言することと等価である。

3.1. プロパティのエイリアス化

プロパティは、一定期間サポートされた後に名前が変更されることがあります(ベンダープレフィックス付きプロパティの標準化など)。 互換性維持のために元の名前もサポートする必要がありますが、新しい名前の使用が推奨されます。 このため、CSSでは旧構文を新構文に「エイリアス」する2つの方法を定義しています。

旧名エイリアス
旧プロパティの値構文が新プロパティと同一の場合、 解析時に旧プロパティ名が新プロパティ名に変換されるという、ケースマッピング同様の操作でエイリアスされます。 この変換はCSSOMでも適用され、文字列引数やプロパティアクセサでも同様です。 旧プロパティ名へのリクエストは、新プロパティ名へ透過的に転送されます。
例えば、old-name旧名エイリアスとしてnew-nameである場合、 getComputedStyle(el).oldNameは、newNameプロパティの算出スタイルを返します。 el.style.setPropertyValue("old-name", "value")new-nameプロパティに"value"を設定します。
旧ショートハンド
旧プロパティが新プロパティと異なる構文を持つ場合、 2つの名前はショートハンドの仕組みでエイリアスされます。 これらのショートハンドは旧ショートハンドと定義され、その使用は非推奨です。 その他は通常のショートハンドと同じ挙動ですが、CSSOMのシリアライズでは選択されません。[CSSOM]
例えば、page-break-*プロパティは、 旧ショートハンドとしてbreak-*プロパティにエイリアスされます (CSS Fragmentation 3 § 3.4 ページ分割エイリアス: page-break-before, page-break-after, page-break-insideプロパティ参照)。

page-break-before: alwaysを設定すると、パース時にbreak-before: pageに展開されます(他のショートハンド同様)。 同様に、break-before: pageが設定されている場合、 getComputedStyle(el).pageBreakBefore"always"を返します。 しかし、スタイルブロックをシリアライズする際(CSSOM 1 § 6.7.2 CSS値のシリアライズ参照)、 page-break-beforeプロパティは、指定の有無に関わらずシリアライズ時に選択されることはありません。 代わりに、break-beforeが常に選択されます。 break-beforeが常に選ばれます。

3.2. すべてのプロパティのリセット: allプロパティ

名前: all
値: initial | inherit | unset | revert
初期値: 各プロパティ参照
適用対象: 各プロパティ参照
継承: 各プロパティ参照
パーセンテージ: 各プロパティ参照
算出値: 各プロパティ参照
アニメーション型: 各プロパティ参照
正規順序: 文法による

all プロパティはショートハンドであり、すべてのCSSプロパティをリセットします。 ただし、directionunicode-bidiは除きます。 このプロパティはCSS全体キーワードのみ受け付けます。 カスタムプロパティはリセットしません。[css-variables-1]

注: 除外されたCSSプロパティdirectionunicode-bidiは実際にはマークアップレベルの機能であり、 著者のスタイルシートで設定すべきではありません。 (これらはCSSプロパティとしては、UAがサポートしない文書言語のスタイル付けのために存在します。) 著者はHTMLのdir属性など、適切なマークアップを使用してください。[css-writing-modes-3]

例えば、著者が要素にall: initialを指定すると、 すべての継承が阻止され、すべてのプロパティがリセットされます。 これは、著者・ユーザー・ユーザーエージェントの全レベルで規則が一切現れなかった場合と同じです。

これは、ページ内に含まれる「ウィジェット」のルート要素など、外部ページのスタイルを継承したくない場合に有用です。 ただし、その要素に適用された「デフォルト」スタイル(例: UAスタイルシートによる<div>などのブロック要素へのdisplay: blockなど)も消えてしまう点に注意してください。

4. 値の処理

ユーザーエージェントが文書を解析し文書ツリーを構築した後、 フラットツリー内のすべての要素、 およびそれに対応する整形構造内の全てのボックスに対し、 対象メディア型に適用されるすべてのプロパティに値を割り当てなければなりません。

特定の要素またはボックスに対するCSSプロパティの最終的な値は、複数段階の計算の結果です:

  1. まず、各要素・各プロパティに適用される宣言値をすべて収集します。 その要素には宣言値が0個または複数適用されている場合があります。
  2. カスケード処理によってカスケード値が決定されます。 各要素の各プロパティごとに最大1つのカスケード値があります。
  3. デフォルト化によって指定値が決定されます。 各要素の各プロパティには必ず1つの指定値があります。
  4. 値の依存関係を解決することで算出値が決定されます。 各要素の各プロパティには必ず1つの算出値があります。
  5. 文書の整形によって使用値が決定されます。 要素がそのプロパティの適用対象の場合のみ、使用値を持ちます。
  6. 最後に、使用値は表示環境の制約に基づいて実際値に変換されます。 使用値と同様、要素の特定プロパティに対して実際値が存在する場合としない場合があります。

接続されていない要素や、文書のフラット化要素ツリーに属していない要素はCSS値処理の対象にならず、 宣言値カスケード値指定値算出値使用値実際値を持ちません。 たとえstyle属性などでスタイル宣言が割り当てられていた場合でもです。

4.1. 宣言値

要素に適用された各プロパティ宣言は、その要素に関連付けられた当該プロパティの宣言値を提供します。 詳細は宣言のフィルタリングを参照してください。

これらの値はカスケードによって処理され、単一の「勝者値」が選ばれます。

4.1.1. 値のエイリアス化

一部のプロパティ値には旧値エイリアスが存在します。 解析時に旧構文は新構文へ変換され、パース入力とは異なる宣言値となります。 これらのエイリアスは主に互換性維持のために使われ、 ベンダープレフィックス値を標準値へ変換するなどに利用されます。

4.2. カスケード値

カスケード値は、カスケードの結果を表す: これは、カスケードで優先される 宣言値カスケードの出力で最初にソートされる値)である。 カスケードの出力が空のリストである場合、 カスケード値は存在しない。

4.3. 指定値

指定値は、 スタイルシート著者がその要素に対して意図したプロパティの値です。 これはカスケード値デフォルト化処理に通した結果であり、 すべての要素のすべてのプロパティに指定値が必ず存在します。

多くの場合、指定値カスケード値です。 しかしカスケード値が全くない場合は指定値デフォルト化されます。 CSS全体キーワードは、 それがプロパティのカスケード値となった場合に特別に扱われ、 当該キーワードに従って指定値を設定します。 詳細は§ 7.3 明示的なデフォルト化を参照してください。

4.4. 算出値

算出値は、 指定値をプロパティ定義表の「算出値」欄に従って解決した結果です。 通常、継承準備のために絶対化されます。継承参照。

注: 算出値継承時に親から子へ渡される値です。 仕様上の理由により、必ずしもgetComputedStyle()関数の返す値とは限りません。 この関数は場合によって使用値を返すことがあります。[CSSOM] また、算出値は抽象的なデータ表現です。 定義はこのデータ表現を反映し、データのシリアライズ方法ではありません。 例えば、シリアライズ規則ではパース時に暗黙的な値を省略できる場合がありますが、 それらの値も算出値には含まれます。

指定値は絶対値(例:red2mmのように他の値に依存しない)にも、 相対値(例:auto2emのように他の値に依存する)にもなり得ます。 相対値の算出は通常絶対化されます:

下記表の例(f),(g),(h)参照。

注: 算出値は、文書のレイアウトや複雑で並列化が困難な操作(ネットワークリクエストの解決や、要素や親以外から値を取得すること)などを行わずに、可能な限り指定値を解決します。

算出値はプロパティが適用されない場合でも存在します。 ただし、プロパティが要素に適用されるかどうかで算出値の決定方法が変わる場合もあります。

4.5. 使用値

使用値は、 算出値を用いて残りの計算を完了し、 文書の整形に用いる絶対的な理論値です。

例えば、width: autoの宣言は、要素の親レイアウトを知らなければ長さに解決できません。 そのため算出値autoのままですが、 使用値100pxのような絶対長さになります。[CSS2]

別の例として、<div>が算出break-before値としてautoを持つ場合でも、 最初の子から伝播されて使用break-before値としてpageを得ることがあります。[css-break-3]

プロパティがこの要素やボックス型に適用されない場合、そのプロパティの使用値はありません。

例えば、flexプロパティは、フレックスアイテムでない要素には使用値を持ちません。

4.5.1. 適用対象プロパティ

プロパティが要素やボックス型に適用されない場合(「適用対象」行で記載)、その型のボックスや要素には直接効果を持ちません。

注: 適用されないプロパティでも、 その算出値が適用される他のプロパティの計算に影響する場合は間接的な整形効果を持つことがあります。 また、その算出値は必ず存在し、 子孫要素に継承されて効果を及ぼすことがあります。

例えば、writing-modetext-orientationはテーブル行には直接適用されません(テーブル行やその子のレイアウトに影響しません)が、こうしたボックスに設定することでフォント相対単位chなどの計算に影響し、 <length>値を取るプロパティにも影響し得ます。
HTMLのp要素(デフォルトではdisplay: block)にtext-transformを設定すると効果があります。 text-transformは本来インラインボックスに適用されますが、 プロパティは段落の匿名ルートインラインボックスに継承され、内部テキストに適用されます。

注: 「すべての要素」に適用されると定義されたプロパティは、 すべての要素および 表示型に適用されるが、 必ずしもすべての 疑似要素型に適用されるわけではない。 疑似要素には、多くの場合、それら独自の特定のレンダリングモデル またはその他の制限があるためである。 ただし、::before および ::after 疑似要素は、 通常の要素とほぼまったく同じようにボックスを生成するよう定義されているため、 「すべての要素」に適用されるすべてのプロパティを受け入れるよう定義されている。 疑似要素についての詳細は、[CSS-PSEUDO-4] を参照されたい。

4.6. 実際値

使用値は原則として使用可能ですが、 ユーザーエージェントが環境によってこの値を利用できない場合もあります。例えば、ユーザーエージェントが整数ピクセル幅だけでボーダーを描画できる場合、使用幅を近似する必要があります。 また、フォントサイズは利用可能なフォントやfont-size-adjustプロパティの値によって調整が必要な場合があります。 実際値は、 そのような調整後の使用値です。

注: 要素の実際値を調べれば文書のレイアウトについて多くのことが分かります。 しかし、すべての情報が実際値に記録されているわけではありません。 たとえば、page-break-afterプロパティの実際値は、その要素の後に改ページがあるかどうかを反映しません。 同様に、orphansプロパティの実際値は、要素内の孤立行数を反映しません。 下記表の例(j),(k)参照。

4.7.

CSS 値の算出例
プロパティ 優先された宣言 カスケード値 指定値 算出値 使用値 実際の値
(a) text-align text-align: left left left left left left
(b) border-top-width, border-right-width, border-bottom-width, border-left-width border-width: inherit inherit 4.2px 4.2px 4.2px 4px
(c) width (なし) (なし) auto (初期値) auto 120px 120px
(d) list-style-position list-style-position: inherit inherit inside inside inside inside
(e) list-style-position list-style-position: initial initial outside (初期値) outside outside outside
(f) font-size font-size: 1.2em 1.2em 1.2em 14.1px 14.1px 14px
(g) width width: 80% 80% 80% 80% 354.2px 354px
(h) width width: auto auto auto auto 134px 134px
(i) height height: auto auto auto auto 176px 176px
(j) page-break-after (なし) (なし) auto (初期値) auto auto auto
(k) orphans orphans: 3 3 3 3 3 3

5. フィルタリング

宣言値を見つけるために、 実装はまず各要素に適用されるすべての宣言を特定しなければなりません。 宣言が要素に適用される条件は以下の通りです:

適用される宣言の値は、 各要素の各プロパティごとに 宣言値のリストを形成します。 次節カスケードでこれらのリストが優先順位付けされます。

6. カスケーディング

カスケードは、 指定された要素の指定されたプロパティについて 未整列の宣言値のリストを 以下で定める宣言の優先順位でソートし、 単一のカスケード値を出力します。

6.1. カスケードのソート順

カスケードは以下の基準に従い、優先度の高い順に宣言をソートします:

オリジンと重要度
宣言の オリジンは、 その宣言がどこから来たかに基づき、 その 重要度は、 !important を伴って宣言されているかどうかで決まる(以下を参照)。 各種 オリジンの優先順位は、降順で次のとおりである:
  1. トランジション宣言 [css-transitions-1]
  2. 重要ユーザーエージェント 宣言
  3. 重要ユーザー 宣言
  4. 重要作者宣言
  5. アニメーション宣言 [css-animations-1]
  6. 通常作者宣言
  7. 通常ユーザー宣言
  8. 通常ユーザーエージェント宣言

このリストで先にある オリジンからの宣言は、 後にある オリジンからの宣言よりも優先される。

コンテキスト
文書言語は、異なる カプセル化コンテキストを出所とする宣言を 混在させる仕組みを提供できる。 たとえば、[DOM] における シャドウツリーの 入れ子になった ツリーコンテキストなどである。

異なる カプセル化コンテキストを出所とする 2 つの宣言を比較する場合、 通常の規則では 外側のコンテキストからの宣言が優先され、 重要な規則では 内側のコンテキストからの宣言が優先される。 この目的では、[DOM]ツリー コンテキストは、 シャドウを含むツリー順序で入れ子になっているものとみなされる。

注: これは実質的に、通常の宣言で、ある カプセル化コンテキストに属するものは、外側のコンテキストによって容易に 上書きできる既定値を設定できる一方、 重要な宣言で、 ある カプセル化コンテキストに属するものは、 外側のコンテキストによって上書きできない要件を強制できることを意味する。

詳細度
Selectors モジュール [SELECT] は、セレクターの詳細度を 算出する方法を説明している。 各宣言は、それが現れるスタイル規則と同じ詳細度を持つ。 このステップの目的では、 スタイル規則に属さない宣言 (style 属性の内容など)は、 どのセレクターよりも高い詳細度を持つものとみなされる。 最も高い詳細度を持つ宣言が優先される。
出現順序
文書順で最後の宣言が優先される。 この目的では:
  • インポートされたスタイルシートからの宣言は、そのスタイル シートが @import 規則の位置に置き換えられたかのように順序付けられる。
  • 起点となる文書によって独立してリンクされたスタイルシートからの宣言は、 ホスト文書言語によって決定されるリンク順に連結されたかのように扱われる。
  • style 属性からの宣言は、 style 属性が現れる要素の文書順に従って順序付けられ、 すべてのスタイルシートの後に配置される。

カスケードの 出力は、各要素の各プロパティについての 宣言値を並べ替えた(空の場合もある)リストである。

6.2. カスケードの起源

各スタイル規則はカスケード起源を持ち、 それがカスケードへの参入位置を決定します。 CSSは3つの基本的な起源を定義しています:

著者起源
著者は、文書言語の慣習に従ってソース文書用のスタイルシートを指定します。 例えばHTMLでは、スタイルシートを文書内に含めたり外部リンクすることができます。
ユーザー起源
ユーザーは特定の文書に対してスタイル情報を指定できる場合があります。 例えば、ユーザーがスタイルシートを含むファイルを指定したり、 ユーザーエージェントがユーザースタイルシートを生成するインターフェースを提供したり(またはそのように振る舞う)できる場合があります。
ユーザーエージェント起源
準拠ユーザーエージェントはデフォルトスタイルシートを適用する(またはそのように振る舞う)必要があります。 ユーザーエージェントのデフォルトスタイルシートは、文書言語の一般的な表示期待に応じて要素を表示すべきです (例:ビジュアルブラウザではHTMLのEM要素を斜体フォントで表示するなど)。 例:HTMLユーザーエージェントスタイルシート参照。[HTML]

CSS拡張仕様は以下の追加起源を定義します:

アニメーション起源
CSSアニメーション[css-animations-1]は、実行時にその効果を表す「仮想」規則を生成します。
トランジション起源
CSSアニメーション同様、CSSトランジション[css-transitions-1]も実行時にその効果を表す「仮想」規則を生成します。

6.3. 重要な宣言:!important注釈

CSSは著者とユーザースタイルシート間の権限バランスを目指しています。 デフォルトでは、著者のスタイルシート内の規則がユーザーのスタイルシートの規則を上書きし、 ユーザーのスタイルシートはユーザーエージェントのデフォルトスタイルシートの規則を上書きします。 このバランスのため、宣言を重要にすることで、 カスケード内の重みが高まり、優先順位が逆転します。

宣言が重要であるのは、 !important注釈が[css-syntax-3]で定義されている場合です。 すなわち、値の最後の2つの(空白・コメント以外の)トークンが区切りトークン!と識別子トークンimportantである場合です。 その他の宣言は通常(非重要)宣言です。

[hidden] { display: none !important; }

重要宣言は通常宣言より優先されます。 著者・ユーザースタイルシートの両方で重要宣言を含めることができ、 ユーザー起源重要宣言は 著者起源重要宣言より優先されます。 このCSS機能はドキュメントのアクセシビリティを向上させ、 特殊な要件(大きなフォントや色の組み合わせなど)を持つユーザーが 表示をコントロールできるようにします。

すべての起源の重要宣言はアニメーションより優先されます。 これにより、著者はアニメーション値を重要な場面で上書きできます。 (通常、アニメーション値は他のすべての規則より優先されます。)[css-animations-1]

ユーザーエージェントスタイルシート重要宣言を含めることができ、 これらはすべての著者およびユーザー宣言より優先されます。

次の例におけるユーザーのスタイルシートの最初の規則には、 !important 宣言が含まれており、 これは作者のスタイルシート内の対応する宣言を上書きする。 2 番目の規則内の宣言も、!important と指定されているため優先される。 ただし、ユーザーのスタイルシート内の 3 番目の宣言は !important ではないため、 作者のスタイルシート内の 2 番目の規則に負ける (この規則はたまたま ショートハンドプロパティにスタイルを設定している)。 また、2 番目の宣言が !important であるため、作者の 3 番目の規則は作者の 2 番目の規則に負ける。 これは、!important 宣言が作者のスタイルシート内でも機能することを 示している。
/* ユーザーのスタイルシートから */
p { text-indent: 1em !important }
p { font-style: italic !important }
p { font-size: 18pt }

/* 作者のスタイルシートから */
p { text-indent: 1.5em !important }
p { font: normal 12pt sans-serif !important }
p { font-size: 24pt }
プロパティ 優先される値
text-indent 1em
font-style italic
font-size 12pt
font-family sans-serif

6.4. 非CSSプレゼンテーションヒントの優先順位

UAは、ソース文書のマークアップ内のプレゼンテーションヒント(例:bgcolor属性や s 要素[HTML]など)を尊重することができます。 文書言語ベースのスタイリングはすべて対応するCSS規則に変換され、 カスケードには UA起源または ユーザー起源著者起源の間の 特殊な著者プレゼンテーションヒント起源規則として参入しなければなりません。 カスケードにおいてはこの 著者プレゼンテーションヒント起源は独立した起源とみなされますが、 revertキーワードの目的では著者起源の一部とみなされます。

文書言語は、そのようなプレゼンテーションヒントがカスケードUA起源または 著者起源 として参入するかどうかを定義できます。 その場合、UAは定義に従って挙動する必要があります。 例:[SVG11]はプレゼンテーション属性を著者起源にマッピングします。

注: カスケードUA起源規則として参入するプレゼンテーションヒントは、 著者起源ユーザー起源スタイルで上書きできます。 著者プレゼンテーションヒント起源規則として参入するヒントは、 著者起源スタイルで上書きできますが、 非重要ユーザー起源スタイルでは上書きできません。 ホスト言語はこれらを考慮して適切な起源を選ぶべきです。

7. デフォルト化

カスケードの結果として値が決定されない場合、 指定値は別の方法で決定されなければなりません。継承プロパティは親要素から継承を通じてデフォルト値を取得します。 その他のプロパティは初期値を取ります。 著者はinheritおよびinitialキーワードを使って明示的に継承や初期化を指定できます。

7.1. 初期値

各プロパティには初期値があり、プロパティの定義表で定義されています。 プロパティが継承プロパティでなく、 カスケードの結果として値が決定されない場合、 プロパティの指定値はその初期値となります。

7.2. 継承

継承は、プロパティ値を親要素から子要素へ伝播させます。 要素のプロパティの継承値は、親要素におけるそのプロパティの算出値となります。 ルート要素の場合、親要素がないため、継承値はプロパティの初期値です。

[DOM]ツリーにシャドウがある場合、継承はフラット化要素ツリー上で行われます。 つまり、スロット割当された要素はslotに継承し、ライトツリーの親から直接継承するわけではありません。 疑似要素は各疑似要素に記載された仮想タグ列に従って継承します。[CSS-PSEUDO-4]

一部のプロパティは継承プロパティであり、プロパティ定義表で定義されています。 これは、カスケードの結果として値が決定されない場合に、値が継承によって決定されることを意味します。

プロパティは明示的に継承することもできます。inheritキーワード参照。

注: 継承は文書ツリーを辿り、匿名ボックスで遮られたり、ボックスツリーの操作で影響されたりしません。

7.3. 明示的なデフォルト化

以下に定義されるCSS全体のプロパティ値がいくつかあります。 プロパティをこれらの値に明示的に宣言することで、特定のデフォルト化挙動を指定できます。 CSS値と単位 [css-values-3]に規定される通り、すべてのCSSプロパティはこれらの値を受け入れられます。

7.3.1. プロパティのリセット:initialキーワード

プロパティのカスケード値initialキーワードの場合、 プロパティの指定値はそのプロパティの初期値です。

7.3.2. 明示的な継承:inheritキーワード

プロパティのカスケード値inheritキーワードの場合、 プロパティの指定値および算出値継承値となります。

7.3.3. すべての宣言の消去:unsetキーワード

プロパティのカスケード値unsetキーワードの場合、 継承プロパティであればinheritとして扱い、 そうでなければinitialとして扱います。 このキーワードは、カスケードの先頭に現れたすべての宣言値を消去し、 プロパティ(またはショートハンドのすべてのロングハンド)に対して適切に継承または初期化します。

7.3.4. カスケード起源の巻き戻し:revertキーワード

プロパティの カスケード値revert キーワードである場合、 その動作は、その宣言が属する カスケードオリジン に依存する:

ユーザーエージェントオリジン
unset と等価である。
ユーザーオリジン
カスケード 値をユーザーエージェントレベルまでロールバックし、 この要素のこのプロパティに対して 作者オリジンまたは ユーザーオリジンの規則が指定されていないかのように、 指定 値が算出される。
作者 オリジン
カスケード 値をユーザーレベルまでロールバックし、 この要素のこのプロパティに対して 作者オリジンの規則が指定されていないかのように、 指定 値が算出される。 revert の目的上、このオリジンにはアニメーション オリジンが含まれる。

8. 変更点

8.1. 2021年10月15日作業草案以降の変更点

2021年10月15日作業草案以降の主な変更点:

8.2. 2018年8月28日候補勧告以降の変更点

2021 年 3 月 19 日の 作業草案以降の軽微ではない変更には、次のものが含まれる:

2020 年 8 月 18 日の 作業草案以降の軽微ではない変更には、次のものが含まれる:

2018 年 8 月 28 日の 勧告候補以降の軽微ではない変更には、次のものが含まれる:

8.3. 2016年1月14日候補勧告以降の変更点

2016年1月14日作業草案以降の主な変更点:

コメント処理状況一覧があります。

8.4. 2015年4月21日作業草案以降の変更点

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

8.5. レベル3以降の追加事項

レベル3以降に追加された主な機能:

8.6. レベル2以降の追加事項

レベル2以降に追加された主な機能:

謝辞

David Baron、Tantek Çelik、Simon Sapin、Noam Rosenthal、Boris Zbarskyは本仕様への貢献者です。

プライバシーとセキュリティに関する考慮事項

適合性

文書の慣例

適合要件は、記述的な断定と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"で他の規範的本文と区別されます。例:

Note: これは情報提供用の注記です。

勧告は規範的なセクションであり、特別な注意を促すためにスタイルされ、<strong class="advisement">で他の規範的本文と区別されます。例: UAはアクセス可能な代替手段を提供しなければなりません。

適合クラス

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

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

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

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

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

部分的な実装

著者が将来互換性のあるパースルールを利用してフォールバック値を割り当てられるようにするため、 CSSレンダラーは、サポート可能なレベルのないatルール、プロパティ、プロパティ値、キーワード、 その他の構文要素は無効として(および適宜無視)しなければなりません。 特に、ユーザーエージェントは、サポートされていないコンポーネント値のみ無視し、サポートされている値だけを1つの複数値プロパティ宣言で適用するような選択的な無視はしてはなりません。 いずれかの値が無効(サポートされていない値は必ず無効)とみなされた場合、CSSではその宣言全体を無視する必要があります。

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

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

非実験的な実装

仕様が候補勧告段階に到達した後は、非実験的な実装が可能であり、実装者は仕様に沿って正しく実装できるCRレベルの機能については、プレフィックスなしの実装をリリースすべきです。

CSSの実装間で相互運用性を確立・維持するため、CSSワーキンググループは非実験的なCSSレンダラーに対し、 実装レポート(必要に応じてそのテストケース)をW3Cに提出することを求めています。 W3Cに提出されたテストケースはCSSワーキンググループによるレビューや修正の対象となります。

テストケースおよび実装レポートの提出方法については、CSSワーキンググループのWebサイト https://www.w3.org/Style/CSS/Test/で案内しています。 質問はpublic-css-testsuite@w3.orgまで。

CR終了基準

本仕様が提案勧告段階に進むためには、各機能について少なくとも2つの独立した相互運用可能な実装が必要です。各機能は異なる製品セットで実装されてもよく、すべての機能を単一製品で実装する必要はありません。この基準のため、以下の用語を定義します:

独立実装
各実装は異なる団体が開発し、他の適格実装で使われたコードを共有・再利用・派生してはいけません。本仕様の実装に関係しないコード部分はこの要件の対象外です。
相互運用可能
公式CSSテストスイートの該当テストケースに合格すること、またはWebブラウザ以外の場合は同等のテスト。該当テストスイートのすべてのテストは、当該UAが相互運用性を主張するなら同等のテストを作成する必要があります。また、そのUAが相互運用性を主張する場合、同様に合格できる他のUAが1つ以上必要です。これらの同等テストは相互査読のため公開されなければなりません。
実装
ユーザーエージェント(UA)で、次を満たすもの:
  1. 本仕様を実装している。
  2. 一般公開されている。製品版またはその他の公開バージョン(ベータ版、プレビュー版、ナイトリービルドなど)でもよい。非製品版リリースは、安定性を示すために少なくとも1ヶ月間機能を実装している必要があります。
  3. 実験的でない(テストスイート合格だけを目的としたバージョンでなく、今後の通常利用を意図していること)。

本仕様は少なくとも6ヶ月間候補勧告のままとなります。

索引

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

参照で定義されている用語

参考文献

標準参考文献

[CSS-2021]
Tab Atkins Jr.; Elika Etemad; Florian Rivoal. CSS Snapshot 2021. 2021年12月31日. NOTE. URL: https://www.w3.org/TR/css-2021/
[CSS-ANIMATIONS-1]
Dean Jackson 他. CSS Animations Level 1. 2018年10月11日. WD. URL: https://www.w3.org/TR/css-animations-1/
[CSS-BACKGROUNDS-3]
Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2021年7月26日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley; Lea Verou. CSS Color Module Level 4. 2021年12月15日. WD. URL: https://www.w3.org/TR/css-color-4/
[CSS-CONDITIONAL-3]
David Baron; Elika Etemad; Chris Lilley. CSS Conditional Rules Module Level 3. 2021年12月23日. CR. URL: https://www.w3.org/TR/css-conditional-3/
[CSS-CONDITIONAL-5]
David Baron; Elika Etemad; Chris Lilley. CSS Conditional Rules Module Level 5. 2021年12月21日. WD. URL: https://www.w3.org/TR/css-conditional-5/
[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-FONTS-5]
Myles Maxfield; Chris Lilley. CSS Fonts Module Level 5. 2021年12月21日. WD. URL: https://www.w3.org/TR/css-fonts-5/
[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-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-TRANSITIONS-1]
David Baron 他. CSS Transitions. 2018年10月11日. WD. URL: https://www.w3.org/TR/css-transitions-1/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2019年6月6日. CR. URL: https://www.w3.org/TR/css-values-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-VARIABLES-1]
Tab Atkins Jr.. CSS Custom Properties for Cascading Variables Module Level 1. 2021年11月11日. CR. URL: https://www.w3.org/TR/css-variables-1/
[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/
[CSS2]
Bert Bos 他. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSSOM]
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/
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren 他. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[MEDIAQ]
Florian Rivoal; Tab Atkins Jr.. Media Queries Level 4. 2021年12月25日. CR. URL: https://www.w3.org/TR/mediaqueries-4/
[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/
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2018年11月21日. WD. URL: https://www.w3.org/TR/selectors-4/
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/

参考情報文献

[CSS-ALIGN-3]
Elika Etemad; Tab Atkins Jr.. CSS Box Alignment Module Level 3. 2021年12月24日. WD. URL: https://www.w3.org/TR/css-align-3/
[CSS-BREAK-3]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 3. 2018年12月4日. CR. URL: https://www.w3.org/TR/css-break-3/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 4. 2018年12月18日. WD. URL: https://www.w3.org/TR/css-break-4/
[CSS-FLEXBOX-1]
Tab Atkins Jr. 他. CSS Flexible Box Layout Module Level 1. 2018年11月19日. CR. URL: https://www.w3.org/TR/css-flexbox-1/
[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS Fonts Module Level 4. 2021年12月21日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-INLINE-3]
Dave Cramer; Elika Etemad; Steve Zilles. CSS Inline Layout Module Level 3. 2020年8月27日. WD. URL: https://www.w3.org/TR/css-inline-3/
[CSS-LISTS-3]
Elika Etemad; Tab Atkins Jr.. CSS Lists and Counters Module Level 3. 2020年11月17日. WD. URL: https://www.w3.org/TR/css-lists-3/
[CSS-PAGE-3]
Elika Etemad; Simon Sapin. CSS Paged Media Module Level 3. 2018年10月18日. WD. URL: https://www.w3.org/TR/css-page-3/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2021年12月17日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3. 2021年4月22日. CR. URL: https://www.w3.org/TR/css-text-3/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019年7月30日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[SVG11]
Erik Dahlström 他. Scalable Vector Graphics (SVG) 1.1 (Second Edition). 2011年8月16日. REC. URL: https://www.w3.org/TR/SVG11/

プロパティ索引

名前 初期値 適用対象 継承 パーセンテージ アニメーション型 正規順序 算出値
all initial | inherit | unset | revert 各プロパティ参照 各プロパティ参照 各プロパティ参照 各プロパティ参照 各プロパティ参照 文法による 各プロパティ参照