10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

外部SVGスプライトのsvgxuse.jsによるIE11対応

Last updated at Posted at 2018-02-02

背景

インラインSVGの<use>による外部SVGファイルの参照は、SVGファイルの一元化やコード軽量化などに一役買っている。
しかし、そのままではIE11では表示されない。IE11では<use>タグの外部参照は対応していないのだ。

そのため、泣く泣く<img>タグに変更したり、インラインSVGの<defs>に書き換えた方も多くいらっしゃるのではないだろうか。

しかし、インラインSVGの<defs>に書き換えると、そもそも外部SVGファイルとして一元管理ができなくなる上、html内のコード量も増える。
その他の手法として<img>に置き換える手法もあるが、この場合はスプライトできなくなってしまう。しかも、CSSによるfillの調整もできないので、「ロゴをスクロール時に白抜き・デフォルトカラーに切り替えたい」等には対応できない。

そこで今回、IcoMoonでのファイルであればIE11でも正常に表示がされていたので何が違うか探ってみると、「svgxuse.js」というJSが読み込まれていた。

この、IcoMoonで使用しているsvgxuse.jsを読み込むことで、IE11でもインラインSVGの<use>による外部SVGファイルの参照が可能となった。

以下はその手順の覚書である。
(なお、svgxuse.jsで何をどうしているのかは割愛させて頂く。あくまで「こうしたら出来た」の共有のつもりなので。)

#基本的な手順

  • AIでロゴを作成する
  • SVG形式で保存
  • SVGファイルをエディタで開き、グルーピングしたいパスを<g>タグ等で囲む(<symbol>タグ等でも可)
  • <g id="baseColor”> のようにIDを付与

HTML内で下記のように<use>タグによりSVGファイルへのパスを記述
※外部参照になるため、元のSVGファイルのviewBox属性は必須

<header>
    <h1>
        <a href="/">
            <svg viewBox="0 0 928 240">
                <use xlink:href='/_assets/img/common/logo.svg#baseColor' class="baseColor"></use>
                <use xlink:href='/_assets/img/common/logo.svg#subColor' class="subColor"></use>
            </svg>
        </a>
    </h1>
</header>

IE11への対応

このままの状態ではタグの外部参照はIE11では対応していないため、表示されない。

SVGの元データのコードをインラインSVGで記述し<defs>でwrap(その場合はCSSで非表示に)する方法もあるが、コードが冗長になってしまうためJSによる外部参照を行う。

<script defer src="/_assets/js/svgxuse.js"></script>

svgxuse.js
html内でdeferにより参照する。
※Webサーバー上でホストされている必要があるため、ローカルでのプレビュー時はlocalhost等、ホストが存在している状態で確認を。

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?