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

/* キーワード値 */
will-change: auto;
will-change: scroll-position;
will-change: contents;
will-change: transform;        /* <custom-ident> の例 */
will-change: opacity;          /* <custom-ident> の例 */
will-change: left, top;        /* 2 つの <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 を設定してください。

  • 注意、 will-change は実際に要素の視覚的な表現を増加させる可能性があります重ね合わせコンテキスト (例えば will-change: opacity) を、手前に作成される重ね合わせコンテキストとして作成するプロパティ値を使用する場合です。

初期値auto
適用対象全要素
継承不可
メディアすべて
計算値指定値
アニメーションの種類個別
正規順序形式文法で定義される一意のあいまいでない順序

構文

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
will-change の定義
勧告候補 初回定義。

ブラウザー互換性

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応36 なし

361

31 — 432

なし249.1
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応3736 なし

361

31 — 432

249.3 あり

1. Before Firefox 43, Firefox supported will-change: will-change, which is invalid by the specification.

2. From version 31 until version 43 (exclusive): this feature is behind the layout.css.will-change.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.

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

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