CSS Will Change モジュール レベル 1

W3C 候補勧告草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2022/CRD-css-will-change-1-20220505/
最新公開バージョン:
https://www.w3.org/TR/css-will-change/
編集者草案:
https://drafts.csswg.org/css-will-change/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/css-will-change-1
実装レポート:
https://wpt.fyi/results/css/css-will-change
テストスイート:
https://wpt.fyi/results/css/css-will-change
フィードバック:
CSSWG イシューレポジトリ
編集者:
Tab Atkins Jr. (Google)
この仕様への編集提案:
GitHub エディター

概要

この文書は、will-change CSSプロパティを定義します。これにより、作者は要素に対してどのような変更を加える可能性があるかを事前にUAに知らせることができます。UAは、実際にアニメーションが始まる前に、高価な準備作業を先に行い、要素の扱いを最適化することが可能になります。

CSSは、構造化文書(HTMLやXMLなど)の描画方法を画面上や紙上などで記述するための言語です。

この文書のステータス

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

この文書は CSS作業部会 によって、候補勧告草案として 勧告トラックを使用して公開されました。 候補勧告として公開されても、W3Cおよびそのメンバーによる支持を意味するものではありません。 候補勧告草案は、作業部会が次回の候補勧告スナップショットに含める予定の変更点を以前の候補勧告から統合しています。

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

フィードバックは、 GitHubでissueを提出(推奨)してください。 タイトルには仕様コード「css-will-change」を含めてください。例: “[css-will-change] …コメントの要約…”。 すべてのissueやコメントはアーカイブされています。 代わりに、(アーカイブ済み)の公開メーリングリスト www-style@w3.org にメールで送ることもできます。

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

この文書は、W3C特許ポリシーの下で活動するグループによって作成されました。 W3Cはグループの成果物に関連して行われた特許開示の公開リストを管理しています。 同ページには特許の開示方法も記載されています。 個人が必須請求を含む特許の実際の知識を持つ場合は、W3C特許ポリシー第6節に従って情報を開示する必要があります。

1. はじめに

現代のCSSレンダラーは、ウェブページを素早く効率的に描画するために様々な高度な最適化を行っています。 しかし、これらの最適化は導入時に無視できない初期コストがかかることが多く、 ページの応答性に悪影響を及ぼすことがあります。

例えば、CSS 3D変形を使って要素を画面上で移動する場合、 要素やその内容が「レイヤー」に昇格され、 ページの他の部分とは独立して描画され、後で合成されることがあります。 これにより、コンテンツの描画が分離されるため、ページの他の部分を再描画する必要がなくなり、 要素のtransformだけがフレーム間で変化する場合に高速化が見込めます。

しかし、要素を新しいレイヤーに設定することは比較的高価な処理であり、 transformアニメーションの開始が、体感できるほど遅れる原因となることがあります。

この仕様で定義されるwill-changeプロパティを使うことで、 作者は将来的に変更される可能性が高いプロパティを事前に宣言でき、 UAは必要となる前に適切な最適化を行うことができます。 実際に変更が発生したとき、ページは素早く更新されます。

1.1. 値の定義

この仕様はCSSプロパティ定義規約[CSS2])に従い、値定義構文[CSS-VALUES-3])を使用しています。 本仕様で定義されていない値型はCSS Values & Units [CSS-VALUES-3]で定義されています。 他のCSSモジュールとの組み合わせにより、これらの値型の定義が拡張される場合があります。

プロパティ固有の値に加えて、 本仕様で定義されているすべてのプロパティは CSSワイドキーワードも値として受け付けます。 可読性のため、これらは明示的に繰り返していません。

1.2. will-changeの適切な使い方

will-changeプロパティは、 他のパフォーマンスヒントと同様に、 「正しく」使い方を身につけるのが難しい場合があります。 特に、作者が直接その効果を検知できることがほとんどないためです。 しかし、いくつかの簡単な「やるべきこと・やってはいけないこと」があり、 will-changeの使い方を直感的に理解するのに役立ちます。

