SVGスプライト(IE11対応)

SVGを直に書き込むとコードが長くて見づらい。だからといって画像として読み込むと、色の変更ができない。そこで便利なのがSVGスプライトです。SVGのコードを1つのファイルにまとめて書いておいて、IDだけで呼び出すので、コードを煩雑化することなく色の指定も思いのまま。

SVGスプライト(IE11対応)

現在、検索するとたくさんのサイトでSVGスプライトの作り方が書かれています。ですが、大抵のサイトに載っている問題点がIE11の対応について…

SVGスプライトではSVGコードを「use要素」を使って呼び出すことになるのですが、この「use要素」の外部ファイル呼び出しがIE11では未対応なんですね。外部呼び出しが出来ないだけなので、HTMLファイル自体にSVGをまとめて書いておくなら、当然そのファイル内では何度でも同じコードを呼び出すことができます。でも、それではページをまたいで同じSVGを使うことができない。多くのサイトではこの解決方法として、機能を補完するJSの読み込みを紹介していました(svg4everybody)。これを読み込むとIE11問題が解決するそうです。

ただし、もう一つ問題が…。どうやらこの方法だとiOS 9.3では、use要素を使用するたびにキャッシュされずにその都度SVGの外部ファイルをサーバーまで呼び出しに行くらしい…。要するに重くなる。
SVGスプライトの実装方法 – くらしのマーケット開発ブログ

あと、正直IE11のために余分なJS読みたくない…

困っていたら、いました。天才様が。これで万事解決。
SVGの書き出しおよび表示方法 - KoToRi Blog【コトリブログ】

これは、SVGをまとめたファイルをPHPのinclude_onceで一度呼び出すというもの。はじめに一度呼び出しているので、「use要素」は外部呼び出しにしなくていいし、サーバーのリクエストも無駄に増やさなくてすむというすぐれもの。ただし、PHPを使うので、PHPが使えない環境下だとNGですが。

詳しい話は、本家様のサイトを見てもらえればと思います。ここでは、方法だけをまとめておきます。

1.まとめたSVGファイルを作成

まず、使用したいSVG画像のコードを1つのファイルにまとめます。ファイル名に決まりはありませんが、拡張子は「.svg」です。

とりあえず例として「all.svg」としました。そこに以下の記述をコピペしましょう。

SVG画像の分だけsymbol要素を増やしていき、その中にSVG画像のコードを入れていきます。IDは任意の名前に変更し、viewBoxはSVG画像のコードのsvg要素にかかれているものをコピペしてください。

この時、コピペするSVG画像のコードとはSVG要素の中身です。SVG要素自体は外してください。以下のコードで言うなら、<g>~<g>ということになります。

また、コード内にスタイルに関する属性が入っている場合は削除してください。この段階で色の指定が入っていると、呼び出した際に色変更が出来ません。

2.SVGファイルを呼び出す

次に、先程作ったSVGファイルを、HTML上で呼び出します。PHPを使うのでファイルの拡張子は「.php」です。

ファイルの置き場所に応じて、パスを変更してください。

3.SVG画像を呼び出す

最後に呼び出し方です。呼び出したい場所に以下のコードを記述します。

title要素とdesc要素は任意です。xlink:href属性でall.svgの使用したいSVG画像のsymbol要素のIDを指定します。色やサイズの変更は、SVG要素にスタイルを指定することで調節できます。