html svgオブジェクトもクリック可能なリンクにする


143

HTMLページにSVGオブジェクトがあり、それをアンカーでラップしているため、svg画像をクリックすると、ユーザーはアンカーリンクに移動します。

<a href="http://www.google.com/">
    <object data="mysvg.svg" type="image/svg+xml">
        <span>Your browser doesn't support SVG images</span>
    </object>
</a>

このコードブロックを使用する場合、svgオブジェクトをクリックしても、Googleに移動しません。IE8 <では、スパンテキストはクリック可能です。

タグを含むようにsvg画像を変更したくありません。

私の質問は、どうすればsvg画像をクリック可能にすることができますか?

回答:


20

最も簡単な方法は、<object>を使用しないことです。代わりに<img>タグを使用すると、アンカーは正常に機能します。


1
通常、imgタグは、spanタグが適切に機能を低下させるために使用します。
Adrian Garner

18
画像ではなくsvgベクトルを表示するという考えではありませんか?
ルーク

7
@ErikDahlströmしかし<img>、あなたが期待するようSVGデータを参照しても、Chromeの最新バージョン:(で、常に仕事をしませんstackoverflow.com/questions/15194870/...
dshap

15
@energeeが指摘したように、<object>タグを使用してa point-event: none;を追加し、クリック可能にすることができます。svgソースコードへのアクセスを維持し、動的に操作できるようにします。
アントワーヌ

1
を使用することimgは、常にオプションとは限りません。私の場合、svgを操作する必要があります。これはimg、を介して適切に実行できないため、使用する必要がありますobject
Martijn

216

実際には、これを解決する最善の方法は... <object>タグで、次を使用します:

pointer-events: none;

注:Ad Blockerプラグインがインストールされているユーザーは、ホバーすると右上隅にタブのような[ブロック]が表示されます(フラッシュバナーの場合と同じ)。このCSSを設定することで、それも消えます。

http://jsfiddle.net/energee/UL9k9/


4
注:IEはIE 11までは通常の要素のポインターイベントをサポートしませんが、SVGでは既にサポートしています。参照caniuse.com/pointer-eventsを
webdesserts

9
このソリューション(およびnoelmcgからのソリューション)の欠点は、SVGファイルに:hoverセレクターを含むCSSルールが含まれている場合、これらのルールが機能しなくなることです。Ben Frainが提案したソリューションには、この問題はありません。
MathieuLescure 2015

6
これは回答を承認する必要があります。imgsvgと一緒に使用すると、内部のSVGスタイルを変更できなくなります。
cadavre 2015

3
これは承認された答えである必要があります!本当にいいです、ありがとう
Daniel Broughan 2015

5
すばらしい答えです。私はこれをグローバルCSSで普遍的にしました。object [type * = "svg"] {pointer-events:none}
Gregor Macgregor

40

私は同じ問題を抱えていて、これを何とか解決しました:

要素をブロックまたはインラインブロックに設定してオブジェクトをラップする

<a>
    <span>
        <object></object>
    </span>
</a>

<a>タグに追加:

display: inline-block;
position: relative; 
z-index: 1;

そして<span>タグに:

display: inline-block;

そして<object>タグに:

position: relative; 
z-index: -1

こちらの例をご覧ください:http : //dabblet.com/gist/d6ebc6c14bd68a4b06a6

コメントhttps://bugzilla.mozilla.org/show_bug.cgi?id=294932で見つかりました


1
謝罪、表示を忘れました:オブジェクトをラップするinline-block / block要素
Richard

1
ここで最高の解決策!
Baldráni

これはこの問題の最善の解決策であり、すべてのブラウザーで機能します
Kalpesh Popat

1
画像に透明なbgがある場合、それらのビットはクリックできないように見えます
sobelito

これは私にとってうまくいきました、私は高さを追加する必要もありました:私の状況ではa要素とspan要素に100%
sk03

32

これを信用したいのですが、ここで解決策を見つけました:

https://teamtreehouse.com/forum/how-do-you-make-a-svg-clickable

アンカーのcssに以下を追加します。

a.svg {
  position: relative;
  display: inline-block; 
}
a.svg:after {
  content: ""; 
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left:0;
}


<a href="#" class="svg">
  <object data="random.svg" type="image/svg+xml">
    <img src="random.jpg" />
  </object>
</a>

リンクはsvgとフォールバックで機能します。


2
これは意見では最も簡単で、サポートソリューションです
タイプスタイル

3
これにはまだ問題があります。SVGポインターイベント(アニメーション)が機能しなくなっています(マウスオーバー、マウスアウト、クリック)。単にポインタイベントを使用するのと同じように、オブジェクト自体には何もありません...
qdev

26

SVGの下部(終了</svg>タグの直前)に次のようなものを貼り付けることもできます。

<a xmlns="http://www.w3.org/2000/svg" id="anchor" xlink:href="/" xmlns:xlink="http://www.w3.org/1999/xlink" target="_top">
    <rect x="0" y="0" width="100%" height="100%" fill-opacity="0"/>
</a>

次に、リンクを適切に修正します。私は100%の幅と高さを使用して、配置されているSVGをカバーしました。このテクニックの功績は、Clearleft.comの賢い人々にあります。


2
私のSVGファイルには、:hoverセレクターが埋め込まれたCSSスタイルがあります。これは、スタイルを非アクティブ化しない唯一のソリューションです。
MathieuLescure 2015

21

リチャードのソリューションの簡略化。少なくともFirefox、Safari、Operaで機能します。

<a href="..." style="display: block;">
    <object data="..." style="pointer-events: none;" />
</a>

その他の解決策については、http://www.noupe.com/tutorial/svg-clickable-71346.htmlを参照してください


3
おかげで、私は親に、blockまたはinline-block親に設定されたディスプレイが必要でした<a>
element119 2014年

良いリンク:noupe.com/inspiration/tutorials-inspiration/…には、各ソリューションの長所短所があります。
Serge Stroobandt 2014

私もinline-blockいくつかのケースで使用する必要がありましblockたが、他のケースではうまく機能するようでした。それは囲んでいるブロックに依存すると思います...
グウィネス・ルウェリン

9

すべてのブラウザでこれを実現するには、@ energee、@ Richard、および@Feuermurmelメソッドの組み合わせを使用する必要があります。

<a href="" style="display: block; z-index: 1;">
    <object data="" style="z-index: -1; pointer-events: none;" />
</a>

追加:

  • pointer-events: none; Firefoxで動作します。
  • display: block; ChromeとSafariで動作します。
  • z-index: 1; z-index: -1; IEでも機能します。

@janaspageわからない... IE 10で試したことはありません。動作するかどうか教えてください:)
ChristopherStrydom

