こんにちは!フロントエンドの現場を長年歩んできたチーフアーキテクトの私です。
Webサイトを作っていて、「なんだか最近、スマホでスクロールするとカクカクするな…」「CSSを変えただけなのに、なんで画面全体が重くなるんだろう?」なんて悩んだ経験はありませんか?
私たちが普段何気なく書いているHTMLやCSS。ブラウザはこれをただ画面に映し出しているわけではありません。実は、裏側で「見えない巨大な下準備」を猛烈なスピードで行っています。
今回はその第一歩、「レンダーツリーの構築」について、難しい専門用語のジャングルを切り開いて、誰もが「なるほど!」と膝を打つような身近な例え話と一緒に紐解いていきましょう。
つまずきやすいポイントも「大丈夫ですよ、みんな最初はここでハマりますから」と優しくフォローしながら進めますので、コーヒーでも飲みながらリラックスして読んでくださいね。
—
1. そもそも「レンダーツリー」ってなに?(お買い物の例え)
Webブラウザが画面を表示する仕組みを、大きなおもちゃ屋さんで「クリスマスプレゼントのディスプレイ棚」を作るお仕事に例えてみましょう。
DOM(構造の設計図)と CSSOM(見た目の指示書)
- DOM(Document Object Model):お店に並べる「商品(HTMLタグ)」のリストと、その親子関係。
- CSSOM(CSS Object Model):店員さんたちが持っている「どの商品を、何色の棚に、どれくらいの大きさで飾るか」という指示書。
さて、お店のバックヤードには、お客さんには見せないものもたくさんありますよね。例えば、スタッフ専用の休憩室の椅子とか、「非表示(display: none;)」に設定された段ボール箱とか。
レンダラー(職人さん)の仕事
ブラウザのレンダリングエンジンという職人さんは、DOMとCSSOMを受け取ると、こう考えます。
> 「よし、お客さんに見えるものだけを組み合わせて、実際に店頭に並べる『ディスプレイの見本(レンダーツリー)』を作ろう!」
この、「画面に実際に描画されるものだけを厳選して組み合わせたツリー構造」こそが、今回主役のレンダーツリーなのです。
—
2. DOMとCSSOMが合体して「レンダーツリー」ができるまで
ここで、よくある初心者さんの勘違いポイントを一つ。
「DOM(HTML)とCSSOM(CSS)は、それぞれ別々に作られて、最後に合体するんだな」――その通り!大枠の流れは正解です。
しかし、ここで非常に重要な「ブラウザの裏側の真実」があります。それは、「画面に映らないものは、レンダーツリーの仲間に入れない」ということです。
レンダーツリーに含まれないもの・含まれるものの例
1. `` タグや、内部の `` タグ、 `
- これらはページの設定情報なので、画面のキャンバスには描画されません。DOMにはいますが、レンダーツリーにはパスされます(除外されます)。
2. `display: none;` が指定された要素
- 「あ、これ非表示ね」とブラウザが即座に判断するため、これもレンダーツリーからは綺麗さっぱり省かれます。
- ※一方、`visibility: hidden;` や `opacity: 0;` は「透明だけど、場所(空間)は確保してね」という意味なので、レンダーツリーには含まれます。ここ、よくテストに出る(実務でハマる)ポイントですよ!
つまり、レンダーツリーとは、「いま、この瞬間にユーザーの目に見えるものだけを集めた、超精鋭のVIPリスト」なのです。
—
3. ちょっと手を動かしてみましょう(実用的なコードと解説)
百聞は一見にしかず。私たちが書くコードが、どうやってこの世界を形作っているのか、シンプルなHTMLとCSSのサンプルで見てみましょう。
以下のコードをそのままコピーして、パソコンのデスクトップなどに `index.html` という名前で保存し、ブラウザで開いてみてください。
こんにちは、ブラウザの世界へようこそ!
ブラウザの開発者ツールで覗いてみよう
Google Chromeなどのブラウザを開き、今作ったファイルを読み込んだ状態で `F12キー`(Macなら `Option + Command + I`)を押して「開発者ツール(DevTools)」を開いてみてください。
「Elements」タブを見ると、HTMLの構造(DOM)がすべて表示されていますよね。
しかし、実際にブラウザが画面を描画するときに使っている「レンダーツリー」は、このDOMから `display: none` などを綺麗に削ぎ落とした、より洗練された状態で裏で計算されています。
—
4. なぜこの仕組みを知る必要があるの?(実務でのメリット)
「仕組みはわかったけど、これって実際のWeb制作で何の役に立つの?」と思いましたか?
実は、ここがプロのフロントエンドエンジニアの腕の見せ所なんです。
パフォーマンス向上への直結
例えば、JavaScriptを使って頻繁に要素を消したり表示したりするアニメーションを作るとします。
- `display: none` を頻繁にいじる場合:
要素が消えるたびに「レンダーツリーを作り直す(リフロー)」という、ブラウザにとって非常に重い処理が発生します。これが原因でスマホのスクロールがガクガクしたり、アニメーションがカクついたりします。
- `opacity` や `visibility` をいじる場合:
レンダーツリーの構造自体は変わらないため、ブラウザの負担が軽くなります。
「画面のちらつきをなくしたい」「サクサク動くモダンなサイトを作りたい」と思ったとき、このレンダーツリーの概念を知っているだけで、「どこをどう直せばブラウザが楽になるか」が手に取るようにわかるようになります。
—
最後に:つまずいても、大丈夫。
Webの仕組みは、最初は見えない世界の話ばかりで少し難しく感じるかもしれません。「あれ、私の書いたCSSが効かないな?」という時も、頭の中で「あ、いまDOMとCSSOMのすれ違いが起きているのかな?」「レンダーツリーにうまく乗っかってないのかな?」と想像できるようになると、エラーを直す時間が劇的に楽しくなります。
一歩一歩、確実に自分の血肉にしていきましょう。
あなたの素晴らしいWeb制作の旅を、私はいつも応援しています!

コメント