所以我有一个单独的.svg文件,其中包含一些预先制作的渐变效果:
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="1052.4" width="744.09" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 670 680" style="width: 100%; height: 100%;">
<defs>
<radialGradient id="grad1" cx="50%" cy="50%" r="50%" fx="50%" fy="50%">
<stop offset="0%" style="stop-color: #a0a0a0;" />
<stop offset="100%" style="stop-color: #a0a0a0;" />
</radialGradient>
</defs>
<g>
<path id="path1" d="m124 263.35c6.4216-12.385 18.974-0.67157 0.72621z" fill="url(#grad1)">
</path>
</g>
</svg>
这是我的svg文件的简化版本。它表示一个映射,其中每个状态都是路径元素。每个州还有一个与之相关的radialgradient标签。我遇到的问题是我在我的HTML文档中包含了两次这个SVG文件,并且我改变了svg上的径向渐变标记,以分别改变每个地图上的状态颜色。
地图中也有一些交互性,我使用以下代码加载svg并添加事件,当用户将鼠标悬停在地图上时,将状态置于前面(因此其笔划可见): / p>
$divSVG.load("map.svg", function() {
$svg= $(this).find("svg");
$svg.find("path").each(function() {
$(this).bind("mouseenter", function() {
var $path= $(this);
var $parent= $path.parent();
//its necessary to detach and reattach the element so it comes to the front
//of the image (there is no z-index in SVG)
$path.detach();
$parent.append($path);
$path
.css("stroke", "#FF0000")
.css("stroke-width", "5px");
});
$(this).bind("mouseleave", function() {
$(this)
.css("stroke", "#FFFFFF")
.css("stroke-width", "3px");
});
}
});
基本上我只是删除元素,并在元素悬停时将其重新附加到其父元素。
问题:当元素重新附加到文档中首先添加的地图上时,它将使用第二个地图上的径向渐变开始。这意味着当我将第一张地图悬停时,状态会将颜色更改为与第二张地图上的颜色相同的颜色。
我认为原因是因为它加载了两次相同的文件,所以渐变ID是冲突的,导致重新连接的元素从HTML文档中找到的最后一个渐变标记中获取颜色,而不是它自己的渐变标记SVG标签。
所以这是我的问题,我该如何解决?我不想为每个具有唯一ID的地图创建新的SVG文件。我也不想通过javascript操纵id。有什么想法吗?
答案 0 :(得分:3)
诸如Iconic SVGInjector或更新的Iconfu SVGInject之类的SVG注入器通过将SVG插入HTML文档时使ID唯一来处理此问题。 Iconic注入器向ID添加一个运行编号(grad1
变为grad1-1
),而Iconfu注入器添加一个短随机字符串(grad1
变为类似grad1-4ew8ZeSw
)。 / p>
不仅要使两个SVG使用相同的ID,而且要在一个HTML文档中多次使用同一个SVG,都必须使ID唯一。