JA EN

CSS スプライトの作り方と最適化 - HTTP リクエスト削減の実践テクニック

· 約 9 分で読めます

CSS スプライトとは - 複数画像を 1 枚にまとめる技術

CSS スプライトとは、複数の小さな画像 (アイコン、ボタン、装飾パーツなど) を 1 枚の大きな画像にまとめ、CSS の background-position プロパティで表示位置を制御する技術です。名前の由来はゲーム開発で使われる「スプライトシート」から来ています。ファミコンやスーパーファミコンの時代から、キャラクターのアニメーションフレームを 1 枚のシートにまとめる手法が使われていました。

Web 開発においてスプライトが重要視される理由は、HTTP リクエスト数の削減にあります。ブラウザが Web ページを表示する際、各画像ファイルに対して個別の HTTP リクエストが発生します。アイコンが 30 個あれば 30 回のリクエストが必要ですが、スプライトシートにまとめれば 1 回のリクエストで済みます。HTTP/1.1 環境では同時接続数に制限 (通常 6 本) があるため、リクエスト数の削減はページ読み込み速度に直結します。

HTTP/2 や HTTP/3 の普及により、多重化 (multiplexing) によって同時リクエストの制限は緩和されました。しかし、スプライトには依然としてメリットがあります。個別ファイルのオーバーヘッド (ヘッダー情報、TLS ハンドシェイク) を削減できること、ブラウザキャッシュの効率が向上すること、そして画像の合計サイズが個別ファイルの合計より小さくなる場合が多いことです。特にアイコンセットのように類似した色調・サイズの画像群では、圧縮効率の向上が顕著です。

スプライトシートの設計原則 - 効率的なレイアウト戦略

スプライトシートを作成する際、画像の配置方法がパフォーマンスと保守性に大きく影響します。無計画に画像を並べると、CSS の記述が複雑になり、後からの追加・変更が困難になります。

設計時に考慮すべき重要なポイントとして、余白 (padding) の確保があります。各画像の間に最低 1-2px の余白を設けないと、background-size でスケーリングした際に隣接画像がはみ出して表示される問題が発生します。Retina ディスプレイ対応で 2 倍サイズのスプライトを縮小表示する場合は、余白を 2-4px に拡大することを推奨します。

また、将来の拡張性を考慮し、シートの右端や下端にアイコン追加用のスペースを確保しておくと、既存の座標を変更せずに新しいアイコンを追加できます。

スプライトシートの作成方法 - ツールとワークフロー

スプライトシートの作成には、手動で画像編集ソフトを使う方法と、自動生成ツールを使う方法があります。プロジェクトの規模と更新頻度に応じて適切な方法を選択します。

自動生成ツール (推奨):

手動作成 (小規模プロジェクト向け):

Figma や Photoshop でアートボードを作成し、グリッドに沿ってアイコンを配置します。書き出し時は PNG-8 (256 色以下のアイコン) または PNG-24 (グラデーションを含むアイコン) を選択します。座標は手動で CSS に記述する必要があるため、アイコン数が 20 個を超える場合は自動生成ツールへの移行を検討してください。

SVG スプライト (モダンな代替手段):

ベクター形式のアイコンには SVG スプライトが適しています。<symbol> 要素で各アイコンを定義し、<use> 要素で参照する方式です。CSS スプライトと異なり、色やサイズを CSS で自由に変更でき、Retina 対応も不要です。svg-spritesvgo などのツールで自動生成できます。

CSS での実装テクニック - background-position の活用

スプライトシートから個別の画像を表示するには、CSS の background-imagebackground-positionwidthheight を組み合わせます。基本的な実装パターンを見ていきましょう。

基本構造として、共通のクラスでスプライトシートを指定し、個別のクラスで位置とサイズを指定します。.icon { background-image: url('sprites.png'); background-repeat: no-repeat; display: inline-block; } を共通スタイルとし、.icon-home { width: 24px; height: 24px; background-position: 0 0; } のように各アイコンの座標を指定します。

Retina ディスプレイ対応:

高解像度ディスプレイでは、通常サイズの 2 倍 (または 3 倍) の画像を用意し、background-size で縮小表示します。例えば 24x24px のアイコンを Retina 対応する場合、48x48px で描画したスプライトシートを用意し、background-size: 元のシート幅の半分 auto; と指定します。これにより、高解像度ディスプレイでもシャープな表示が得られます。

SCSS/Sass での効率化:

スプライトの座標管理を SCSS の変数やミックスインで抽象化すると、保守性が大幅に向上します。$icon-home: 0px 0px 24px 24px; のように座標とサイズを変数化し、@mixin sprite($icon) { ... } で展開するパターンが一般的です。spritesmith は SCSS テンプレートの自動生成にも対応しています。

ホバー・アクティブ状態の実装:

