我正在尝试使用 CSS:hover
伪类来设置标签嵌入的 SVG 元素的样式<defs>
,<use>
但它似乎不起作用:-/ 这是我的代码:
<!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>
嵌入它的形状时,它会起作用。但它不适用于通过嵌入的组内的任何类或 ID <use>
。
如何解决?
或者也许有更好的方法来做到这一点?
当用户悬停它时,我只需要更改嵌入对象内的这个特定部分,而不是整个组。这是因为该组的不同部分会应用不同的样式,并且在鼠标悬停时需要进行不同的更改。
编辑:我想得到什么
我想要的是一种将一个“库对象”嵌入<defs>
到我的 SVG 文档中许多不同位置的方法。该对象的某些部分需要使用 CSS 中的自定义颜色设置样式,因为我需要在不更改库对象代码的情况下轻松自定义这些颜色。
然后,当鼠标指针位于此类“活动”对象上方时,我需要通过对其部分进行不同样式的样式来向用户发出信号:当鼠标指针悬停在可点击区域上方时,这里和那里的一些明亮轮廓可以显示可点击区域的形状。
不幸的是,我不能将样式应用于<use>
元素的子元素,因为它们不是<use>
DOM 中的子元素(正如其他人已经提到的那样)。我可以将一些样式应用于该部分内的元素<defs>
,因为它们位于 DOM 中并且可以使用 CSS 选择器寻址,但它们不能悬停,因为它们是不可见的,因此:hover
对它们应用伪类不起作用。如果将此类应用于 ,它也不起作用<use>
,因为这样我就无法子选择正确的子元素(它们不是 的子元素<use>
)。所以我没有任何钩子可以应用这些:hover
伪类。
也许我的问题还有其他解决方案?