在d3中动态附加形状

时间:2018-08-15 11:18:35

标签: d3.js svg

我正在根据append所包含的内容来动态地datum加工形状。我的对象是这样:

const boom = [
  {
    shape: 'rect',
    color: 'red',
    width: 50,
    height: 50,
    x: 50,
    y: 100
  }
]

我的代码是这样:

const stage = d3.select('stageContainer')
    .append('svg')
    .attr('width', 100)
    .attr('height', 100)
    .style('border-width', '2')
    .style('border-color', 'red')
    .style('border-style', 'solid')

stage.selectAll('.group01')
      .data(boom)
      .enter()
      .append(d => document.createElement(d.shape))
      .attr('fill', d => d.color)
      .attr('width', d => d.width)
      .attr('height', d => d.height)
      .attr('x', d => d.x)
      .attr('y', d => d.y)

我可以看到它正在添加到DOM中,但实际上并没有呈现。

1 个答案:

答案 0 :(得分:2)

要创建SVG元素,您必须使用document.createElementNS

.append(d => document.createElementNS('http://www.w3.org/2000/svg', d.shape))

或者,您可以使用d3.namespaces中的内置名称空间:

.append(d => document.createElementNS(d3.namespaces.svg, d.shape))

这是您所做的更改的代码:

const boom = [{
  shape: 'rect',
  color: 'blue',
  width: 50,
  height: 50,
  x: 40,
  y: 10
}];

const stage = d3.select('body')
  .append('svg')
  .attr('width', 100)
  .attr('height', 100)
  .style('border-width', '2')
  .style('border-color', 'red')
  .style('border-style', 'solid')

stage.selectAll('.group01')
  .data(boom)
  .enter()
  .append(d => document.createElementNS(d3.namespaces.svg, d.shape))
  .attr('fill', d => d.color)
  .attr('width', d => d.width)
  .attr('height', d => d.height)
  .attr('x', d => d.x)
  .attr('y', d => d.y)
<script src="https://d3js.org/d3.v5.min.js"></script>

PS:更改该矩形的位置,否则它将落在SVG之外。