2019/09/11
imgタグで読み込んだ1つのSVG画像をIDで出し分ける方法
SVG画像がまだ一般的でなかった頃、WEBページ上で画像を効率的に読み込む方法として、一枚の画像に複数の画像を並べ、CSSにより背景画像として切り抜いて表示するスプライト画像という方法がよく使われていました。
現在は使われることの多いブラウザのほとんどがSVG画像に対応しているため、アイコンなどの表示にはSVG画像を使うことが多くなってきました。WEBフォントもよく使われますね。
WEBフォントは一度設定してしまえばサイト内で使いまわししやすく、色の変更も容易なので便利ですが、最初のWEBフォントの作成が少し手間という面もあります。アイコンの追加も少し手間です。また、単色の場合は問題ないですが、複数の色には現状対応ができないため、SVG画像でアイコンを表現するというのは、まだまだ機会としてはあると思います。
WEBフォントの場合は、1つのファイルの中に複数のアイコンを内蔵することができますが、SVG画像を使う場合、ファイルを分ける必要があるように思っていました。
しかし、画像のURLに#によるID指定を行い、SVGファイル内でCSSの:targetセレクタを使った表示の出し分けをすることで、複数のアイコンを1つのSVGファイルにまとめることができることがわかりましたので、方法をご紹介いたします。
SVGファイルを作成する
今回はXDでSVGファイルを作ります。
書き出したいアイコンを用意し、一箇所に重ねてグループ化し、SVG形式で書き出します。
それぞれのアイコンが複数のパスからできている場合は、前もってアイコンごとにグループ化してください。
書き出したSVGファイルをテキストエディタで開き、アイコンの親グループとアイコンのタグのIDを調整します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <g id="icons" transform="translate(-70 -510)"> <g id="search" data-name="icon/search" transform="translate(70 510)"> <rect id="長方形_7" data-name="長方形 7" width="64" height="64" fill="none"/> <path id="パス_4" data-name="パス 4" d="M223.329,110.671l-6.5-6.5a3.976,3.976,0,0,0-3.253-1.13l-2.934-2.934a20.546,20.546,0,1,0-3.535,3.535l2.934,2.934a3.976,3.976,0,0,0,1.13,3.253l6.5,6.5a4,4,0,1,0,5.658-5.658ZM194.5,102A14.5,14.5,0,1,1,209,87.5,14.517,14.517,0,0,1,194.5,102Z" transform="translate(-167 -60)" fill="#eb7070"/> </g> <g id="user" data-name="icon/user" transform="translate(70 510)"> <rect id="長方形_8" data-name="長方形 8" width="64" height="64" fill="none"/> <g id="グループ_3" data-name="グループ 3" transform="translate(-246.777 -61.167)"> <path id="パス_9" data-name="パス 9" d="M279,90.833c-7.168,0-13-6.205-13-13.833s5.832-13.833,13-13.833S292,69.372,292,77,286.168,90.833,279,90.833Zm0-21.666c-3.86,0-7,3.514-7,7.833s3.14,7.833,7,7.833,7-3.514,7-7.833S282.86,69.167,279,69.167Z" fill="#fec771"/> <path id="パス_10" data-name="パス 10" d="M291.59,98.215a20.937,20.937,0,0,1,7.105,9.5,23.993,23.993,0,0,1-39.39,0,20.937,20.937,0,0,1,7.105-9.5,22.831,22.831,0,0,0,25.18,0m-.457-7.315a16.982,16.982,0,0,1-24.266,0,27.04,27.04,0,0,0-14.09,17.671,30,30,0,0,0,52.446,0A27.04,27.04,0,0,0,291.133,90.9Z" fill="#fec771"/> </g> </g> <g id="cart" data-name="icon/cart" transform="translate(70 510)"> <g id="グループ_4" data-name="グループ 4" transform="translate(-326 -62)"> <path id="パス_11" data-name="パス 11" d="M383.364,81.154A3,3,0,0,0,381,80H345.213l-1.268-6.568A3,3,0,0,0,341,71h-9a3,3,0,0,0,0,6h6.523l5.032,26.068a3,3,0,0,0,2.894,2.432l29.5.5H376a3,3,0,0,0,2.909-2.272l5-20A2.993,2.993,0,0,0,383.364,81.154Zm-9.7,18.806-24.684-.418L346.371,86h30.786Z" fill="#e6e56c"/> <circle id="楕円形_2" data-name="楕円形 2" cx="5" cy="5" r="5" transform="translate(343 108)" fill="#e6e56c"/> <circle id="楕円形_3" data-name="楕円形 3" cx="5" cy="5" r="5" transform="translate(369 108)" fill="#e6e56c"/> </g> <rect id="長方形_9" data-name="長方形 9" width="64" height="64" fill="none"/> </g> … |
<svg>の開始タグの直後に以下のstyleを書き足します。
1 2 3 4 5 6 7 8 9 10 | <defs> <style type="text/css"><![CDATA[ #icons > g { display: none; } #icons > g:target { display: block; } ]]></style> </defs> |
このstyleの指定で、#によるID指定がない場合はグループを非表示、ID指定がある場合は表示するという出し分けが可能になります。
これで、以下のようにHTMLの<img>のsrcを#によりID指定することで、1つのSVGファイルをもとに、呼び出したいアイコンのみを出し分けて表示することが可能になります。
1 | <img src="assets/img/icons2.svg#search" alt="検索" width="128"> |
Author Profile
NINOMIYA
Webデザイナー兼コーダー出身のフロントエンド開発者です。 UXデザインやチーム開発の効率化など、勉強中です。
SHARE