多くのプロパティや要素にwill-changeを乱用しないこと

will-changeを初めて見た際によくある反応は、次のようなコードが良いアイデアだと思うことです:

* { will-change: transform, opacity /* , ... */; }

すべてを最適化するようにブラウザに指示すれば、 当然良いはずだと思うかもしれません。

違います。ブラウザはすでにできる限り最適化しようとしています。 明示的に指示しても効果はなく、 実際には大きな悪影響を及ぼす場合があります。 will-changeに関連する強力な最適化は マシンのリソースを大量に消費することがあり、 このように乱用するとページが遅くなったりクラッシュすることもあります。

さらに、will-changeにはいくつか副作用があり、 すべての要素にこれらの副作用が必要なケースはほぼありません。

スタイルシート内でwill-changeを慎重に使うこと

スタイルシートでwill-changeを直接使う場合、 対象の要素が常に何らかの変更直前であると暗黙的に示すことになります。 これは通常意図するところではありません。 実際には、will-changeは 変更前後にスクリプトでオン・オフするのが一般的です(変更が止まった要素のリソースを無駄にしないこと参照)。 ただし、will-changeを直接スタイルシートで使うのが適切な場合もあります。

例えば、 ページ内の少数の永続的UI要素にwill-changeを指定し、 ユーザーの操作に素早く反応させたい場合は適切です:
body > .sidebar {
   will-change: transform;
   /* ユーザー操作時に'transform'でサイドバーをスライドさせる。 */
}

要素数が少ないため、 最適化の効果がほとんど使われなくても大きな問題にはなりません。

要素が本当に頻繁にプロパティを変更する場合もあります。 例えば、マウスの動きに反応したり、 定期的にアニメーションを起こす場合などです。 この場合は、スタイルシートでwill-changeを宣言しても問題ありません。 要素が定期的または常に変更されることを正しく記述しているため、 最適化を維持するべきです。
.cats-flying-around-the-screen {
  will-change: left, top;
}

will-changeが効果を発揮する十分な時間を与えること

よくある誤った使い方は、アニメーションやプロパティ変更の直前にwill-changeを要素に適用することです。 残念ながら、多くの最適化は適用に時間がかかるため、 すぐにセットアップできず、will-changeの効果がほとんどありません。 何かが変化することを少し前に予測し、 will-changeその時点でセットするようにしましょう。

例えば、 ユーザーが要素をクリックすることで変化が起きる場合、 hover時にwill-changeを指定することで最適化の準備に200ミリ秒程度の余裕が生まれます。 人間の反応速度は比較的遅いためです。 これはスクリプトでも、CSSルールでも実現できます:
.element { transition: opacity .2s; opacity: 1; }
.element:hover { will-change: opacity; }
.element:active { opacity: .3; }

ただし、このようなルールはhoverで効果が発生する場合には意味がありません。 このような場合でも、事前にアクションを予測する方法を見つけることが多いです。 例えば、親要素のhoverで十分なリードタイムを与えられる場合があります:

.element { transition: opacity .2s; opacity: 1; }
.container:hover > .element { will-change: opacity; }
.element:hover { opacity: .3; }

変更が止まった要素のリソースを無駄にしないこと

一部プロパティの変更に使われる最適化は高コストなため、 ブラウザは通常、できるだけ早くそれらを解除して通常動作に戻します。 しかし、will-changeはこの動作を一般的に上書きし、 ブラウザが通常よりも長く最適化を維持します。

そのため、will-changeを特にスクリプトで要素に追加した場合は、 変更が終わった後に忘れずに削除し、 ブラウザが消費しているリソースを回収できるようにしましょう。

2. 将来の挙動のヒント: will-change プロパティ

名前: will-change
値: auto | <animateable-feature>#
初期値: auto
適用対象: すべての要素
継承: no
パーセンテージ: n/a
算出値: 指定値
正規順序: 文法に従う
アニメーション型: アニメーション不可
<animateable-feature> = scroll-position | contents | <custom-ident>