@jaepage object親よりも低いスタックコンテキスト(下)になるので、問題ではありません。
Jason Tフェザリンガム2016

これはiPhone /モバイルで機能しますか?私にはありません。クリック/タップ不可
bafromca

3

私もsvgファイルを編集してこれを解決しました。

次のように、svgグラフィック全体のxmlを、クリックイベントを持つグループタグでラップしました。

<svg .....>
<g id="thefix" onclick="window.top.location.href='http://www.google.com/';">
 <!-- ... your graphics ... -->
</g>
</svg>

ソリューションは、オブジェクトsvgスクリプトをサポートするすべてのブラウザーで機能します。(デフォルトでは、svgをサポートしていないブラウザーのオブジェクト要素内のimgタグであり、ブラウザーの全範囲をカバーします)


onclickを外側の<svg>要素に追加して、それをまったくラップしないことが機能しないことに気づきましたか?
ロバートロングソン2014

1
ルートのsvg要素のイベントも使用できます。onclickイベントに加えて、onmouseout、ontouchstart、ontouchendなどを使用します。ルートのsvg要素については、onloadイベントを頻繁に使用します。以下のベンフレインソリューションには、クリックイベントをキャプチャするために追加のカバーオブジェクト(四角形)を描画することが含まれます...したがって、クリックイベントを取得するためだけに透明なカバーを作成する必要なく、描画要素自体でイベントを取得する方法を示すこのソリューションを提案しました。別の要素を描画したくない場合や、長方形ではなく既存の形状に固有のイベントが必要な場合に特に役立ちます。
Bruce Pezzlo 2014

3

私はこのクリーンで簡単な方法を試しましたが、すべてのブラウザで動作するようです。svgファイル内:

<svg>
<a id="anchor" xlink:href="http://www.google.com" target="_top">
  
<!--your graphic-->
  
</a>
</svg>
  


これを機能させるには、次の「xlink」名前空間をsvg要素に追加する必要があります。xmlns:xlink = " w3.org/1999/xlink "
Mere Development

他の解決策はどれもうまくいきませんでしたが、これはうまくいきました。
ByteMyPixel 2016

通常、SVGファイルを直接変更することに不安はありませんが、私のシナリオでは、いくつかの異なるリンクに同じ SVG を使用しています。つまり、理論的には、それぞれに異なるSVGを作成する必要があります。または、もちろん、<svg>タグにインラインでグラフィックビットを追加することもできますが、重複したコードが嫌いです(実際のSVGが小さい場合でも...)
Gwyneth Llewelyn

0

使用しないでください<object>。これが<a><svg>タグで私のために働いた解決策です:

<a href="<your-link>" class="mr-5 p-1 border-2 border-transparent text-gray-400 rounded-full hover:text-white focus:outline-none focus:text-white focus:bg-red-700 transition duration-150 ease-in-out" aria-label="Notifications">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="30" 
    height="30"><path class="heroicon-ui" fill="#fff" d="M17 16a3 3 0 1 1-2.83 
    2H9.83a3 3 0 1 1-5.62-.1A3 3 0 0 1 5 12V4H3a1 1 0 1 1 0-2h3a1 1 0 0 1 1 
    1v1h14a1 1 0 0 1 .9 1.45l-4 8a1 1 0 0 1-.9.55H5a1 1 0 0 0 0 2h12zM7 12h9.38l3- 
   6H7v6zm0 8a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm10 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/>
    </svg>
</a>

ところで、私はtailwind cssを使用しています。
Ege Hurturk

-5

それをjavascriptで行い、- onClick要素に-属性を追加しますobject

<object data="mysvg.svg" type="image/svg+xml" onClick="window.location.href='http://google.at';">
    <span>Your browser doesn't support SVG images</span>
</object>

周囲の<a>タグの有無にかかわらず、これを試しましたが、これを機能させることができません。LinuxのFFとChromeで試しました。どのブラウザでこれを試しましたか?
iancoleman

6
あなたがそれを試してみて、それが機能することを確認して、これを読んだ他の人があなたの答えに自信を持つことができれば素晴らしいでしょう。「うまくいくはず」は理論的には問題ありませんが、私にとっては実際にうまくいくはずです。
iancoleman

WindowsのChrome 45でこれを試したところ、問題なく動作するようです。ラッピングアンカーなしでonClickをSVGタグに直接追加しました。反対投票がその理由を説明してくれるといいですね。
2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.