will-change
will-change は CSS のプロパティで、どのような要素の変更が予測されているかブラウザーに助言します。ブラウザーは要素が実際に変更される前に、最適化をセットアップすることができます。この種の最適化は、実際に変化が求められる前に、潜在的に高コストの処理を行うことで、ページの応答を向上させることができます。
警告: will-change は既存の性能問題を扱うための最終解決手段として使用することを意図しています。予想されるパフォーマンス問題に使用しないでください。
このプロパティを適切に使用するには、少々注意が必要です。
will-change を多くの要素に適用しすぎないでください。 ブラウザーはすでに可能な限りすべての最適化を試みています。 will-change を試みるような強力な最適化は、大量のマシンリソースを使ってしまい、使い切ってしまった場合、ページの速度の低下や多量のリソース消費を引き起こします。
控えめに使用してください。 最適化においてブラウザーが行う通常の動作は、可能な限り早く最適化を解除して、通常に戻すことです。しかし、スタイルシートに直接 will-change を追加することは、対象の要素の変更が間近であることを示し続けることであり、ブラウザーはそうでない場合よりも長い間最適化を維持し続けなければなりません。そのため、変化が発生する前後にスクリプトコードを使って will-change のオン/オフを切り替えることを習慣づけると良いでしょう。
事前の最適化を行うために will-change を要素に適用しないでください。 ページが良く動作している場合、少々のスピードアップのためだけに will-change プロパティを要素に追加しないでください。 will-change は既存のパフォーマンス問題を扱うための最終手段として使われるべきものです。そのため、パフォーマンス問題に先んじて使うべきではありません。 過度な will-change の使用は、過度にメモリを消費するとともに、ブラウザーが起こりうる変化に対する準備をしようとすることで、より複雑なレンダリングが発生する原因となります。これはパフォーマンスの悪化につながります。
処理するために十分な時間を与えてください。 このプロパティは、ユーザーエージェントに変更する可能性のあるプロパティについて事前に通知するための方法として用意されています。そして、ブラウザーは、プロパティの変更が実際に発生する前に、プロパティの変更に必要な事前最適化の適用を選択できます。そのため、ブラウザーに実際の最適化を行うためのいくばくかの時間を与えることが重要になります。少なくとも少し早めに何らかの変更が行われることを予測する方法を見つけてから、will-change を設定してください。
重ね合わせコンテキストを生成するプロパティ値 (例えば will-change: opacity) を、手前に生成される重ね合わせコンテキストとして使用する場合、will-change は実際に要素の視覚的な表現に影響を与える可能性があることに注意してください。
対応ブラウザ
| 機能 | デスクトップ | モバイル | ||||
|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Safari | Chrome Android | Safari iOS | |
| 36 | 79 | 36 | 9.1 | 36 | 9.3 | |
auto | 36 | 79 | 36 | 9.1 | 36 | 9.3 |
contents | 36 | 79 | 36 | 9.1 | 36 | 9.3 |
scroll-position | 36 | 79 | 36 | 9.1 | 36 | 9.3 |
基本構文
/* Optimize hover animations */
.card:hover {
will-change: transform;
}
.card:active {
transform: scale(0.98);
}
/* Apply and remove dynamically via JS */
.animating {
will-change: transform, opacity;
} ライブデモ
実務での使いどころ
-
スクロール連動アニメーション
スクロールに連動して要素を動かすアニメーションのカクつきを軽減する。
注意点
- will-change を常時指定するとメモリを余分に消費する。必要な時だけ付与し、アニメーション完了後に解除する。
- 過度に使用するとパフォーマンスが逆に悪化する。本当に必要な要素にのみ使用する。
アクセシビリティ
- パフォーマンス最適化により、低スペックデバイスでもスムーズなアニメーションを提供できる。