【Sass】あえて、Compassに頼らずスプライト。

【Sass】あえて、Compassに頼らずスプライト。

未だに9月くらいの気がしているhakoishiです。
おかしい...街がクリスマスとか、正月とか、なんか浮き足立った事言ってる。

さて、今回はSassでスプライト対応する時にCompassを使わないサンプルをご紹介。

Compassのスプライト、すっごく便利なんですよね。
けれど、実案件では使えない場合もあるのではないでしょうか。

画像名を決まったものにしたい、とか。
画像の並びをソースと同じ順にしたい、とか。
納品後、お客さまが更新していく案件では少なくなさそうです。

そんなときの為に、@forを使う方法をば。

サンプル

恐ろしくざっくりしたサンプルですが...。hoverでの画像切り替え有りです。
使っている画像がこちら。
上に8pxの余白を設けています。理由は後ほど。

HTML

画像置換の為、li>a>spanの入れ子にしています。


<ul class="sprite-list">
<li class="download"><a href="#"><span>ダウンロード</span></a></li>
<li class="calendar"><a href="#"><span>カレンダー</span></a></li>
<li class="setup"><a href="#"><span>セットアップ</span></a></li>
<li class="search"><a href="#"><span>検索</span></a></li>
</ul>

Sass

liにあたるクラス名をリスト定義し、その数だけ@forで回します。

画像の上部に8pxの余白をつけた理由ですが、「-#{40px * ($i - 1)}」としてしまうと1つめのクラスのY位置が「-0px」になってしまいます。
分岐処理を入れて「0」とするか、画像の上に余白をいれて「-#{8 + 40px * ($i - 1)}」→Y位置が「-8px」とするかで、今回はサクっと後者にした次第です。
(余白は何pxでもOKですね。今回は画像内の他の部分に合わせて8pxです。)


$icolist: download,calendar,setup,search;

.sprite-list {
    $ico-width: 32px;
    $ico-height: 32px;
                
    li {
        float: left;
        width: $ico-width;
        height: $ico-height;
        margin-right: 10px;
        
        a {
            background-image: url(images/spr-sample.png);
            background-repeat: no-repeat;
            display: block;
            width: $ico-width;
            height: $ico-height;
        }
        
        @for $i from 1 through length($icolist) { 
        /* リストの項目数だけ回す */
            &.#{nth($icolist,$i)} a {
                background-position: 0 -#{8 + 40px * ($i - 1)};
                /* Y位置、「-0px」にならないよう調整 */
            }
            &.#{nth($icolist,$i)} a:hover {
                background-position: 100% -#{8 + 40px * ($i - 1)};
            }
        }
        
        span { /* 画像置換 */
            display: block;
            text-indent: 100%;
            white-space: nowrap;
            overflow: hidden;
            height: 0;
        }
    }
}

生成されるCSS


.sprite-list li {
    float: left;
    width: 32px;
    height: 32px;
    margin-right: 10px;
}

.sprite-list li a {
    background-image: url(images/spr-sample.png);
    background-repeat: no-repeat;
    display: block;
    width: 32px;
    height: 32px;
}

.sprite-list li.download a {
    background-position: 0 -8px;
}

.sprite-list li.download a:hover {
    background-position: 100% -8px;
}

.sprite-list li.calendar a {
    background-position: 0 -48px;
}

.sprite-list li.calendar a:hover {
    background-position: 100% -48px;
}

.sprite-list li.setup a {
    background-position: 0 -88px;
}

.sprite-list li.setup a:hover {
    background-position: 100% -88px;
}

.sprite-list li.search a {
    background-position: 0 -128px;
}

.sprite-list li.search a:hover {
    background-position: 100% -128px;
}

.sprite-list li span {
    display: block;
    text-indent: 100%;
    white-space: nowrap;
    overflow: hidden;
    height: 0;
}

まとめ

今回の例に限らず、Sassの@forってかなり便利です。
ネスト、mixinまで覚えたら、その次に強くオススメしたい!

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