はじめに
大量のアイコンをすべて別々に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だと単純にスプライトって言うんですね