こんにちは!フロントエンドの現場を渡り歩いているチーフアーキテクトの私です。
Webサイトを作っていて、「あれ、なんかスクロールがカクカクするな……」「スマホでアニメーションを動かすと、妙に重いな……」と頭を抱えた経験、ありませんか? 大丈夫です、その悩み、あなたが書いたコードのせいだけじゃないかもしれません。実は、Webブラウザの「裏側の仕組み」を知るだけで、そのカクカク劇的に解消できるんです。
今回は、ブラウザがヌルヌル動くための影の立役者、「コンポジタースレッド」の秘密を、身近な例えを交えながら優しく解き明かしていきましょう!
—
1. なぜWebはカクついてしまうのか?(メインスレッドの悲劇)
まず、ブラウザが画面を表示する仕組みを、大きなお店の「お会計レジ」に例えてみましょう。
Webブラウザの心臓部には、「メインスレッド」という名の、それはそれは働き者の店員さんが1人だけいます。この店員さんは大忙しです。
- HTMLを読み込んで構造を組み立てる(DOM構築)
- CSSを計算して見た目を決める(スタイル計算)
- JavaScriptを実行して、クリックイベントやデータ通信を処理する
……ね? パンクしそうでしょう?
画面をスクロールしたり、アニメーションを動かしたりしている最中に、もしこのメインスレッドで「重たいJavaScript(例えば、膨大なデータの計算など)」が走り出したらどうなるでしょう?
店員さんはJavaScriptの計算に手一杯になり、「お客さん、ちょっと待って! 今スクロールの処理どころじゃないんだよ!」と、画面の描き換えが止まってしまいます。これが、あのイライラする「カクつき(フレーム落ち)」の正体です。
—
2. 救世主登場!「コンポジタースレッド」とは何か?
「おいおい、店員1人じゃ限界だよ!」ということで、ブラウザの賢い頭脳は考えました。
「じゃあ、画面を動かす専用の『アルバイトスタッフ』をもう1人雇おう!」
この、画面のスクロールや簡単なアニメーションを専門に担当する独立した裏方スタッフこそが、今回主役の「コンポジタースレッド」です。
コンポジタースレッドは、メインスレッドがJavaScriptの計算で忙しくしていようとも、お構いなしに別動隊として動きます。
「ユーザーが画面をスクロールしたな? じゃあ、さっきメインスレッドから預かった絵のパーツ(レイヤー)を、シュッと上に動かせばいいんだな!」と、メインスレッドの手を煩わせることなく、超高速で画面をスライドさせてくれるのです。
だから、メインスレッドが重い処理でヒーヒー言っていても、コンポジタースレッドのおかげで画面のスクロールだけは驚くほど滑らかに動き続けるというわけなんですね。
—
3. コンポジタースレッドを味方につける魔法のCSS
さて、この優秀なコンポジタースレッドですが、彼らに仕事を頼むにはちょっとした「合言葉」が必要です。
デフォルトの状態では、ブラウザは「念のためメインスレッドで慎重に処理しよう」とサボりがち(?)です。そこで、私たち開発者が「この要素はコンポジタースレッドのアルバイト君に丸投げしてOKだよ!」と教えてあげる必要があります。
その魔法の合言葉が、CSSの `will-change` や `transform` です。
実際のコードで見てみましょう
例えば、マウスホバーで「ふわっと浮き上がるカード」を作るとします。これをメインスレッドに頑張らせるとカクつく原因になりますが、コンポジタースレッドにお願いするように書くとこうなります。
滑らかなアニメーション
このカードは、コンポジタースレッドの働きによって、重い処理中でもカクつかずにスムーズに動きます。
このコードの何がすごいの?
`transform: translateY()` や `opacity`(透明度の変更)といったプロパティは、ブラウザにとって「形や大きさを再計算しなくても、ただの写真(レイヤー)を動かすだけで表現できる」という特徴があります。
そのため、コンポジタースレッドはメインスレッドに助けを求めず、文字通り「絵の描かれた板をスライドさせるだけ」の軽ーい処理でアニメーションを完結させられるのです。これが、Webパフォーマンス向上の極意です。
—
4. チーフアーキテクトからの実践アドバイス
現場で後輩によく言うのですが、Webパフォーマンスの最適化は「メインスレッドをいかに暇にするか」のゲームです。
- 避けるべきこと: `top` や `left`、`width`、`height` などのプロパティをアニメーションさせてしまうこと。これらは「レイアウト(再計算)」という重い処理をメインスレッドに強いるため、確実にカクつきます。
- 目指すべきこと: 動かしたいときは常に `transform` や `opacity` を使い、コンポジタースレッドにお仕事をパスすること。
最初は覚えることが多いと感じるかもしれませんが、「あ、今裏でアルバイトのコンポジタースレッド君が頑張ってくれているんだな」とイメージできるようになると、コードを書くのがぐっと楽しくなりますよ。
もしサイトの動きにもやもやしたら、ブラウザの開発者工具(DevTools)の「Performance」タブを開いて、メインスレッドの様子をのぞいてみてくださいね。
それでは、快適なフロントエンドライフを!

コメント