インラインSVGの中の要素にリンクをつける方法
Flash全盛期などには、イラストの中の要素をクリックしてページを移動するようなサイトを時々見かけました。
Flashの代用の一つとしてHTML5で導入されたインラインSVGですが、
実はSVG内の要素にHTMLのように<a>でリンクをつけることができます。
SVG内の要素にリンクをつけることができると、
Illustratorなどで作ったベクター形式のイラストをそのまま使えるので、
Flashのようにイラストの中の要素をクリックして移動するということが、
HTMLだけで組むよりも簡単に行えるようになります。
↓こちらはそちらを利用して作ってみたものです。
方法
方法はとてもシンプルです。
まずはIllustratorを使って、イラストを制作してください。
このとき、リンクさせる要素ごとにグループ化を行っておくと、リンクをつけやすくなります。
イラストができたら、SVG形式でファイルを保存します。
保存できたら、書きだしたSVGファイルをテキストエディタ等で開き、
<svg>・・・</svg>のところをコピーして、
HTML上にペーストして配置します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | ・・・ <li id="cloud1"><a href="#cloud1">CLOUD1</a></li> <li id="cloud2"><a href="#cloud2">CLOUD2</a></li> </ul> </nav> <div class="svgArea"> <svg viewBox="0 0 640 480"> <rect fill="#90CEF4" width="639" height="481"/> <path fill="#92C43B" d="M639,328c0,0-149-15-320-15S-1,328-1,328v153h640V328z"/> <g> <path fill="#42210B" d="M515,223c0,2.761,2.238,5,5,5h24c2.762,0,5-2.239,5-5v-57c0-2.761-2.238-5-5-5h-24c-2.762,0-5,2.239-5,5 V223z"/> <g opacity="0.3"> ・・・ </svg> </div> </body> </html> |
配置したら、リンクをつける要素を見つけ出して、そこにリンクを付けます。
要素をグループ化しておくと、見つけ出しやすくなります。
ブラウザの「要素を検証」機能を使うとすぐ見つけることができます。
見つけたら、その要素を<a>で囲みます。
ここまでは通常のHTMLと同じですが、リンク先の指定方法がSVGの場合、少し異なります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <a xlink:href="#cloud1"> <g> <path opacity="0.3" fill="#0071BC" d="M190.055,154.583c-3.911-20.583-22.809-35.312-44.155-33.552 c-6.136,0.506-11.843,2.333-16.881,5.163c-5.435-1.966-11.364-2.833-17.5-2.328c-17.179,1.417-31.043,13.109-36.057,28.538 c-20.909,3.642-35.958,22.702-34.18,44.264c1.729,20.976,18.782,37.002,39.247,38.013c8.37,9.35,20.864,14.809,34.334,13.697 c7.515-0.62,14.389-3.216,20.173-7.221c6.362,3.003,13.569,4.438,21.084,3.818c8.283-0.683,15.788-3.764,21.91-8.49 c2.17,0.166,4.38,0.169,6.619-0.016c22.833-1.883,39.818-21.919,37.935-44.753C221.048,173.084,207.422,158.352,190.055,154.583z" /> <path fill="#FFFFFF" d="M177.055,148.583c-3.911-20.583-22.809-35.312-44.155-33.552c-6.136,0.506-11.843,2.333-16.881,5.163 c-5.435-1.966-11.364-2.833-17.5-2.328c-17.179,1.417-31.043,13.109-36.057,28.538c-20.909,3.642-35.958,22.702-34.18,44.264 c1.729,20.976,18.782,37.002,39.247,38.013c8.37,9.35,20.864,14.809,34.334,13.697c7.515-0.62,14.389-3.216,20.173-7.221 c6.362,3.003,13.569,4.438,21.084,3.818c8.283-0.683,15.788-3.764,21.91-8.49c2.17,0.166,4.38,0.169,6.619-0.016 c22.833-1.883,39.818-21.919,37.935-44.753C208.048,167.084,194.422,152.352,177.055,148.583z"/> </g> </a> |
HTMLではhref属性を使いますが、インラインSVGではこのhrefの前に「xlink:」というものをつけて、
「xlink:href=”リンク先”」という指定の仕方をします。
その他はHTMLの<a>と同じで、target=”_blank”の指定もできます。
1 2 3 4 5 6 7 8 9 10 | <a xlink:href="#cloud1" target="_blank"> <g> <path opacity="0.3" fill="#0071BC" d="M190.055,154.583c-3.911-20.583-22.809-35.312-44.155-33.552 c-6.136,0.506-11.843,2.333-16.881,5.163c-5.435-1.966-11.364-2.833-17.5-2.328c-17.179,1.417-31.043,13.109-36.057,28.538 c-20.909,3.642-35.958,22.702-34.18,44.264c1.729,20.976,18.782,37.002,39.247,38.013c8.37,9.35,20.864,14.809,34.334,13.697 c7.515-0.62,14.389-3.216,20.173-7.221c6.362,3.003,13.569,4.438,21.084,3.818c8.283-0.683,15.788-3.764,21.91-8.49 c2.17,0.166,4.38,0.169,6.619-0.016c22.833-1.883,39.818-21.919,37.935-44.753C221.048,173.084,207.422,158.352,190.055,154.583z" /> ・・・ </a> |
この例ではページ内のアンカーリンクになっていますが、
URLの指定をして別のページにリンクさせることも、もちろん可能です。
HTMLだけで同じことをする場合は、position: absoluteなどを使うことが多いと思いますが、
場所の計算も大変で、特にレスポンシブではかなりの手間がかかってしまいます。
その点、インラインSVGを使った方法では、Illustratorで書きだしたイラストをそのまま使えるので、
かなり手間が軽減できます。
ただ、この方法を使った場合、iPhoneではページ内のアンカーリンクが動作しないバグらしきものがあるようですので、
現時点でiPhoneでもSVG要素のページ内のアンカーリンクが使えるようにする場合は、jQueryで以下の様なコードを追加してください。
1 2 3 4 5 6 | $(function() { $("svg a").click(function(){ if(String($(this).attr("xlink:href")).charAt(0) == "#") location.href = $(this).attr("xlink:href"); }); }); |
参考サイト
Author Profile
NINOMIYA
Webデザイナー兼コーダー出身のフロントエンド開発者です。 UXデザインやチーム開発の効率化など、勉強中です。
SHARE