ボタンやリンクのホバー状態をスプライトで実装する場合、通常状態とホバー状態の画像を同じスプライトシートに含め、:hover 疑似クラスで background-position を切り替えます。この方法なら、ホバー時に新しい画像を読み込む必要がないため、初回ホバー時のちらつき (FOUC) を防止できます。

スプライトの最適化 - ファイルサイズと表示速度の改善

スプライトシートを作成しただけでは最適化は不十分です。ファイルサイズの削減と表示パフォーマンスの向上のために、追加の最適化を施します。

画像フォーマットの選択:

圧縮ツールの活用:

PNG の場合、pngquant (減色ツール) と optipng (メタデータ除去 + 再圧縮) の組み合わせで 40-70% のサイズ削減が可能です。pngquant --quality=65-80 sprites.png で減色し、optipng -o7 sprites.png で最適化します。視覚的な品質劣化はほとんど知覚できません。

不要な余白の除去:

スプライトシートの右端や下端に大きな余白が残っている場合、画像全体のサイズが無駄に大きくなります。自動生成ツールのパッキングアルゴリズムを活用するか、最終的なシートをトリミングして余白を最小化します。ただし、将来のアイコン追加を見越して意図的に余白を残す場合は、この最適化をスキップします。

キャッシュ戦略:

スプライトシートのファイル名にハッシュ値を含める (sprites.a3f2b1.png) ことで、長期キャッシュ (1 年) を設定しつつ、更新時には確実に新しいファイルが配信されます。Webpack の [contenthash] や Vite のアセットハッシュ機能を活用します。

CSS スプライトの現在と代替技術 - 2026 年の選択肢

CSS スプライトは 2010 年代前半に全盛期を迎えましたが、現在は複数の代替技術が登場しています。プロジェクトの要件に応じて、最適な手法を選択することが重要です。

SVG アイコンシステム:

現在のアイコン実装で最も推奨される方法です。SVG はベクター形式のため解像度に依存せず、CSS で色やサイズを自由に変更できます。<svg><use href="#icon-name"></use></svg> の形式で参照し、アイコンフォントのような柔軟性と、画像スプライトのようなパフォーマンスを両立します。アクセシビリティの面でも、aria-label<title> 要素で意味を付与しやすい利点があります。

アイコンフォント:

Font Awesome や Material Icons に代表されるアイコンフォントは、CSS の colorfont-size でスタイリングできる手軽さが魅力です。しかし、アクセシビリティの問題 (スクリーンリーダーでの読み上げ)、サブピクセルレンダリングによるぼやけ、多色アイコンの非対応などの制約があり、新規プロジェクトでは SVG への移行が進んでいます。

HTTP/2 環境での個別ファイル配信:

HTTP/2 のマルチプレキシングにより、多数の小さなファイルを効率的に配信できるようになりました。個別の PNG/SVG ファイルをそのまま配信しても、HTTP/1.1 時代ほどのペナルティはありません。ただし、ファイル数が 100 を超える場合や、初回訪問時のパフォーマンスを重視する場合は、依然としてスプライトやバンドルが有効です。

CSS スプライトが依然として有効なケース:

結論として、新規プロジェクトでは SVG スプライトを第一選択とし、ラスター画像が必要な場合にのみ CSS スプライトを検討するのが 2026 年時点での最適解です。

関連記事

レスポンシブ画像の実装ガイド - srcset, sizes, picture 要素の完全解説

デバイスの画面サイズや解像度に応じて最適な画像を配信するレスポンシブ画像の実装方法を、コード例とともに詳しく解説します。

Web 用画像のファイルサイズ最適化戦略 - 品質を保ちながら軽量化する技術

Web パフォーマンスを最大化するための画像ファイルサイズ最適化手法を、フォーマット選択からメタデータ除去まで体系的に解説します。

スプライトシートアニメーションの実装 - CSS と JavaScript による効率的なフレーム制御

スプライトシートを使った Web アニメーションの実装方法を解説。CSS steps() 関数や JavaScript による精密なフレーム制御、パフォーマンス最適化のテクニックを具体的なコード例とともに紹介します。

favicon の作り方完全ガイド - ICO, SVG, PNG の使い分け

favicon の仕組みから、ICO, SVG, PNG 各フォーマットの特徴、ダークモード対応、各ブラウザの対応状況まで実践的に解説します。

Data URI で画像を埋め込む技術と注意点 - Base64 エンコードの仕組みと最適な使いどころ

Data URI スキームで画像を HTML/CSS に直接埋め込む技術を解説。Base64 エンコードの仕組み、パフォーマンスへの影響、適切なユースケースと避けるべきケースを整理します。

ベクター vs ラスター - 画像形式の使い分けガイド

ベクター画像とラスター画像の違いを仕組みから解説。ロゴ、写真、Web デザインなど用途別に最適な形式の選び方を具体的に紹介します。

関連用語