will-change プロパティは、作者がどのような種類の変更を要素に対して行う予定かをユーザーエージェントに伝えるための描画ヒントです。 これにより、ユーザーエージェントはその変更をスムーズに描画するために必要な最適化を事前に行うことができ、 作者がその機能の変更やアニメーションを開始したときに「ジャンク」を回避できます。

異なるブラウザは will-change の情報をさまざまな方法で利用できます。 そして、同じブラウザでも状況によって使い方が変わることがあります。 例えば、will-change: transform が指定されたときに、要素を独自の「GPUレイヤー」に昇格させるブラウザでも、 宣言する要素が多すぎる場合はGPUメモリ枯渇を避けるため昇格をしないことがあります。

値の意味は以下の通りです:

auto
特別な意図を示しません。 ユーザーエージェントは通常通りのヒューリスティックや最適化を適用すべきです。
scroll-position
作者が近い将来、要素のスクロール位置をアニメーションまたは変更する予定であることを示します。

例えば、 ブラウザはスクロール可能な要素の「スクロールウィンドウ」内のコンテンツや、その先の一部コンテンツのみを描画することがよくあります。 スキップ描画によるメモリや時間の節約と、スクロールの見栄えのバランスを取っています。 この値が指定されている場合、ブラウザはスクロールウィンドウ周辺の描画範囲を広げ、 より長く・速いスクロールをスムーズに行えるようにするかもしれません。

contents
作者が近い将来、要素の内容に関して何らかの変更やアニメーションを行う予定であることを示します。
例えば、ブラウザは要素の描画を時間とともに「キャッシュ」することが多いですが、 ほとんどの要素は頻繁に変更されず、位置だけが変わることが多いです。 しかし、もし要素が絶えず内容を変更する場合は、 このキャッシュを作成・維持するのは無駄になります。 ブラウザはこの値を、該当要素で積極的なキャッシュを控える、またはキャッシュ自体をやめて都度再描画する信号として利用するかもしれません。

この値は主に、JSベースのアニメーションで毎秒多数回内容を変更するケースでブラウザが最適化できるように意図されています。 この種の最適化は、宣言型アニメーションが使われる場合、すでに自動的に行われていることが多いです。

注: この値は、宣言された要素のサブツリー全体にほぼ適用されます。 つまり、ブラウザは子孫すべてが何らかの変更を受けるものと考えます。 文書の上位要素に使うとページのパフォーマンスに大きな悪影響が出ることがあります。 なるべく文書ツリーの「下位」の要素、最小限の範囲にだけ使うようにしてください。

<custom-ident>
<custom-ident> が組み込みCSSプロパティ名と ASCII 大文字小文字無視で一致する場合、 作者は近い将来そのプロパティを要素で変更またはアニメーションする意図を示します。 指定プロパティがショートハンドの場合は、展開されるすべてのロングハンドに関する意図を示します。

例えば、 will-change: background; を指定すると、 will-change: background-image, background-position, ... など背景プロパティが展開されるすべてのプロパティを指定したのと同じ意味になります。

ここで使われる <custom-ident> 生成規則は、 will-changenoneallautoscroll-positioncontents など 通常 <custom-ident> から除外されるキーワードも含め除外します。

注: 多くのプロパティは指定しても効果がありません。 なぜなら、ほとんどのプロパティ変更に対して特別な最適化を行うUAは少ないからです。 ただし、指定しても安全です。 単に効果がないだけです。

カスタムプロパティを指定しても効果はありません。 つまり、カスタムプロパティによる効果は 下記の「非初期値で何かが起きる」条件には該当しません。

注: 未知のプロパティ名を指定しても問題ありません。 単に効果がないだけです。 これにより、あるUAにだけ存在する新しいプロパティを安全に指定でき、 それを知らない古いUAに悪影響を与えることはありません。

