サマリー
will-change
CSS プロパティは、ブラウザに要素上で予測される変更の種類についてヒントを出す方法を提供します。そのため、ブラウザは要素が実際に変更される前に事前の最適化をセットアップできます。この種の最適化は 実際に変化が求められる前に潜在的に高コストの処理を行うことで、ページのレスポンスを向上させることができます。
このプロパティを適切に使用するには、少々注意が必要です:
-
will-change を多くの要素に適用しすぎない。ブラウザはすでに可能な限りすべての最適化を試みています。
will-change
を試みるような強力な最適化は、大量のマシンリソースを使ってしまい、使い切ってしまった場合、ページのスローダウンや多量のリソース消費を引き起こします。 -
控えめに使用する。最適化においてブラウザが行う通常の動作は、可能な限り早く最適化を解除して、通常に戻すことです。しかし、スタイルシートに直接
will-change
を追加することは、対象の要素の変更が間近であることを示し続けることであり、ブラウザはそうでない場合よりも長い間最適化を維持し続けなければなりません。そのため、変化が発生する前後にスクリプトコードを使ってwill-change
のオン/オフを切り替えることを習慣づけると良いでしょう。 -
最適化には時期尚早であるタイミングで will-change を要素に適用しない。 ページが良く動作している場合、少々のスピードアップのためだけに
will-change
プロパティを要素に追加しないでください。will-change
は既存のパフォーマンス問題を扱うための最終手段として使われるべきものです。そのため、パフォーマンス問題に先んじて使うべきではありません。 過度なwill-change
の使用は、過度にメモリを消費するとともに、ブラウザが起こりうる変化に対する準備をしようとすることで、より複雑なレンダリングが発生する原因となります。これはパフォーマンスの悪化につながります。 -
処理するために十分な時間を与える。このプロパティは、ユーザーエージェントに変更する可能性のあるプロパティについて事前に通知するための方法として用意されています。 そして、ブラウザは、プロパティの変更が実際に発生する前に、プロパティの変更に必要な事前最適化の適用を選択できます。そのため、ブラウザに実際の最適化を行うためのいくばくかの時間を与えることが重要になります。少なくとも少し早めに何らかの変更が行われることを予測する方法を見つけてから、
will-change
を設定します。
初期値 | auto |
---|---|
適用対象 | 全要素 |
継承 | 不可 |
メディア | all |
計算値 | 指定値 |
アニメーションの可否 | 不可 |
正規順序 | 形式文法で定義される一意のあいまいでない順序 |
構文
/* キーワード値 */ will-change: auto; will-change: scroll-position; will-change: contents; will-change: transform; /* Example of <custom-ident> */ will-change: opacity; /* Example of <custom-ident> */ will-change: left, top; /* Example of two <animateable-feature> */ /* グローバル値 */ will-change: inherit; will-change: initial; will-change: unset;
値
auto
- このキーワードは特定の意図を表現しない;ユーザーエージェントは通常通りの経験則と最適化を適用する。
<animateable-feature>
は次の値のいずれかである:
scroll-position
- 近々に要素のスクロール位置をアニメーション化、または変更することが予想されることを示す。
contents
- 近々に要素のコンテンツに対して何らかのアニメーション化、または変更が予想されることを示す。
<custom-ident>
- 近々に要素で指定された名前のプロパティをアニメーション化、または変更されることが予想されることを示す。指定されたプロパティがショートハンド・プロパティの場合、それが展開されたすべてのプロパティが予想されることを示す。次の値は指定できない:
unset
、initial
、inherit
、will-change
、auto
、scroll-position
、contents
。仕様では特定の値についての動作を定義していないが、一般的にtransform
は合成レイヤーのヒントとなる。特定の css プロパティに対しては、現在のところ Chrome は 2 つのアクションを取る:新しい合成レイヤーを構築するか、または新しい スタックコンテキスト を構築する。
形式的構文
auto | <animateable-feature>#where
<animateable-feature> = scroll-position | contents | <custom-ident>
例
.sidebar { will-change: transform; }
上述の例は、will-change プロパティを直接スタイルシートに追加しているため、ブラウザは必要以上に長期間メモリ内で最適化を維持し続けることになります。なぜこれを避けるべきかは既に確認しました。
以下はスクリプトで will-change
プロパティを適用する方法を示した例です。 ほとんどの場合、これが行うべきことでしょう。
var el = document.getElementById('element'); // 要素がホバーされたとき、will-change を設定する el.addEventListener('mouseenter', hintBrowser); el.addEventListener('animationEnd', removeHint); function hintBrowser() { // アニメーションのキーフレームブロックで // 変更されるであろう最適化可能なプロパティ this.style.willChange = 'transform, opacity'; } function removeHint() { this.style.willChange = 'auto'; }
しかし、ページが大きく複雑なアルバムやスライドデッキプレゼンテーションのようなキー押下で遷移するアプリケーションの場合、スタイルシートに will-change を含めた方が適切なこともあります。これによって、ブラウザは事前に切り替えの準備を行い、キーが押されるとすぐに、てきぱきとしたページ間の切り替えができます。
.slide { will-change: transform; }
仕様
仕様 | 状態 | コメント |
---|---|---|
CSS Will Change Module Level 1 The definition of 'will-change' in that specification. |
草案 | Initial definition |
ブラウザ実装状況
機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
基本サポート | 36 | 36 (36) [1] | 未サポート | 24 | WebKit bug 147772 |
機能 | Android | Firefox Mobile (Gecko) | IE Phone | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
基本サポート | 37 | 36.0 (36) [1] | 未サポート | 未サポート | WebKit bug 147772 |
[1] Firefox 31 から 35 まで、layout.css.will-change.enabled
フラグを true
に切り替えた時だけ、will-change
を使用できました。 Firefox 43 でこの設定は削除されました。
Firefox はバージョン 42 まで、
will-change: will-change という
設定を受け入れますが、これ
は仕様に反しています。これは Firefox 43.0 で修正されました。バグ 1195884 を見てください。