--- title: will-change slug: Web/CSS/will-change tags: - CSS - CSS プロパティ - CSS 変更予定 - Reference - 'recipe:css-property' - transition - トランジション translation_of: Web/CSS/will-change ---
CSS の will-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;
このプロパティを適切に使用するには、少々注意が必要です。
will-change を多くの要素に適用しすぎないでください。ブラウザーはすでに可能な限りすべての最適化を試みています。 will-change
を試みるような強力な最適化は、大量のマシンリソースを使ってしまい、使い切ってしまった場合、ページの速度の低下や多量のリソース消費を引き起こします。
控えめに使用してください。最適化においてブラウザーが行う通常の動作は、可能な限り早く最適化を解除して、通常に戻すことです。しかし、スタイルシートに直接 will-change
を追加することは、対象の要素の変更が間近であることを示し続けることであり、ブラウザーはそうでない場合よりも長い間最適化を維持し続けなければなりません。そのため、変化が発生する前後にスクリプトコードを使って will-change
のオン/オフを切り替えることを習慣づけると良いでしょう。
事前の最適化を行うために will-change を要素に適用しないでください。 ページが良く動作している場合、少々のスピードアップのためだけに will-change
プロパティを要素に追加しないでください。 will-change
は既存のパフォーマンス問題を扱うための最終手段として使われるべきものです。そのため、パフォーマンス問題に先んじて使うべきではありません。 過度な will-change
の使用は、過度にメモリを消費するとともに、ブラウザーが起こりうる変化に対する準備をしようとすることで、より複雑なレンダリングが発生する原因となります。これはパフォーマンスの悪化につながります。
処理するために十分な時間を与えてください。このプロパティは、ユーザーエージェントに変更する可能性のあるプロパティについて事前に通知するための方法として用意されています。そして、ブラウザーは、プロパティの変更が実際に発生する前に、プロパティの変更に必要な事前最適化の適用を選択できます。そのため、ブラウザーに実際の最適化を行うためのいくばくかの時間を与えることが重要になります。少なくとも少し早めに何らかの変更が行われることを予測する方法を見つけてから、will-change
を設定してください。
重ね合わせコンテキストを生成するプロパティ値 (例えば will-change: opacity) を、手前に生成される重ね合わせコンテキストとして使用する場合、will-change は実際に要素の視覚的な表現に影響を与える可能性があることに注意してください。
auto
<animateable-feature>
は次の値のいずれかである場合。
scroll-position
contents
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}}
これはスクリプトから 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")}}