【问题标题】:Updating xlink:href doesn't read CSS of source element in Safari更新 xlink:href 不会读取 Safari 中源元素的 CSS
【发布时间】:2014-04-02 10:31:30
【问题描述】:

我正在尝试使用一些脚本编写 SVG。我遇到的一个问题是在 Safari 中将 xlink:href 更改为 <use /> 元素 - 设置此属性后它会变黑。它在 Chrome 中运行良好。

测试页面位于http://test.ukleja.info/xlink-test.svg

单击灰色圆圈(即<use /> 元素)应更改xlink:href 属性并链接到<defs> 中定义的另一个<symbol> 元素并将其变为蓝色。

下面我粘贴代码:

<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <script>
        function newUse () {
            document.getElementById('myUse').setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#newUse')
        }
    </script>
    <style type="text/css">
        .existing {
            stroke: #666;
            stroke-width: 16;
            fill: #ccc;
        }
        .new {
            stroke: #3399ff;
            stroke-width: 16;
            fill: #99ccff;
        }
    </style>
    <defs>
        <symbol id="existingUse" style="overflow:visible">
            <circle cx="48" cy="48" r="48" class="existing" />
        </symbol>
        <symbol id="newUse" style="overflow:visible">
            <circle cx="48" cy="48" r="48" class="new" />
        </symbol>
    </defs>
    <use id="myUse" xlink:href="#existingUse" x="64" y="64" onclick="newUse()" />
</svg>

请帮助我,告诉我出了什么问题。谢谢。


经过多次试验,我找到了原因——据我所知,它不依赖于命名空间、xlink 或类似的东西。因此我稍微改变了话题。

Safari 不读取symbol 元素所引用的use 元素的类/样式。直接在symbol 元素中更改内联样式可以解决问题。然而,这仍然不是 Safari 的理想行为。

有什么想法吗?

【问题讨论】:

  • Safari 中的一个更奇怪的行为:最初的圆圈是灰色的,带有深灰色的轮廓。当您单击它时,它会变为黑色而没有任何笔触,这不是您想要的效果。但是当你放大时,它会立即变成带有深蓝色轮廓的蓝色圆圈——它应该是这样的。我不明白。
  • 您有没有找到解决方法或解决方法?我遇到了同样的问题...

标签: javascript css svg safari


【解决方案1】:

只是一个建议(远射)。尝试在通话中仅使用“href”,而不是“xlink:href”。即:

setAttributeNS('http://www.w3.org/1999/xlink', 'href', '#newUse')

我无法自己测试它,因为我使用的是适用于 Windows 的 Safari 5.1.7,而且它似乎根本不支持 SVG 脚本。

【讨论】:

  • 不幸的是它不起作用。 Safari 的行为很奇怪——在这两种情况下。它添加了href 属性,使xlink:href 保持不变。
【解决方案2】:

尝试使用 SVGUseElement 的 api。

document.getElementById('myUse').href.baseVal = '#newUse';

试试 SVGSVGElement 的 forceRedraw 方法。

document.documentElement.forceRedraw();

【讨论】:

  • 同样的效果:/但我发现问题出在哪里-它是CSS-它与setAttributeNS没有关系(据我所知)。我将在我的第一篇文章中扩展描述。谢谢。
  • 我认为重绘将是解决方法。但是我不知道如何实现它:/。再次感谢您。
猜你喜欢
  • 2018-03-30
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 2014-02-03
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
相关资源
最近更新 更多