独学で極める “Webデザイン”の技と心
第10回 CSS Spritesでサイトを高速化
今日は,CSSを使ってサイトを高速化するテクニック「CSS Sprites(CSSスプライト)」についてのお話をさせていただきます。
サイトの高速化というと,プログラムの最適化を行ったり,サーバのチューニングを行ったりというイメージがあるかと思います。実はCSSを上手に使うことによっても,サイトの高速化を行うことができます。しかも,かなりの効果が期待できるのです。
CSS Spritesとは?
通常,ウェブページを制作する場合,デザインファイル(psdやpngなどの画像)をスライスし,HTMLのimg要素として埋め込んだり,CSSの背景画像として指定していることと思います。
それらの画像を一つにまとめ,1度の読み込みでのリクエスト数を減らすテクニックのことを「CSS Sprites」と呼びます。
このテクニックは,以前からマウスオーバーメニューを実現する際にも使われていたものでもありますが,YouTubeのプレーヤーやGoogleなど,大手サイトでもこのテクニックが使われるようになり,CSS Spritesの名前と共に注目を集めるようになりました(※1)。
- ※1)
- 英文記事ですが,CSS Spritesの記事(CSS Sprites: What They Are, Why They’re Cool, and How To Use Them)が参考になります。
CSSを工夫することで,サイトを高速化できる具体的な事例
まずは先日私の会社からリリースしましたTwister Alternativeの事例から,CSS Spritesの仕組みと使い方を解説します。
下の画像は,Twister Alternativeで利用しているCSS Sprites用の画像の一部です(解説用に画像の一部だけを表示しています)。
ご覧のとおり,ロゴやメニュー用アイコン・マウスオーバー時の画像やフォームのボタンまであらゆる画像をひとつにしています。
通常の画像指定を行った場合のソースコードサンプル
例えば,一つの(原寸)画像でロゴを表現する場合,以下2つの方法がよく使われてきました。
(X)HTMLのimg要素で指定
<div id="logo">
<a href="/"><img src="/images/logo.png" alt="Twister Alternative" /></a>
</div>
CSSのbackgroundプロパティで指定
(X)HTML(テキストを画像に置換するため,意味のないspan要素を与えている,※2)
<div id="logo"><a href="/"><span>Twister Alternative</span></a></div>
CSS
div#logo a {
width: 222px; /*画像の横幅*/
height: 66px; /*画像の高さ*/
background-image: url(/images/list.png);
background-repeat: no-repeat;
}
div#logo a span {
display: none; /*テキストを消してa要素の背景だけを見えるようにする*/
}
- ※2 画像置換の手法にはspanを入れない方法も含め他にもありますが,ここでは割愛させていただきます。
CSS Spritesの場合のソースコードサンプル
(X)HTML
<div id="logo"><a href="/"><span>Twister Alternative</span></a></div>
CSS
div#logo a {
width: 222px; /*画像の横幅*/
height: 66px; /*画像の高さ*/
background-image: url(/images/sprite.png);
background-repeat: no-repeat;
background-position: 0 -34px; /* CSS Sprites用の画像のうち,どの場所の画像を出すのか座標 x軸,y軸の順に指定*/
}
仕組みはとてもシンプルです。一枚の画像のなかから,表示させたい部分の座標をbackground-positionプロパティで指定するだけです。
このサンプルのロゴ部分は,キャンバスの左上を基点としてx軸方向に0px,y軸方向に34pxずれた場所にあるので,background-positionの値は0 -34pxとなります。
このように,背景画像を指定したい要素に対して,ひとつひとつ座標を指定していきます。座標を正確に取得できるソフトであれば作業がやりやすいと思います(※3)。
- ※3
- Fireworksは選択したビットマップアイテムの座標がすぐに把握できるのでおすすめです。
CSS Sprites化できない場合と制約
リピート用画像は別にする
リピートさせるための背景画像は,Sprites用の画像に統合せず別の画像に分ける必要があります。
Windows IE6に対応するための制約
CSS Sprites用の統合画像が,アルファチャンネルを持った透過画像となっている場合,そのままではWindows IE6で正しく表示できません。
IE6でもアルファチャンネル画像を表示するためのhtcファイルや独自拡張・javascriptライブラリなどがありますが,大きな画像の特定の部分だけを表示することができないため現実的ではありません。
- IE6用の解決策
- 見た目に問題のない範囲内で色数を落とし,アルファチャンネルのない透過画像にする
- 高度な透過が必要のないデザインにする
体感速度の向上
Twister AlternativeにおいてCSS Spritesを利用する前と後では,数字だけでなく体感速度が格段に向上し,CSSと画像の工夫だけでこんなに速くなるのだなと驚きました。ぜひとも一度実践していただくことをおすすめします。
Firefoxの拡張「YSlow」を使うと,閲覧中のページで読み込まれているファイルサイズをグラフ表示できるので,どれだけ速くなっているか確認もできます。
もっと具体的なサンプル・問題点は私の会社のブログでもご紹介していますのであわせてご覧ください。
独学で極める “Webデザイン”の技と心
- 2010年8月第4週号 1位は,CSS3のメディアクエリの使い方,気になるネタは,コクヨ,iPad 1500台導入
- 2010年7月第3週号 1位は,時間の節約になるWeb制作関連ツール 12+1,気になるネタは,iPad人気で新ビジネス 本のスキャン代行,違法?
- 2010年5月第2週号 1位は,ミニマルなWebデザインのための法則,気になるネタは,i文庫HDとiBook
- 2010年4月第1週号 1位は,バナー広告をデザインするためのヒントいろいろ,気になるネタは,渋谷駅にツイッター連動広告
- 2010年2月第4週号 1位は,すばらしいCSS3のチュートリアル&テクニック集,気になるネタは,Google「リアルタイム検索」が日本語対応
-
独学で極める “Webデザイン”の技と心:第10回 CSS Spritesでサイトを高速化|gihyo.jp … 技術評論社
CSS Spritesの具体的な使い方。
背景リピートは別画像にする必要がある点に注意が必要。Tracked : #3 pligg.com (2009/04/07, 21:41)
-
CSS Spriteを使う際の注意事項
CSS Spriteについてちょっと思ったこと。 CSS Spriteは、ページ...
Tracked : #2 OPQR.jp : WebサービスとWebデザインについて考えてみる; (2009/01/22, 18:49)
-
RPGツクール画像を使ってマップスクロール(CSS SPRITE)
CSS SPRITEというテクがある。通常、Webサイトには多数の画像を表示しているが、その画像を一枚の画像としてまとめたものを読み込み、CSSのbackground-imageやbackground-positionを用いて、画像の必要な箇所にCSSで画像を表示する、というものである。
DesignWalkerさんに...Tracked : #1 まねきねこプロジェクト|開発ブログ (2008/11/04, 20:38)


