GulpでCSSスプライトを作成してみます。
サンプルコード
gulp.spritesmithをインストールします。
npm install gulp.spritesmith --save-dev
gulpfile.jsに以下のように記述します。
今回は実際にCSSスプライトを使う際にsassを使用していますが、コードは省略しています。
var gulp = require('gulp'),
spritesmith = require('gulp.spritesmith');
gulp.task('sprite', function () {
var spriteData = gulp.src('./img/sprite/*.png') // スプライトにする画像(png)
.pipe(spritesmith({
imgName: 'sprite.png', // 生成するスプライト画像の名前
cssName: '_sprite.scss', // 生成するsassの名前
imgPath: '../img/common/sprite.png', // sassに記載されるスプライト画像のパス
cssFormat: 'scss', // 生成するCSSのフォーマット
cssVarMap: function (sprite) {
sprite.name = 'sprite-' + sprite.name; // sassで使用する変数名
}
}));
spriteData.img.pipe(gulp.dest('./img/common/')); // 生成するスプライト画像の保存場所
spriteData.css.pipe(gulp.dest('./scss/')); // 生成するsassの保存場所
});
画像のディレクトリは以下のようになっています。
img/sprite/以下にスプライト画像にする画像群を、img/common/にスプライト画像が生成されます。
- img
- sprite
- icon_arrow.png
- icon_mail.png
- common
- sprite
コマンドプロンプトで以下を実行します。
gulp sprite
img/commonにsprite.pngとscssディレクトリに_sprite.scssが生成されました。
_sprite.scssの中身は以下のようになっています。
scss/_sprite.scss
/*
SCSS variables are information about icon's compiled state, stored under its original file name
.icon-home {
width: $icon-home-width;
}
The large array-like variables contain all information about a single icon
$icon-home: x y offset_x offset_y width height total_width total_height image_path;
At the bottom of this section, we provide information about the spritesheet itself
$spritesheet: width height image $spritesheet-sprites;
*/
$sprite-icon-arrow-name: 'sprite-icon_arrow';
$sprite-icon-arrow-x: 0px;
$sprite-icon-arrow-y: 0px;
$sprite-icon-arrow-offset-x: 0px;
$sprite-icon-arrow-offset-y: 0px;
$sprite-icon-arrow-width: 20px;
$sprite-icon-arrow-height: 20px;
$sprite-icon-arrow-total-width: 40px;
$sprite-icon-arrow-total-height: 20px;
$sprite-icon-arrow-image: '../img/common/sprite.png';
$sprite-icon-arrow: (0px, 0px, 0px, 0px, 20px, 20px, 40px, 20px, '../img/common/sprite.png', 'sprite-icon_arrow', );
$sprite-icon-mail-name: 'sprite-icon_mail';
$sprite-icon-mail-x: 20px;
$sprite-icon-mail-y: 0px;
$sprite-icon-mail-offset-x: -20px;
$sprite-icon-mail-offset-y: 0px;
$sprite-icon-mail-width: 20px;
$sprite-icon-mail-height: 11px;
$sprite-icon-mail-total-width: 40px;
$sprite-icon-mail-total-height: 20px;
$sprite-icon-mail-image: '../img/common/sprite.png';
$sprite-icon-mail: (20px, 0px, -20px, 0px, 20px, 11px, 40px, 20px, '../img/common/sprite.png', 'sprite-icon_mail', );
$spritesheet-width: 40px;
$spritesheet-height: 20px;
$spritesheet-image: '../img/common/sprite.png';
$spritesheet-sprites: ($sprite-icon-arrow, $sprite-icon-mail, );
$spritesheet: (40px, 20px, '../img/common/sprite.png', $spritesheet-sprites, );
/*
The provided mixins are intended to be used with the array-like variables
.icon-home {
@include sprite-width($icon-home);
}
.icon-email {
@include sprite($icon-email);
}
Example usage in HTML:
`display: block` sprite:
<div class="icon-home"></div>
To change `display` (e.g. `display: inline-block;`), we suggest using a common CSS class:
// CSS
.icon {
display: inline-block;
}
// HTML
<i class="icon icon-home"></i>
*/
@mixin sprite-width($sprite) {
width: nth($sprite, 5);
}
@mixin sprite-height($sprite) {
height: nth($sprite, 6);
}
@mixin sprite-position($sprite) {
$sprite-offset-x: nth($sprite, 3);
$sprite-offset-y: nth($sprite, 4);
background-position: $sprite-offset-x $sprite-offset-y;
}
@mixin sprite-image($sprite) {
$sprite-image: nth($sprite, 9);
background-image: url(#{$sprite-image});
}
@mixin sprite($sprite) {
@include sprite-image($sprite);
@include sprite-position($sprite);
@include sprite-width($sprite);
@include sprite-height($sprite);
}
/*
The `sprites` mixin generates identical output to the CSS template
but can be overridden inside of SCSS
@include sprites($spritesheet-sprites);
*/
@mixin sprites($sprites) {
@each $sprite in $sprites {
$sprite-name: nth($sprite, 10);
.#{$sprite-name} {
@include sprite($sprite);
}
}
}
実際にCSSスプライトを使ってみます。
HTML
<i class="icon icon_arrow"></i>
_sprite.scssと同じディレクトリにstyle.scssを作成します。
scss/style.scss
@import "sprite";
.icon {
display: inline-block;
}
.icon_arrow {
@include sprite($sprite-icon_arrow);
}
生成した_sprite.scssをインポートして、使用する場所で生成されたmixinを記述します。
sassをコンパイルすると、以下の内容のCSSが生成されました。
style.css
.icon {
display: inline-block;
}
.icon_arrow {
background-image: url(../img/common/sprite.png);
background-position: 0px 0px;
width: 20px;
height: 20px;
}
【参考サイト】
- gulpを使ってCSSスプライトを作ってみる sassで書き出しバージョン | ichimaruni-design
- CSS Sprite を自動生成する – Gulp で作る Web フロントエンド開発環境 #8 – NET BIZ DIV. TECH BLOG
- gulp.spritesmithでCSS spriteをやってみた。【gulp】 – E-riverstyle Vanguard
コメントが承認されるまで時間がかかります。