レイアウト・ペイント・コンポジット: レンダリングパイプライン
ブラウザーのレイアウト、ペイント、コンポジットのパイプラインを理解し、スタイル変更のコストを予測します。
「レイアウト・ペイント・コンポジット: レンダリングパイプライン」はCoddyKit上の無料CSS Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCSS Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 CSS Academyコースには全4レッスンが含まれています。
3つのレンダリング段階
レンダーツリーが構築されると、ブラウザーは3つの段階を実行します。Layout(要素のサイズと位置の計算)、Paint(色、テキスト、画像でピクセルを塗りつぶす処理)、Composite(ペイントされたレイヤーを組み合わせて画面に表示する処理)です。
レイアウト(リフロー)
レイアウトでは、すべての要素のジオメトリ(width、height、x/y位置)を計算します。ジオメトリに影響するプロパティ(width、margin、padding、font-size、position)を変更すると、その要素と、場合によってはサブツリー全体でレイアウトが発生します。これは最も負荷の高い段階です。
ペイント
ペイントでは、各レイヤーのピクセルを塗りつぶします。対象は背景、境界線、テキスト、影です。color、background-color、visibility、border-radiusを変更すると、再レイアウトなしで再ペイントが発生します。レイアウトよりは低コストですが、広い領域を再ペイントすると依然として負荷が高くなります。
コンポジット
コンポジターはGPUを使ってレイヤーを合成します。transformとopacityのようにコンポジット処理だけに影響するCSSプロパティは、レイアウトやペイントを発生させずにアニメーションできます。GPUが処理するため、CPUの関与を最小限に抑えながら60fpsで動作します。
CSS Triggersリファレンス
csstriggers.com(現在はブラウザー側のドキュメント)では、各ブラウザーエンジンでどのCSSプロパティがレイアウト、ペイント、コンポジットのどれを発生させるかを説明しています。アニメーションに使うプロパティの監査に利用してください。アニメーションにはtransformとopacityを優先します。
レイアウトスラッシング
レイアウトスラッシングは、JavaScriptがループ内でレイアウトプロパティ(offsetWidth)の読み取りとスタイルプロパティの書き込みを交互に行うと発生します。書き込みのたびにレイアウトが無効になり、読み取りのたびに同期的なリフローが強制されます。スラッシングを避けるため、すべての読み取りを先に行い、その後ですべての書き込みを行います。
<pre class="snippet">// BAD: read-write-read-write loop
elements.forEach(el => { const w = el.offsetWidth; el.style.width = w + 10 + "px"; });
// GOOD: batch reads then writes</pre>コンポジターのみで処理されるプロパティ
要素が独自のレイヤーにある場合、コンポジターだけで完全に処理されるのはtransformとopacityです。left/topなど他のプロパティをアニメーションさせると、メインスレッドでレイアウトまたはペイントが発生し、カクつきの原因になる可能性があります。
GPUレイヤーの生成
ブラウザーは、will-change: transformが指定されている要素、transform/opacityのCSSアニメーションがある要素、コンポジット対象の近接要素を持つ固定位置の要素、または3D transformを持つ要素を独自のGPUレイヤーに昇格させます。各レイヤーはGPUメモリを使用するため、レイヤーが多すぎるとメモリへの負荷が高くなります。
ペイントストームを回避する
ペイントストームは、毎フレームでページの大部分が再描画されると発生します。Chrome DevTools → Rendering → Paint flashing でプロファイルを取得し、再描画されている領域を特定します。頻繁にアニメーションする要素を専用レイヤーに分離して、再描画領域を限定します。
DevToolsのPerformanceパネル
Chrome DevToolsでパフォーマンスプロファイルを記録します。フレームチャートには、Layout、Update Layer Tree、Paint、Compositeの各イベントが表示されます。LayoutやPaintのバーが長い場合は、ボトルネックがあることを示します。60fpsを維持するには、フレーム時間を16ms未満にすることを目指します。
実践的なアニメーションのガイドライン
可能な限り、transformとopacityを使ってアニメーションさせます。表示アニメーションではwidth/heightの代わりにclip-pathを使用します。現代のブラウザーでは、clip-pathはコンポジターで処理しやすいためです。box-shadowのアニメーションは避け、代わりにopacityと、あらかじめ影を描画した擬似要素を使用します。
理解度チェック
レイアウトやペイントを発生させずにアニメーションできるCSSプロパティを2つ挙げてください。
まとめ
レンダリングパイプラインであるLayout、Paint、Compositeが、アニメーションのパフォーマンスを決定します。Layoutが最も高コストで、Paintは中程度です。Compositeのみで処理されるプロパティ(transform、opacity)はGPUで処理されます。これらのトリガーを理解すると、レイアウトスラッシングやペイントストームを発生させず、滑らかな60fpsのアニメーションを構築できます。
AI チューターと学ぶ CSS — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 40
- レッスン
- 159
よくある質問
「レイアウト・ペイント・コンポジット: レンダリングパイプライン」レッスンは無料ですか?
はい。「レイアウト・ペイント・コンポジット: レンダリングパイプライン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、CSS Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 CSS Academyコースには全4レッスンが含まれています。
「レイアウト・ペイント・コンポジット: レンダリングパイプライン」で何を学びますか?
ブラウザーのレイアウト、ペイント、コンポジットのパイプラインを理解し、スタイル変更のコストを予測します。 ブラウザで直接実行するハンズオンコードでCSS Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
CSS Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCSS Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「レイアウト・ペイント・コンポジット: レンダリングパイプライン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCSS Academyレッスンでコードを書いて実行できますか?
はい。すべてのCSS Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- クリティカルCSSとレンダリングブロック
- レイアウト・ペイント・コンポジット: レンダリングパイプライン
- will-changeとレイヤー昇格
- CSSカバレッジと未使用スタイル