使一个html svg对象也是一个可点击的链接

ian*_*man 129 html anchor svg object

我在我的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>
Run Code Online (Sandbox Code Playgroud)

当我使用此代码块时,单击svg对象不会将我带到谷歌.在IE8中,范围文本是可点击的.

我不想修改我的svg图像以包含标签.

我的问题是,我怎样才能使svg图像可点击?

小智 204

实际上,解决这个问题的最好方法是......在<object>标签上,使用:

pointer-events: none;
Run Code Online (Sandbox Code Playgroud)

注意:安装了广告拦截器插件的用户在悬停时会在右上角看到一个类似于标签的[Block](与flash横幅相同).通过设置这个css,它也会消失.

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

  • 此解决方案(以及noelmcg中的解决方案)的缺点是,如果您的SVG文件包含带有:hover选择器的CSS规则,则这些规则将停止工作.Ben Frain提出的解决方案没有这个问题. (9认同)
  • 这应该是批准的答案.使用带有svg的`img`会导致无法更改内部SVG样式. (5认同)
  • 很好的答案.我在全球css中用这个做了我的普遍.object [type*="svg"] {pointer-events:none} (5认同)
  • 注意:在IE 11之前,IE不支持常规元素上的指针事件,但已经在SVG上支持它们.请参阅http://caniuse.com/pointer-events (4认同)
  • 这需要得到批准的答案!非常好,谢谢 (2认同)
  • svg 似乎在 chrome 48 和 opera 35 中消失了(用某些文本替换后备图像时清晰可见......),但在 Firefox 和 safari 中工作正常......有谁知道为什么? (2认同)
  • 这才是真正的答案。在我的情况下,带有 img 标签的解决方案根本不起作用,因为没有显示图像。就我而言,我希望对象标签对于 JS 点击事件是可点击的,这也解决了这个问题。 (2认同)

小智 34

我有同样的问题,并设法解决这个问题:

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

<a>
    <span>
        <object></object>
    </span>
</a>
Run Code Online (Sandbox Code Playgroud)

添加到<a>标签:

display: inline-block;
position: relative; 
z-index: 1;
Run Code Online (Sandbox Code Playgroud)

<span>标签:

display: inline-block;
Run Code Online (Sandbox Code Playgroud)

<object>标签:

position: relative; 
z-index: -1
Run Code Online (Sandbox Code Playgroud)

在这里查看示例:http://dabblet.com/gist/d6ebc6c14bd68a4b06a6

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

  • 最好的解决方案在这里! (2认同)

noe*_*mcg 31

我想对此表示赞赏,但我在这里找到了解决方案:

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>
Run Code Online (Sandbox Code Playgroud)

链接适用于svg和后备.

  • 这仍然有一个问题:SVG指针事件(动画)不再工作(mouseover,mouseout,click)!就像简单地使用指针事件:对象本身没有... (3认同)
  • 这是最简单,最受支持的解决方案 (2认同)

Ben*_*ain 23

您也可以在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>
Run Code Online (Sandbox Code Playgroud)

然后只需修改链接以适应.我已经使用了100%的宽度和高度来覆盖它所处的SVG.这项技术归功于Clearleft.com的智能人员 - 这是我第一次看到它使用的地方.

  • 我的css样式有一个:hover选择器嵌入在我的SVG文件中.这是唯一不会停用样式的解决方案. (2认同)

Eri*_*röm 22

最简单的方法是不使用<object>.而是使用<img>标签,锚应该工作得很好.

  • 是不是要显示svg矢量,而不是图像? (13认同)
  • 正如@energee指出的那样,你可以使用`<object>`标签并添加一个`point-event:none;`来使它可以点击.它保留对svg源代码的访问权限,并允许您动态操作它. (12认同)
  • @ErikDahlström但是对于svg数据的`<img>`并不总是按预期工作,即使在最新版本的Chrome中:( http://stackoverflow.com/questions/15194870/how-can-i-得到的字体到工作在SVG加载功能于一个-IMG标签,在铬 (5认同)
  • @Antoine 实际上正确的属性是 'pointer-events: none;' 就像下面提到的,这不起作用,但还是谢谢你 (2认同)

Feu*_*mel 18

理查德解决方案的简化.至少在Firefox,Safari和Opera中起作用:

<a href="..." style="display: block;">
    <object data="..." style="pointer-events: none;" />
</a>
Run Code Online (Sandbox Code Playgroud)

有关其他解决方案,请访问http://www.noupe.com/tutorial/svg-clickable-71346.html.

  • 谢谢,我需要在父"<a>"上设置`block`或`inline-block`. (2认同)

Chr*_*dom 9

要在所有浏览器中实现此目的,您需要结合使用@energee,@ Richard和@Feuermurmel方法.

<a href="" style="display: block; z-index: 1;">
    <object data="" style="z-index: -1; pointer-events: none;" />
</a>
Run Code Online (Sandbox Code Playgroud)

添加:

  • pointer-events: none; 使它在Firefox中运行.
  • display: block; 让它在Chrome和Safari中运行.
  • z-index: 1; z-index: -1; 它也适用于IE.