使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图像可点击?

Answers:


20

最简单的方法是不使用<object>。而是使用<img>标记,锚点应该可以正常工作。


1
img标记通常会到达span标记所处的位置,以使其正常降级。
阿德里安·加纳

18
是不是显示svg向量而不是图像的想法?
路加福音

7
@ErikDahlström但<img>与为SVG数据的引用并不总是如您所愿,即使在Chrome :(最新版本stackoverflow.com/questions/15194870/...
dshap

15
正如@energee指出的那样,您可以使用<object>标签并添加一个point-event: none;使其可点击。它保留对svg源代码的访问,并允许您动态地对其进行操作。
Antoine

1
使用a img并非总是一种选择。就我而言,我需要操作svg,而该操作不能通过正确完成img,我必须使用object
马丁(Martijn)

216

实际上,解决此问题的最佳方法是...在<object>标记上,使用:

pointer-events: none;

注意:安装了Ad Blocker插件的用户在悬停时会在右上角显示一个标签状的[Block](与Flash标语相同)。通过设置此CSS,它也将消失。

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


4
注意:IE直到IE 11才支持常规元素上的指针事件,但已经支持SVG。参见caniuse.com/pointer-events
webdesserts 2013年

9
此解决方案的缺点(以及noelmcg的缺点)是,如果您的SVG文件包含带有:hover选择器的CSS规则,则这些规则将停止工作。Ben Frain提出的解决方案没有这个问题。
MathieuLescure 2015年

6
这应该是批准的答案。img与svg一起使用将使您无法更改内部SVG样式。
cadavre 2015年

3
这需要是批准的答案!真的很好,谢谢
Daniel Broughan 2015年

5
好答案。我在全球CSS中将其普及。object [type * =“ svg”] {指针事件:无}
Gregor Macgregor

40

我遇到了同样的问题,并设法通过以下方法解决了这个问题:

用设置为block或inline-block的元素包装对象

<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

通过评论20在此处找到https://bugzilla.mozilla.org/show_bug.cgi?id=294932


1
不好意思,忘了显示:内联块/块元素包裹对象
理查德(Richard)

1
最好的解决方案在这里!
Baldráni

这是解决此问题的最佳解决方案,并且适用于所有浏览器
Kalpesh Popat '16

1
如果图像具有透明bg,则这些位不会显示可点击
sobelito

这对我
有用

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
我的css样式在我的SVG文件中嵌入了:hover选择器。这是唯一不停用样式的解决方案。
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
谢谢,我需要将显示器设置为blockinline-block<a>
element119 2014年

很好的链接:noupe.com/inspiration/tutorials-inspiration/...优点缺点每个解决方案。
Serge Stroobandt,2014年

inline-block在某些情况下,我还需要使用,但block在其他情况下,它似乎工作得很好。我想这取决于封闭的方块...
Gwyneth Llewelyn

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现在位于比其父级更低的堆叠上下文中。
杰森·费瑟辛汉姆

在iPhone /手机上可以使用吗?不适合我。不可点击/不可点击
bafromca '17

3

我也通过编辑svg文件解决了这一问题。

我将整个svg图形的xml包装在具有click事件的组标签中,如下所示:

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

该解决方案可在所有支持对象svg脚本的浏览器中使用。(对于不支持svg的浏览器,在object元素中默认是一个img标签,您将涵盖所有浏览器)


您是否发现将onclick添加到外部<svg>元素而根本不包装它没有用?
罗伯特·朗森

1
您也可以使用svg根元素的事件。除了onclick事件之外,我还使用onmouseout,ontouchstart,ontouchend等...,对于根svg元素,我经常使用onload事件。Ben Frain下面的解决方案涉及绘制一个额外的封面对象(一个矩形)以捕获单击事件……因此,我提供了此解决方案,该示例显示了在绘图元素本身上获取事件,而不必制作透明封面仅用于获取click事件。当您不想绘制其他元素或想要特定于现有形状而不是矩形的事件时,此功能特别有用。
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

没有其他解决方案对我有用,但是这个解决了,谢谢!
ByteMyPixel

尽管我通常对直接更改SVG文件没有限制,但是在我的场景中,我将相同的 SVG用于多个不同的链接-意味着从理论上讲,我必须为每个链接创建不同的SVG。当然,我也可以在<svg>标记中添加图形位内联,但是我讨厌重复的代码(即使我得到的实际SVG很小...)
Gwyneth Llewelyn

0

只是不要使用<object>。这是一个适用于<a>and <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>

顺便说一句,我正在使用顺风CSS。
Ege Hurturk

-5

使用javascript并在onClick-e object元素中添加-attribute :

<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标签中,而没有环绕锚。如果赞成票可以解释原因,那将是很好的。
Chase
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.