will-change CSS プロパティは、ブラウザに要素上で予測される変更の種類についてヒントを出す方法を提供します。そのため、ブラウザは要素が実際に変更される前に事前の最適化をセットアップできます。この種の最適化は 実際に変化が求められる前に潜在的に高コストの処理を行うことで、ページのレスポンスを向上させることができます。

/* キーワード値 */
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;

このプロパティを適切に使用するには、少々注意が必要です:

  • will-change を多くの要素に適用しすぎない。ブラウザはすでに可能な限りすべての最適化を試みています。 will-change を試みるような強力な最適化は、大量のマシンリソースを使ってしまい、使い切ってしまった場合、ページのスローダウンや多量のリソース消費を引き起こします。

  • 控えめに使用する。最適化においてブラウザが行う通常の動作は、可能な限り早く最適化を解除して、通常に戻すことです。しかし、スタイルシートに直接 will-change を追加することは、対象の要素の変更が間近であることを示し続けることであり、ブラウザはそうでない場合よりも長い間最適化を維持し続けなければなりません。そのため、変化が発生する前後にスクリプトコードを使って will-change のオン/オフを切り替えることを習慣づけると良いでしょう。

  • 最適化には時期尚早であるタイミングで will-change を要素に適用しない。 ページが良く動作している場合、少々のスピードアップのためだけに will-change プロパティを要素に追加しないでください。 will-change は既存のパフォーマンス問題を扱うための最終手段として使われるべきものです。そのため、パフォーマンス問題に先んじて使うべきではありません。 過度な will-change の使用は、過度にメモリを消費するとともに、ブラウザが起こりうる変化に対する準備をしようとすることで、より複雑なレンダリングが発生する原因となります。これはパフォーマンスの悪化につながります。

  • 処理するために十分な時間を与える。このプロパティは、ユーザーエージェントに変更する可能性のあるプロパティについて事前に通知するための方法として用意されています。 そして、ブラウザは、プロパティの変更が実際に発生する前に、プロパティの変更に必要な事前最適化の適用を選択できます。そのため、ブラウザに実際の最適化を行うためのいくばくかの時間を与えることが重要になります。少なくとも少し早めに何らかの変更が行われることを予測する方法を見つけてから、will-change を設定します。

初期値auto
適用対象全要素
継承不可
メディアall
計算値指定値
Animation typediscrete
正規順序形式文法で定義される一意のあいまいでない順序

構文

auto
このキーワードは特定の意図を表現しない;ユーザーエージェントは通常通りの経験則と最適化を適用する。

<animateable-feature> は次の値のいずれかである:

scroll-position
近々に要素のスクロール位置をアニメーション化、または変更することが予想されることを示す。
contents
近々に要素のコンテンツに対して何らかのアニメーション化、または変更が予想されることを示す。
<custom-ident>
近々に要素で指定された名前のプロパティをアニメーション化、または変更されることが予想されることを示す。指定されたプロパティがショートハンド・プロパティの場合、それが展開されたすべてのプロパティが予想されることを示す。次の値は指定できない: unsetinitialinheritwill-changeautoscroll-positioncontents。仕様では特定の値についての動作を定義していないが、一般的に 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
will-change の定義
勧告候補 Initial definition

ブラウザー実装状況

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
基本サポート 36 36 (36) [1] 未サポート 24 9.1
機能 Android Firefox Mobile (Gecko) IE Phone Opera Mobile Safari Mobile
基本サポート 37 36.0 (36) [1] 未サポート 未サポート 9.3

[1] Firefox 31 から 35 まで、layout.css.will-change.enabled フラグを true に切り替えた時だけ、will-change を使用できました。 Firefox 43 でこの設定は削除されました。

Firefox はバージョン 42 まで、 will-change: will-change という設定を受け入れますが、これは仕様に反しています。これは Firefox 43.0 で修正されました。バグ 1195884 を見てください。

ドキュメントのタグと貢献者

 このページの貢献者: momdo, hamasaki, YuichiNukiyama, lv7777
 最終更新者: momdo,