簡単なCSSスプライトの作成
CSSスプライトは、ページ読み込みを高速化する目的で使われるテクニックで、多数の画像を一枚画像にまとめて、サーバへのリクエスト回数を少なくします。
画像とCSSだけで実現できますが、1枚画像から一部分だけを表示する必要がるため、CSS側での作業が煩雑になりやすいのが難です。
Compassはこのスプライト用の1枚画像を自動で作成したり、CSS設定を出力したりしてくれます。
Compassによるスプライト生成は非常に簡単で、様々な利用方法をサポートしています。
スプライト画像の生成
まず、プロジェクトの画像ディレクトリにiconというディレクトリを作成し、そこにアイコンを保存します。
config.rb の images_dir に images を指定していれば、画像の保存パスは下記になります。
images/icon
ここでは下記の画像を使います。
icon01.png
icon02.png
icon03.png
先ほどのディレクトリに上記の画像を保存すると、画像のパスは下記のとおりになります。
images/icon/icon01.png
images/icon/icon02.png
images/icon/icon03.png
画像を結合させるのは簡単で、SCSSファイルに下記の1文を記載するだけです。
@import "icon/*.png";
これで images_dir に指定したディレクトリ、images に結像した画像が生成されます。
スプライトが増からのアイコンの削除や追加も簡単で、images/iconに保存した画像を削除、もしくは追加し、SCSSファイルを保存、もしくはKoalaなどでコンパイルすると再度スプライト画像が生成されます。
アイコン用 CSS の出力
画像を結合したままだと利用できないので、次に各アイコン毎の CSS を出力させます。
SCSSファイルに戻り、先の結合の指示の後にスプライトCSSを生成するMixinを追加します。
書式は上記の通りで、[ディレクトリ名]にアイコン画像を設置しているディレクトリ名を指定します。
今回はiconというディレクトリに保存したので、@include all-icon-spritesになります。
@import "icon/*.png"; @include all-icon-sprites;
これで下記のような CSS が出力されます。
.icon-sprite, .icon-icon01, .icon-icon02, .icon-icon03 { background-image: url('/images/icon-s33f62a118e.png'); background-repeat: no-repeat; } .icon-icon01 { background-position: 0 0; } .icon-icon02 { background-position: 0 -128px; } .icon-icon03 { background-position: 0 -256px; }
出力例を見てもわかる通り、デフォルトではこれらの要素の横幅と縦幅が出力されません。
次のような変数を設定することで、横幅と縦幅を追加することができます。
先のコードに追加すると次のようになります。
$icon-sprite-dimensions: true; @import "icon/*.png"; @include all-icon-sprites;
これで下記のような CSS が出力されます。
.icon-sprite, .icon-icon01, .icon-icon02, .icon-icon03 { background-image: url('images/icon-s33f62a118e.png'); background-repeat: no-repeat; } .icon-icon01 { background-position: 0 0; height: 128px; width: 128px; } .icon-icon02 { background-position: 0 -128px; height: 128px; width: 128px; } .icon-icon03 { background-position: 0 -256px; height: 128px; width: 128px; }
HTMLでアイコンを使いたい際は下記のような感じでクラス名を指定すると画像が表示されるようになります。
<div class="icon-icon01"></div>
この種の変数は他にも用意されていて、画像パーツの間隔を指定する $[ディレクトリ名]-spacing や、画像のレイアウトを指定する $[ディレクトリ名]-layout といった変数があります。
その他 sprite-map というヘルパーなども用意されていますが、上記で紹介した機能だけでも十分強力です。特殊な状況などで必要になった際に利用してみてください。