【问题标题】:conflicting ids in two different SVG files included in the same HTML document同一 HTML 文档中包含的两个不同 SVG 文件中的 id 冲突
【发布时间】:2013-02-08 13:45:24
【问题描述】:

所以我有一个带有一些预制渐变效果的 .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 文件的简化版本。它表示一个地图,其中每个状态都是一个路径元素。每个状态还具有与之关联的径向梯度标签。我遇到的问题是我在我的 HTML 文档中两次包含这个 SVG 文件,并且我更改了 svg 上的径向渐变标签以分别更改每个地图上的状态颜色。

地图也有一些交互性,当用户将鼠标悬停在地图上时,我使用以下代码加载 svg 并添加将状态置于最前面(因此其笔划可见)的事件:

$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。有什么想法吗?

【问题讨论】:

  • 您如何在文档中包含 SVG 文件?
  • @robertc 我使用 jQuery ajax 请求(我的文档的一个 div 上的 .load 方法)加载它。我编辑了我的问题以显示它。
  • 如何将 SVG 放在
  • 那么你会遇到 ID 冲突的问题,除非你在加载时更改 ID。

标签: javascript jquery html svg


【解决方案1】:

SVG 注入器(如 Iconic SVGInjector 或更新的 Iconfu SVGInject)通过在将 SVG 插入 HTML 文档时使 ID 唯一来解决此问题。 Iconic 注入器在 ID 中添加了一个运行编号(grad1 变为 grad1-1),而 Iconfu 注入器添加了一个短随机字符串(grad1 变为类似grad1-4ew8ZeSw)。

不仅如果两个 SVG 使用相同的 ID,而且如果在 HTML 文档中多次使用相同的 SVG,则需要使 ID 唯一。

【讨论】:

  • 很遗憾它是这样工作的,幸运的是,现在有一些工具可以在最初提出问题时提供帮助(2013 年)。我不记得当时我是如何解决这个问题的,但我想我只是在将第二张地图添加到页面之前手动更改了它的 id
  • 刚刚遇到了类似的问题。由于我将 CSS 样式定向到两个 SVG 的单独路径 ID,因此解决方案是更改过滤器定义的 ID!有必要在一个 SVG 中更改两件事:1)将 中的 id="path_xxx" 更改为例如id="path_xxx2" 2) 中的filter="url(#path_xxx)" 到例如filter="url(#path_xxx2)"
猜你喜欢
  • 2012-03-26
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多