はじめに
大量のアイコンをすべて別々にurlでリンクを張るとリソース読み込みにかなりの時間がかかります
そこですべてのアイコンをまとめたスプライト画像をひとつ作り、それをダウンロードしてcssで必要なアイコンのUV位置を変えることでページ読み込みを高速化する方法がよくとられます
実装
今回はgulp
+spritesmith
でまとめます
spritesmith
はいくつか手段がありますがcli版がなんかwindowsでいくつかエラーが出てすぐに動かせそうになかったのでgulp
版を使用します
インストール
npm
の説明は割愛しますnode
をインストールするとnpm
も入ると思います => https://nodejs.org/ja
まずgulp
をインストールしますgulp
はタスクランナー、様々なタスクを登録してアセットパイプラインを組むことができます
1 | cd 作業したいフォルダ |
--save-dev
オプションはローカルインストールするためのオプションです
この辺はお好みでどうぞ
続いてspritesmith
をインストールしますspritesmith
はスプライトパックのための便利ライブラリ
gulp用の拡張であるgulp.spritesmith
をローカルにインストールします
1 | npm install --save-dev gulp.spritesmith |
スプライトをパックするだけなら上記で終了ですが、今回はアイコンのサイズもそろえてみたいので追加でパッケージgulp-image-resize
を入れます
内部的にGraphicsMagick
というツールを使用するみたいなのでこちらからインストールしてください => http://www.graphicsmagick.org/
完了したらnpm install
します
1 | npm install --save-dev gulp-image-resize |
インストールは以上です
gulpfile.jsを書く
gulp
の実行スクリプトを書きます
コードを掲載しておくとsprite化のコードは以下
1 | const gulp = require('gulp'); |
これを作業フォルダにおいて、以下のgulp実行コマンドをたたけば、illust
フォルダ以下の.png画像をパッキングしてoutput
フォルダ以下にスプライト画像と.cssが生成されます
1 | node_modules/.bin/gulp sprite |
今回gulp
もローカルにインストールしているので上記のようにローカル.binのパスから実行コマンドをたたきます
sprite
はgulp(タスク名, タスク関数)
で登録した名前になるので適宜変更してください
以下が生成物です

.css
には以下のよう各アイコンの座標が書かれているクラスicon-ファイル名
が生成されます
1 | .icon-monster06 { |
これをhtmlで使用する場合は次のように<div>
のクラスとして指定すれば描画されます
1 | <div class="icon-monster06"></div> |
アイコンをそろえる
特にアイコンサイズがバラバラでも問題なければ上記までの処理で問題ないです
ところがこれをそろえて表示したい場合、後からだと結構面倒です
生成される.css
側のサイズを調整するなどの方法でもできるのですが( https://teratail.com/questions/102820 )、実装が厄介なのでアイコン側をそろえることで対応します
gulpfile.js
に以下のようにタスクを組みます
1 | const gulp = require('gulp'); |
これでサイズを揃えてsprite
を実行するといい感じになります
さいごに
余談ですがネイティブだとフォントとかUIを一つにまとめたものをアトラステクスチャなんて言い方をしますが、WEBだと単純にスプライトって言うんですね