FIG-066

ブラウザの描画パイプライン — どこからやり直すか

ブラウザ 2026.06.26 公開 読了 約11分

ブラウザは、受け取ったHTMLとCSSをいきなり画面に出しているわけではありません。決まった工程を順に通って、はじめてピクセルになります。HTML→DOM、CSS→CSSOMを作り、両者を合わせたRender Treeから、Layout(配置)→Paint(塗り)→Composite(合成)へ。この流れがレンダリングパイプラインです。

大事なのは、表示後に何かを変えると、変えた内容しだいで「どの工程からやり直すか」が変わること。そしてこれが、なめらかなUIを作れるかどうかを分けます。下の図1で、まず「初回レンダリング」を実行し、次に3種類の変更を試して、再実行されるステージの数を見比べてください。

RENDERING PIPELINE — 上流が変わると下流もやり直し
DOM HTMLを解析
CSSOM CSSを解析
Render Tree 表示要素を合成
Layout 位置と大きさを計算
Paint ピクセルを塗る
Composite レイヤーを合成
▼ 画面の結果
BOX
READY
まず「初回レンダリング」を実行
HTMLとCSSから、DOM・CSSOMを作り、Render Tree→Layout→Paint→Composite と進んで画面ができます。実行後、下の3つの変更ボタンを押してみてください。
図1 — width は Layout から、color は Paint から、transform は Composite だけで済む

「どこからやり直すか」が速さを決める

パイプラインは上流から下流への一方通行です。だから上流の工程が変わると、それより下流はすべてやり直しになります。要素の幅や位置(width・top など)を変えると、配置が崩れるのでLayoutからやり直し(Layout→Paint→Composite)。色や影(color・background)だけなら配置は変わらないのでLayoutを飛ばしてPaintから。そしてtransformやopacityは、塗り終わったレイヤーをずらして重ねるだけなのでCompositeだけで済みます。

この差は体感に直結します。Layoutのやり直し(リフロー)は重く、要素が多いほど時間がかかります。一方Compositeは多くの場合GPUに任せられるので、毎秒60回の更新でもなめらか。だからアニメーションは leftwidth ではなく transformopacity で動かすのが定石なのです。図1で各ボタンを押すと、再実行されるステージの数が 3→2→1 と減っていくのが分かります。

用語ミニ辞書
DOM / CSSOM
HTMLとCSSをそれぞれ木構造に解析したもの。合わせてRender Treeを作る。
Layout(リフロー)
各要素の位置と大きさを計算する工程。幅や配置が変わると再計算が必要で重い。
Paint
色・文字・影などを実際のピクセルに塗る工程。色変更はここからやり直す。
Composite
塗ったレイヤーを重ねて最終画面にする工程。transform/opacityはここだけで済む。

まとめ

ブラウザはDOM・CSSOM → Render Tree → Layout → Paint → Compositeという一方通行の工程で画面を作ります。再描画のコストは「どの工程から、やり直すか」で決まり、Layout(幅・位置) > Paint(色) > Composite(transform)の順に軽くなります。なめらかに動かしたいなら、Layoutを避けてtransform/opacityに寄せる――この一点を押さえるだけで、UIのカクつきは大きく減ります。