will-changeとレイヤー昇格
will-changeを使って要素をGPUレイヤーへ昇格させるようブラウザーにヒントを与え、アニメーションを滑らかにします。
「will-changeとレイヤー昇格」はCoddyKit上の無料CSS Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCSS Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 CSS Academyコースには全4レッスンが含まれています。
will-changeとは
will-changeは、要素がアニメーションする予定であることをブラウザーに伝えるヒントです。これにより、アニメーション開始前に要素を独自のGPUコンポジターレイヤーへ昇格させるなど、最適化の準備をあらかじめ行えるようになります。
構文
変更されるプロパティを指定します。will-change: transform、will-change: opacity、will-change: transform, opacityのように記述します。アニメーション終了後にヒントを削除するには、will-change: autoを使用します。
使用するタイミング
実際にアニメーションする要素に対して、アニメーション中だけwill-changeを適用します。JavaScriptで(クラスを介して)追加と削除を行うほうが、静的な要素に設定したままにするより効率的です。
レイヤー昇格のコスト
昇格した各レイヤーはGPUメモリを消費します。多数の要素を同時に昇格させるとメモリに負荷がかかり、パフォーマンスが低下する可能性があります。特に、GPU RAMが限られているモバイルデバイスでは顕著です。昇格は必要な箇所に限定し、意図的に行ってください。
一括適用を避ける
will-changeを*や多数の要素に適用してはいけません。レイヤーを作りすぎると、最適化によるコストが効果を上回ります。まずプロファイルを取得し、特定のカクつきの問題が確認できた箇所にのみwill-changeを追加してください。
will-changeとtranslateZハックの比較
will-changeが登場する前は、開発者はtransform: translateZ(0)やtranslate3d(0,0,0)を使ってGPUへの昇格を強制していました。will-changeは、意図を意味的に表現する正しい方法です。translateZハックは今でも機能しますが、意図を表すものではなく、実装の詳細にすぎません。
スタッキングコンテキストへの副作用
昇格したレイヤーは新しいスタッキングコンテキストを作成します。これによりz-indexの動作が変わります。昇格した要素の子要素はドキュメントルートではなく、その要素を基準に重なり順が決まります。要素を昇格させる際は、スタッキングコンテキストの変化に注意してください。
動的に適用するパターン
mouseenter時またはアニメーション開始時にwill-changeを追加し、mouseleave時またはアニメーション終了時に削除します。これにより、アイドル状態の要素のためにGPUメモリを恒久的に消費することなく、ブラウザーに準備時間を与えられます。
<pre class="snippet">el.addEventListener("mouseenter", () => el.style.willChange = "transform");
el.addEventListener("mouseleave", () => el.style.willChange = "auto");</pre>レイヤー数のプロファイリング
Chrome DevTools → Layersパネルで、昇格したレイヤーを可視化できます。レイヤー数が多い(数百ある)場合は、過剰な昇格を示しています。MemoryセクションにはGPUメモリの使用量が表示されます。昇格したレイヤー数は最小限に抑え、ローエンドデバイスのプロファイルでも監視してください。
containプロパティという代替手段
CSSのcontain: layout paintは、分離と同様に、レイアウトとペイントの計算をサブツリー内に制限します。GPUレイヤーを作成せずに自己完結型のウィジェットのパフォーマンスを向上できるため、アニメーションしない要素にはwill-changeよりコストの低い最適化です。
ブラウザーのサポートと動作
will-changeは、すべての現代的なブラウザーで完全にサポートされています。ブラウザーはこれを命令ではなくヒントとして扱うため、リソースが不足している場合は無視することがあります。保証として依存せず、パフォーマンスに関する指針としてのみ使用してください。
理解度チェック
will-changeを多数の要素に同時に適用する主なリスクは何ですか。
まとめ
will-changeはアニメーション開始前に要素をGPUコンポジターレイヤーへ昇格させるため、アニメーション開始時の昇格コストをなくせます。プロファイリングでカクつきが確認された箇所にのみ、動的かつ控えめに適用し、過剰な昇格によるGPUメモリの過度な消費を避けてください。
よくある質問
「will-changeとレイヤー昇格」レッスンは無料ですか?
はい。「will-changeとレイヤー昇格」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、CSS Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 CSS Academyコースには全4レッスンが含まれています。
「will-changeとレイヤー昇格」で何を学びますか?
will-changeを使って要素をGPUレイヤーへ昇格させるようブラウザーにヒントを与え、アニメーションを滑らかにします。 ブラウザで直接実行するハンズオンコードでCSS Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
CSS Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCSS Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「will-changeとレイヤー昇格」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCSS Academyレッスンでコードを書いて実行できますか?
はい。すべてのCSS Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- クリティカルCSSとレンダリングブロック
- レイアウト・ペイント・コンポジット: レンダリングパイプライン
- will-changeとレイヤー昇格
- CSSカバレッジと未使用スタイル