D3.js:如何获得任意元素的计算宽度和高度?

时间:2014-02-24 14:39:48

标签: javascript d3.js

我需要确切知道g中任意SVG元素的宽度和高度,因为我需要在用户点击它后在其周围绘制一个选择标记。

我在互联网上看到的是:d3.select("myG").style("width")。问题是元素不会总是具有明确的宽度属性集。例如,当我在g内创建一个圆圈时,它将具有辐射(r)而不是宽度。即使我在window.getComputedStyle上使用circle方法,也会返回“自动”。

有没有办法计算svg中任意D3元素的宽度?

谢谢。

3 个答案:

答案 0 :(得分:207)

对于SVG元素

使用类似selection.node().getBBox()的内容,您可以获得类似

的值
{
    height: 5, 
    width: 5, 
    y: 50, 
    x: 20
} 

对于HTML元素

使用selection.node().getBoundingClientRect()

答案 1 :(得分:24)

  

.getBoundingClientRect()返回元素的大小及其相对于viewport的位置。我们可以轻松获得以下内容

  • 左,右
  • 顶部,底部
  • 身高,宽度

示例:

var element = d3.select('.elementClassName').node();
element.getBoundingClientRect().width;

答案 2 :(得分:1)

当我遇到问题时,我不知道当前存储在我的变量(svg或html)中的元素,但我需要得到它的宽度和高度。我创建了这个功能,想要分享它:

function computeDimensions(selection) {
  var dimensions = null;
  var node = selection.node();

  if (node instanceof SVGElement) { // check if node is svg element
    dimensions = node.getBBox();
  } else { // else is html element
    dimensions = node.getBoundingClientRect();
  }
  console.log(dimensions);
  return dimensions;
}

下面隐藏代码段中的小演示。我们处理点击蓝色div并在红色svg圆圈上使用相同的功能。

var svg = d3.select('svg')
  .attr('width', 50)
  .attr('height', 50);

function computeDimensions(selection) {
	var dimensions = null;
  var node = selection.node();

  if (node instanceof SVGElement) {
   	dimensions = node.getBBox();
  } else {
  	dimensions = node.getBoundingClientRect();
  }
  console.clear();
  console.log(dimensions);
  return dimensions;
}

var circle = svg
    .append("circle")
    .attr("r", 20)
    .attr("cx", 30)
    .attr("cy", 30)
    .attr("fill", "red")
    .on("click", function() { computeDimensions(circle); });
    
var div = d3.selectAll("div").on("click", function() { computeDimensions(div) });
* {
  margin: 0;
  padding: 0;
  border: 0;
}

body {
  background: #ffd;
}

.div {
  display: inline-block;
  background-color: blue;
  margin-right: 30px;
  width: 30px;
  height: 30px;
}
<h3>
  Click on blue div block or svg circle
</h3>
<svg></svg>
<div class="div"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.11.0/d3.min.js"></script>