【发布时间】:2012-11-20 08:09:17
【问题描述】:
我正在尝试使用 CSS :hover 伪类来设置从 <defs> 通过 <use> 标记嵌入的 SVG 元素的样式,但它似乎不起作用:-/ 这是我的代码:
<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8"/>
<style type="text/css" media="screen">
.active { fill: #0BE; }
.active:hover { opacity: 0.8; stroke: #F0F; stroke-width: 4px; }
.active2 #p2 { fill: #0BE; }
.active2:hover #p2 { opacity: 0.8; stroke: #F0F; stroke-width: 4px; }
#p2:hover { opacity: 0.8; stroke: #F0F; stroke-width: 4px; }
</style>
</head>
<body>
<svg version="1.1" width="640" height="480"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<polygon id="p0" points="100,0 50,86.6 -50,86.6 -100,0 -50,-86.6 50,-86.6" class="active"/>
<g id="gr1">
<polygon id="p1" points="130,0 50,86.6 -50,86.6 -100,0 -50,-86.6 50,-86.6"/>
<polygon id="p2" points="100,0 50,86.6 -50,86.6 -100,0 -50,-86.6 50,-86.6" class="active"/>
</g>
</defs>
<g transform="translate(70,100)">
<use xlink:href="#p0" transform="translate(40,0)"/>
<use xlink:href="#p0" transform="translate(250,0)"/>
<use xlink:href="#p0" transform="translate(460,0)" class="active" />
</g>
<g transform="translate(100,300)">
<polygon id="style" points="110,0 50,86.6 -50,86.6 -100,0 -50,-86.6 50,-86.6" class="foo"/>
<use xlink:href="#gr1" transform="translate( 350,2)" class="active2"/>
</g>
</svg>
</body>
</html>
我希望它以这样一种方式工作,即当用户将鼠标指针放在嵌入元素上时,其具有“活动”类的内部元素将改变其样式。当我直接从<defs> 嵌入一个形状并将CSS 类应用于嵌入它的<use> 时,它就起作用了。但它不适用于通过 <use> 嵌入的组内的任何类或 ID。
如何解决?
或者也许有更好的方法来做到这一点?
当用户将鼠标悬停在嵌入对象中时,我只需要更改该特定部分,而不是整个组。这是因为该组的不同部分会应用不同的样式,并且在鼠标悬停时需要进行不同的更改。
编辑:我想得到什么
我想要的是一种将 <defs> 中的“库对象”嵌入到我的 SVG 文档中许多不同位置的方法。该对象的某些部分需要使用 CSS 中的自定义颜色设置样式,因为我需要在不更改库对象代码的情况下轻松自定义这些颜色。
然后,当鼠标指针位于此类“活动”对象上方时,我需要通过对其部分进行不同样式设置来向用户发出信号:当鼠标指针悬停在可点击区域上方时,这里和那里的一些明亮轮廓可以显示可点击区域的形状。
不幸的是,我无法将样式应用于 <use> 元素的子元素,因为它们不是 DOM 中 <use> 的子元素(正如其他人已经提到的那样)。我可以对 <defs> 部分中的元素应用一些样式,因为它们在 DOM 中并且可以使用 CSS 选择器进行寻址,但是它们不能悬停,因为它们是不可见的,所以对它们应用:hover 伪类是行不通的。如果将此类应用于<use>,它也不起作用,因为这样我就无法子选择正确的子元素(它们不是<use> 的子元素)。所以我没有任何钩子可以将那些:hover 伪类应用到。
也许我的问题还有其他解决方案?
【问题讨论】: