--- title: will-change slug: Web/CSS/will-change tags: - CSS - CSS プロパティ - CSS 変更予定 - Reference - 'recipe:css-property' - transition - トランジション translation_of: Web/CSS/will-change ---
{{CSSRef}}

CSSwill-change プロパティは、どのような要素の変更が予測されているかブラウザーに助言します。ブラウザーは要素が実際に変更される前に、最適化をセットアップすることができます。この種の最適化は、実際に変化が求められる前に、潜在的に高コストの処理を行うことで、ページの応答を向上させることができます。

重要: will-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;

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

構文

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

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

scroll-position
まもなく要素のスクロール位置をアニメーション化、または変更することが予想されることを示します。
contents
まもなく要素のコンテンツに対して何らかのアニメーション化、または変更が予想されることを示します。
{{cssxref("custom-ident", "<custom-ident>")}}
まもなく要素で指定された名前のプロパティをアニメーション化、または変更されることが予想されることを示します。指定されたプロパティが一括指定プロパティの場合、それが展開されたすべてのプロパティが予想の対象となります。 unset, initial, inherit, will-change, auto, scroll-position, contents の値は指定できません。仕様では特定の値についての動作を定義していませんが、一般的に transform は合成レイヤーのヒントとなります。特定の CSS プロパティに対しては、 現在のところ Chrome は2つのアクションを取ります。新しい合成レイヤーを構築するか、または新しい{{Glossary("stacking context","重ね合わせコンテキスト")}}を構築します。

スタイルシートで

しかし、ページが大きく複雑なアルバムやスライドデッキプレゼンテーションのようなキー押下で遷移するアプリケーションの場合、スタイルシートに will-change を含めた方が適切なこともあります。これによって、ブラウザーは事前に切り替えの準備を行い、キーが押されるとすぐに、てきぱきとしたページ間の切り替えができます。しかし、スタイルシートで will-change プロパティを直接使用するのは注意してください。ブラウザーが必要なくなったメモリを最適化のために保存し続けることになる可能性があるからです。

.slide {
  will-change: transform;
}

公式定義

{{CSSInfo}}

形式文法

{{CSSSyntax}}

スクリプトから

これはスクリプトから 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';
}

仕様書

仕様書 状態 備考
{{SpecName('CSS Will Change', '#will-change', 'will-change')}} {{Spec2('CSS Will Change')}} 初回定義

ブラウザーの互換性

{{Compat("css.properties.will-change")}}

関連情報