javascript - 如何让添加了 Javascript 的 SVG 的标记端正确对齐?

标签 javascript svg

如果我将 SVG 写入 html 文档,然后查看文档,我就会得到正确对齐的 SVG 代码:

<html>
<head>
  <script type="text/javascript" src="jquery-1.12.2.min.js"></script>
  <script type="text/javascript" src="script.js"></script>
  <link rel="stylesheet" href="style.css" />
</head>
<body>

  <div id="stage">
  <svg width="100" height="100">
  <defs>
    <marker id="arrow-1" markerWidth="4" markerHeight="3" markerUnits="strokeWidth" refx="1" refy="5" viewBox="0 0 10 10" orient="auto">
      <path d="M 0 0 L 10 5 L 0 10 z" fill="context-stroke"></path>
    </marker>
  </defs>
  <path d="M 0,10 L 90,10" stroke-width="2" stroke="red" marker-end="url(#arrow-1)"></path>
  </svg>
  </div>

</body>
</html>

这很好用,并呈现如下: Working arrow

请注意,在工作输出中,标记端与笔画正确对齐

然后我尝试使用 JavaScript 生成完全相同的 SVG 结构:

  var arrowID = 0;
  function drawArrow() {
    var ns = 'http://www.w3.org/2000/svg';
    var svg = document.createElementNS(ns, 'svg');
    svg.setAttribute("width",100);
    svg.setAttribute("height",100);

    var defs = document.createElementNS(ns, "defs");
    var marker = document.createElementNS(ns, "marker");
    var id = "arrow-" + arrowID++;
    marker.setAttribute("id", id);
    marker.setAttribute("markerWidth", 4);
    marker.setAttribute("markerHeight", 3);
    marker.setAttribute("markerUnits", "strokeWidth");
    marker.setAttribute("refx", 1);
    marker.setAttribute("refy", 5);
    marker.setAttribute("viewBox", "0 0 10 10");
    marker.setAttribute("orient", "auto");

    var path = document.createElementNS(ns, "path");
    path.setAttribute("d","M 0 0 L 10 5 L 0 10 z");
    path.setAttribute("fill","context-stroke");

    marker.appendChild(path);
    defs.appendChild(marker);
    svg.appendChild(defs);

    var instance = document.createElementNS(ns, "path");
    // todo set actual start and end
    instance.setAttribute("d", "M 0,10 L 90,10");
    instance.setAttribute("stroke-width", "2");
    instance.setAttribute("stroke", "red");
    instance.setAttribute("marker-end", "url(#"+id+")");

    svg.appendChild(instance);

    document.getElementById("stage").appendChild(svg);


  }

即使最终出现在页面上的 SVG 是正确的(与上面的相同):

screenshot of chrome dev tools html structure

渲染的 SVG 是错误的,看起来像这样: Not aligned arrow

请注意,在失败的输出中,标记端未与笔画正确对齐。

硬编码 HTML 呈现中的 JavaScript 代码缺少什么?为什么 JavaScript 会呈现未对齐的标记端?

一切尽在掌握:fiddle

最佳答案

SVG 区分大小写。正确的属性名称是 refX 和 refY。

关于javascript - 如何让添加了 Javascript 的 SVG 的标记端正确对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36430802/

相关文章:

javascript - D3 JS 工具提示触发鼠标悬停事件

javascript - D3。加载 SVG 文件并一次只显示一个。褪色/更换问题

javascript - js文件类型错误: Dispatch is not a Function in actions.

javascript - 显示从 API 调用中以二进制数据形式返回的图像

javascript - 如何将文本显示到保留其限制的文本区域中?

java - 使用Java中的pptx4j将PowerPoint 2007/2010文件格式转换为svg

javascript - SVG 使用元素工具提示

css - 更改 SVG 动画的方向

javascript - 鼠标悬停 UL 子节点不正确

javascript - jquery scrollTo 不工作