使用Javascript创建的SVG路径没有宽度或高度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Javascript创建的SVG路径没有宽度或高度相关的知识,希望对你有一定的参考价值。

我试图使用javascript和SVG以编程方式创建一个圆角。角点已成功创建,但path始终设置为0宽度和0高度。

如果我复制创建的字符串元素并将其粘贴到文件中,那么它的工作没有任何问题,如代码片段的第二行所示。

为什么只有编程创建的路径没有宽度和高度?我错过了什么?

var cornerTopLeft = createCorner("top-left");
applyCornerStyles.call(cornerTopLeft, 0, 0, 10);

var body = document.getElementsByTagName("body")[0];
body.appendChild(cornerTopLeft);

function createCorner(cornerPosition) {
  var corner = document.createElement("svg");
  corner.setAttribute("fill", "red");
  corner.setAttribute("style", "width:10px;height:10px;background-color: red;");
  corner.setAttribute("viewBox", "0 0 100 100");
  corner.setAttribute("xmlns", "http://www.w3.org/2000/svg")
  corner.innerhtml = '<path class="" style="background-color: rgba(0, 0, 0, .5);fill: rgba(0, 0, 0, .5);" d="M100 0 ,Q 0 0 0 100, L0 0, Z"></path>';
  return corner;
}

function applyCornerStyles(top, left, size) {
  this.style.top = top + "px";
  this.style.left = left + "px";
  this.style.width = size + "px";
  this.style.height = size + "px";
  this.style.zIndex = "20002";
  this.style.position = "absolute";
}
<h3>This svg was created using svg string created programatcally.</h3>
<svg fill="none" viewbox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" style="top: 22px; left: 510px; width: 10px; height: 10px; z-index: 20001; position: absolute;">
  <path class="" style="background-color: rgba(0, 0, 0, .5);fill: rgba(0, 0, 0, .5);" d="M100 0 ,Q 0 0 0 100, L0 0, Z"></path>
</svg>

(Qazxswpoi)

答案

为了创建一个新的svg元素,你需要使用fiddle而不是document.createElementNS。 您还需要使用document.createElement创建路径。 document.createElementNS不会这样做。

corner.innerHTML = '<path class=...
const SVG_NS = 'http://www.w3.org/2000/svg';

var cornerTopLeft = createCorner("top-left");
applyCornerStyles.call(cornerTopLeft, 0, 0, 10);

var body = document.getElementsByTagName("body")[0];
body.appendChild(cornerTopLeft);

function createCorner(cornerPosition) {
  var corner = document.createElementNS(SVG_NS, 'svg');
  corner.setAttributeNS(null,"fill", "red");
  corner.setAttribute("class","corner")
  corner.setAttributeNS(null,"viewBox", "0 0 100 100");
  //corner.setAttribute("xmlns", "http://www.w3.org/2000/svg")
  var path = document.createElementNS(SVG_NS, 'path');
  path.setAttributeNS(null,"fill", "rgba(0, 0, 0, .5)");
  path.setAttributeNS(null,"d","M100 0 ,Q 0 0 0 100, L0 0, Z");
  corner.appendChild(path)
  return corner;
}




function applyCornerStyles(top, left, size) {
  this.style.top = top + "px";
  this.style.left = left + "px";
  this.style.width = size + "px";
  this.style.height = size + "px";
  
  this.style.position = "absolute";
}
svg{border:1px solid}

.corner{background-color: red;}
另一答案

使用<h3>This svg was created using svg string created programatcally.</h3> <svg fill="none" viewbox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" style="top: 22px; left: 510px; width: 10px; height: 10px; z-index: 20001; position: absolute;"> <path class="" style="background-color: rgba(0, 0, 0, .5);fill: rgba(0, 0, 0, .5);" d="M100 0 ,Q 0 0 0 100, L0 0, Z"></path> </svg>而不是var corner = document.createElementNS("http://www.w3.org/2000/svg", "svg");

以上是关于使用Javascript创建的SVG路径没有宽度或高度的主要内容,如果未能解决你的问题,请参考以下文章

计算 SVG 文本高度和宽度的正确方法

React Native SVG描边动画

创建反向剪辑路径 - CSS 或 SVG

创建一个反向剪辑路径 - CSS或SVG

svg路径到给定宽度和高度的预先计算比例

内联 svg 缩放 - 自动宽度