svg标记在IE9-10中不起作用

时间:2013-07-15 12:45:01

标签: internet-explorer svg

第一次在svg上工作。   我遵循svg定义为'箭头般的'路径

<defs>
    <marker id="start" refX="1" refY="5" markerUnits="userSpaceOnUse" markerWidth="17" markerHeight="11" orient="auto">
        <path id="conditional"   d="M 0 6 L 8 1 L 15 5 L 8 9 L 1 5" fill="white" stroke="black" stroke-width="1" />
        <path id="default" d="M 5 0 L 11 10" fill="white" stroke="black" stroke-width="1" />
    </marker>
    <marker id="end" refX="15" refY="6" markerUnits="userSpaceOnUse" markerWidth="15" markerHeight="12" orient="auto">
        <path id="arrowhead" d="M 0 1 L 15 6 L 0 11z" fill="black" stroke="black" stroke-linejoin="round" stroke-width="2" />
    </marker>
</defs>
<g id="edge">
    <path id="bg_frame" d="M10 50 L210 50" stroke="black" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" marker-start="url(#start)" marker-end="url(#end)" />
    <text id="text_name" x="0" y="0" oryx:edgePosition="startTop"/>
</g>

但它没有在IE 9或IE 10中的路径末尾显示箭头

IE中是否支持'triangle'或代码中有问题?

这里的一个例子,http://www.w3.org/TR/SVG11/images/painting/marker.svg在IE中也不起作用。

帮助请,这是我的工作流编辑器卡住的唯一一点。

链接结果

enter image description here

我的代码在FF中的结果是:

enter image description here

IE中的代码结果是(没有箭头,箭头末端没有方块):

enter image description here

7 个答案:

答案 0 :(得分:8)

xdhmoore在他的回答中写道,已经向微软报告了这个问题: https://connect.microsoft.com/IE/feedback/details/801938/dynamically-updated-svg-path-with-a-marker-end-does-not-update

有一个问题显示的小提琴: http://jsfiddle.net/EEYZZ/

   //if (isIE10 || isIE11) {
       var parent = p1.parentNode;
       parent.removeChild(p1);
       parent.appendChild(p1);
   //}

我的解决方法是manuelly从DOM中删除节点并再次添加它,这将根据需要更新节点...不要谈论性能和内容,但我认为目前没有更好的方法来实现它。 (http://jsfiddle.net/kaljak/5zTv9/3/

答案 1 :(得分:2)

我遇到了同样的问题,这让我很头疼 - 我真的不明白为什么微软不解决这个问题。我决定用自定义路径替换标记,这些路径具有很好的副作用,例如使用JavaScript在运行时更改填充或颜色。

我使用d3创建我的svg,边缘有类'edge-path',而tip有类'edge-tip'。这两条路径都是svg:g的子项。边缘本身是一个样条曲线,因此为了旋转尖端,我采用最后10个像素的斜率。这几乎是用于更新箭头的代码,适用于IE9-11:

edge.select('path.edge-tip')
     // the shape of the tip  
     .attr('d', 'M0,0L10,5L0,10Z')
     // move the tip to the end of the edge and rotate.
     .attr('transform', function(d) {
         var parent = d3.select(this).node().parentNode,
             path = d3.select(parent).select('path.edge-path').node(),
             pathLength = path.getTotalLength(),
             point1 = path.getPointAtLength(Math.max(0, pathLength - 10)),
             point2 = path.getPointAtLength(pathLength),
             vect = { x: point2.x - point1.x, y: point2.y - point1.y }
             l1 = vect.x * vect.x + vect.y * vect.y;
         l1 = Math.sqrt(l1);
         var angle = Math.acos(vect.x / l1);
         angle = 360 * (angle / (2*Math.PI));
         if (vect.y < 0) {
             angle = 360 - angle;
         }
         return 'translate(' + point1.x + ',' + (point1.y - 5) + ') rotate (' + angle +' 0 5)';
    });

也许它有助于某人:)

答案 2 :(得分:2)

IE中的一个问题似乎是marker继承了strokestroke-widthfill属性(与标准相反)。

但是,可以通过显式设置笔触属性来解决这个问题。

考虑

的问题

http://www.w3.org/TR/SVG11/images/painting/marker.svg

通过设置标记stroke="none"fill="black",渲染似乎很好:

https://codepen.io/anon/pen/qmYzGE

注意:我仅在IE11中对此进行了测试。我的猜测是它至少也会在IE10中起作用。关于此的任何信息都非常受欢迎。

答案 3 :(得分:1)

答案 4 :(得分:0)

这似乎在我的IE10中渲染得很好(左边是钻石形状,右边是三角形)。

然而 IE中有一些已知的标记问题。例如,IE不支持markerUnits =“strokeWidth”。

答案 5 :(得分:0)

在元素周围放置另一个组并在该组中定义标记在MS Edge和其他组件中有效。

     <g id="maszlinie" style="marker-start: url(#pf2); marker-end: url(#pf)">
     <g id="bline" transform="translate(0,-20)">
        <line class="masz" y2="365" y1="365" x2="415" x1="15">
     </g>
     </g>

答案 6 :(得分:0)

我无法在IE11中使用标记,但在Edge中它们可以正常工作。诀窍在于内联SVG,您需要使用xml:id作为标记,而不仅仅是id

编辑:实际上anything:id有效。不知道为什么。

编辑2:呃。这打破了Chrome中的SVG。您可以复制ID:id="foo" edge_sucks:id="foo"

编辑3:嗯,它毕竟在Edge中起作用。不知道发生了什么。