例えば、 transform に初期値以外を設定した要素は、通常の要素と大きく異なる扱いになります。 例えば、独自の「GPUレイヤー」に描画したり、transformが生み出す変形に素早く対応できる仕組みが使われます。 UAは transform の値を、要素が変形される前に即座にレイヤー昇格させる信号として扱い、 従来レイヤーの再描画による遅延を防ぎます。

プロパティの非初期値が要素でスタッキングコンテキストを作る場合、 will-change でも スタッキングコンテキストを作る必要があります。

プロパティの非初期値が絶対位置要素の包含ブロックを生成する場合、 will-change でも 包含ブロックを生成する必要があります。

プロパティの非初期値が固定位置要素の包含ブロックを生成する場合、 will-change でも 包含ブロックを生成する必要があります。

プロパティの非初期値がレンダリング挙動(例:テキストのアンチエイリアス戦略)を変える場合、 UAは will-change でそのプロパティが指定された時点で その代替レンダリングを使い、後で値が変わった際の描画差異を防ぐべきです。

例えば、 opacity1 以外を指定すると要素でスタッキングコンテキストが作られます。 したがって、will-change: opacity を指定すると、現在 opacity1 でも スタッキングコンテキストが作られます。

will-change プロパティは、上記で説明したスタッキングコンテキストや包含ブロックの生成以外に、 指定要素自体に直接的な効果はありません。 あくまでUAへの描画ヒントであり、 特定種類の変更に対してコストの高い最適化を事前に行うことを可能にします。

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

本書に対するセキュリティ懸念は報告されていません。

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

本書に対するプライバシー懸念は報告されていません。

5. 謝辞

元々 will-animate プロパティを提案し、初期設計を多く担った Benoit Girard 氏に感謝します。

6. 変更点

2015年12月3日 CR以降の変更:

2014年4月29日 ワーキングドラフト以降の変更:

適合性

文書規約

適合性要件は、記述的な主張と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。スタイルシートを作成するもの。

スタイルシートは、本モジュールで定義された文法および各機能の個別文法に従って、 そのすべての文が有効であれば本仕様に適合します。

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

オーサリングツールは、汎用CSS文法および本モジュール内の各機能の個別文法に従って正しく構文的に正しいスタイルシートを書き、 本モジュールで説明されるその他の適合要件も満たせば適合です。

部分的な実装

作者が将来互換性のあるパース規則を活用してフォールバック値を割り当てられるよう、 CSSレンダラーは 必ず サポートしない atルール、プロパティ、プロパティ値、キーワード、その他の構文要素を無効として(適切に無視) しなければなりません。特に、UAはサポートしない値だけを無視し、サポートする値だけを複数値宣言で適用してはなりません: 任意の値が無効(サポートしていない値は必ず)なら、CSSは宣言全体を無視する必要があります。

不安定・独自機能の実装

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

非実験的な実装

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

CSSの実装間で相互運用性を確保・維持するため、 CSS作業部会は非実験的CSSレンダラーに対し、実装報告(必要ならそのテストケース)をW3Cへ提出するよう要請しています。提出されたテストケースはCSSWGによるレビューと修正を受ける場合があります。

テストケースや実装報告の提出方法の詳細はCSS作業部会のWebサイト https://www.w3.org/Style/CSS/Test/ を参照してください。 質問は public-css-testsuite@w3.org メーリングリストへ。

CR終了基準

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

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

仕様は少なくとも6ヶ月間、候補勧告段階に留まります。

索引

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

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

参考文献

規定参考文献

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

参考情報

[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-TRANSFORMS-1]
Simon Fraser; 他. CSS Transforms Module Level 1. 2019年2月14日. CR. URL: https://www.w3.org/TR/css-transforms-1/

プロパティ索引

名前 初期値 適用対象 継承 パーセンテージ アニメーション型 正規順序 算出値
will-change auto | <animateable-feature># auto すべての要素 no n/a アニメーション不可 文法に従う 指定値