[2014/06/27 更新]
CompassでCSSスプライトしてRetina対応してデータURLスキームも行うミックスインを作ったので、そのメモ。
準備
ディレクトリ構成は以下の通り(Compass標準)
images/spritesディレクトリに必要な画像を格納しておく。
コンフィグファイルの編集
relative_assetsは、ヘルパー関数で生成するURLを相対パスか、それとも絶対パスで表現するかの設定。
これをtrueにすることで、スプライトを生成した時に相対パスになるので設定しておくこと。
> config.rb
css_dir = "css" sass_dir = "sass" images_dir = "images" relative_assets = true
Mixin
本題のMixinは以下
> style.scss
@import "compass"; $map: sprite-map( "sprites/*.png", $spacing: 10px, $layout: vertical ); $map-width: image-width( sprite-path( $map ) ); @mixin sprite-background( $dpx ) { background-image: inline-sprite( $map ); background-repeat: no-repeat; @include background-size( $map-width/$dpx auto ); display: inline-block; text-indent: -9999px; vertical-align: middle; } @mixin sprite-background-name( $name, $dpx ) { height: image-height( sprite-file( $map, $name ) ) / $dpx; width: image-width( sprite-file( $map, $name ) ) / $dpx; $ypos: round( nth( sprite-position( $map, $name ), 2 ) / $dpx ); background-position: 0 $ypos; } .sprite { @include sprite-background( 1 ); } .sprite-2x { @include sprite-background( 2 ); } @each $name in sprite-names( $map ) { .#{$name} { @include sprite-background-name( $name, 1 ); } .#{$name}-2x { @include sprite-background-name( $name, 2 ); } }
line3: スプライト画像を生成
line4: スプライト画像の幅を取得
$dpx が dpx の値となるので、通常は1、Retinaの場合は2となる。
これでcompass watchすれば以下のようにジェネレートされる。
.sprite { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA(省略)'); background-repeat: no-repeat; -webkit-background-size: 64px auto; -moz-background-size: 64px auto; -o-background-size: 64px auto; background-size: 64px auto; display: inline-block; text-indent: -9999px; vertical-align: middle; } .sprite-2x { background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA(省略)'); background-repeat: no-repeat; -webkit-background-size: 32px auto; -moz-background-size: 32px auto; -o-background-size: 32px auto; background-size: 32px auto; display: inline-block; text-indent: -9999px; vertical-align: middle; } .blogger { height: 64px; width: 64px; background-position: 0 -148px; } .blogger-2x { height: 32px; width: 32px; background-position: 0 -74px; } .evernote { height: 64px; width: 64px; background-position: 0 -74px; } .evernote-2x { height: 32px; width: 32px; background-position: 0 -37px; } /* 省略 */
※ imagesディレクトリ直下にスプライト画像が生成されるが、データURIスキームされているのでこれをサーバにアップする必要はない。
ジェネレートされたstyle.cssを読み込んで、以下のようにコーディングすれば良い。
> dpiが1の場合
<span class="sprite facebook">facebook</span>
> dpiが2の場合
<span class="sprite-2x facebook-2x">facebook</span>
そして最大のメリットはメンテナンス性の高さにある。つまり、
スプライトする画像を増やすことになっても、追加する画像を images/sprites ディレクトリに追加してcompass watchするだけでOK。
サンプル一式をGithubにもあげときました。