CSS 速習チュートリアル

CSS パフォーマンス

1. なぜ CSS パフォーマンスが重要なのか?

CSS は「レンダリングブロック(Rendering Blocking)」リソースです。ブラウザは CSS ファイルをすべてダウンロードし、解析(パース)して CSSOM (CSS Object Model) を構築するまで、ページのレンダリングを開始できません。

非効率な CSS は、ページの表示速度を低下させ、ユーザーの離脱率を高める原因となります。最適化された CSS を記述することで、LCP (Largest Contentful Paint) などのコアウェブバイタル指標を改善し、スムーズなユーザー体験(UX)を提供できます。

2. セレクタの効率化

ブラウザは CSS セレクタを右から左(Right-to-Left)へ読み込みます。

例えば div ul li a というセレクタがある場合、ブラウザはまずページ上のすべての <a> 要素を探し、次にそれが <li> の中にあるか、さらに <ul><div> と順番に親を遡ってチェックします。

2.1 セレクタの複雑さを避ける

深くネストされたセレクタは、ブラウザの計算負荷を増大させます。

/* 非効率:ブラウザの計算コストが高い */
div.container section.main-content ul.nav-list li.item a.link {
  color: blue;
}

/* 効率的:クラスを直接指定する */
.nav-link {
  color: blue;
}
  • ID セレクタ (#id) クラスセレクタ (.class) は、ブラウザが要素を特定する速度が最も速いため、優先的に使用しましょう。
  • ユニバーサルセレクタ (*) を他のセレクタと組み合わせて使用することは、パフォーマンス上の観点から避けるべきです。

3. CSS ファイルの軽量化 (Minification)

本番環境にデプロイする際は、CSS ファイルをミニファイ(Minification)することが不可欠です。

ミニファイによって、コード内の不要な空白、改行、コメントが削除され、ファイルサイズが劇的に削減されます。

/* ミニファイ前 */
.header {
  margin: 10px;
  color: #ff0000;
}

/* ミニファイ後 */
.header{margin:10px;color:red}

さらに、サーバー側で GzipBrotli による圧縮を有効にすることで、ネットワーク転送量をさらに抑えることが可能です。

4. クリティカル CSS (Critical CSS)

ユーザーがページを開いた際に最初に見える領域(ファーストビュー / Above the fold)をスタイリングするための CSS を「クリティカル CSS」と呼びます。

4.1 レンダリングの高速化

クリティカル CSS を HTML の <head> 内に直接 <style> タグでインライン化し、残りのメイン CSS ファイルを非同期で読み込ませる手法が有効です。これにより、最初のレンダリングまでの時間を大幅に短縮できます。

<head>
  <style>
    /* クリティカル CSS:ファーストビューに必要なスタイルのみ */
    .header, .hero-section { display: block; }
  </style>
  <link rel="preload" href="style.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
</head>

5. @import を使用しない

CSS ファイルの中で @import ルールを使用すると、ブラウザはスタイルシートを並列でダウンロードできなくなります。

/* 推奨されない:読み込みがシリアル(逐次的)になる */
@import url("base.css");
@import url("layout.css");

代わりに、HTML 内で複数の <link> タグを使用してください。これにより、ブラウザはファイルを並列にダウンロードできます。

6. リフロー (Reflow) とリペイント (Repaint)

JavaScript やホバーエフェクトなどでスタイルを動的に変更する際は、リフローリペイントに注意が必要です。

  • リフロー: 要素のサイズや配置が変更され、レイアウトを再計算すること。非常に高コストです。
  • リペイント: 要素の色や視認性が変更され、画面に再描画すること。

6.1 GPU 加速の活用

アニメーションを実装する際は、widthtop を変更するのではなく、transformopacity を使用しましょう。これらは GPU(グラフィックスプロセッサ)で処理されるため、リフローを発生させず、滑らかな動作を実現できます。

/* 低速:リフローが発生する */
.box:hover {
  margin-left: 20px;
}

/* 高速:GPU 加速が効く */
.box:hover {
  transform: translateX(20px);
}

7. 実戦的なチェックリスト

CSS パフォーマンスを最適化するための主要なポイントをまとめました。

項目アクション
セレクタID やクラスを使い、ネストを浅く保つ
ファイル管理本番環境では必ずミニファイを適用する
読み込み@import を避け、<link> タグで並列読み込みを行う
アニメーションtransformopacity を優先して使用する
Web フォントfont-display: swap を使用してテキストの表示を優先する