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

kuarbcqp  于 2023-10-19  发布在  其他
关注(0)|答案(4)|浏览(237)

我需要确切地知道SVG中任意g元素的宽度和高度,因为一旦用户单击它,我需要在它周围画一个选择标记。
我在网上看到的是这样的:d3.select("myG").style("width")。问题是元素并不总是有一个显式的width属性。例如,当我在g内创建一个圆时,它将设置半径(r)而不是宽度。即使我在circle上使用window.getComputedStyle方法,它也会返回“auto”。
有没有办法计算D3中任意svg元素的宽度?
谢谢

qnzebej0

qnzebej01#

对于SVG元素

使用像selection.node().getBBox()这样的值,可以得到如下值:

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

HTML元素

使用selection.node().getBoundingClientRect()

kadbb459

kadbb4592#

**.getBoundingClientRect()**返回元素的大小及其相对于视口的位置。

  • 左右
  • 上下
  • 高度、宽度
    示例:
var element = d3.select('.elementClassName').node();
element.getBoundingClientRect().width;
6tqwzwtp

6tqwzwtp3#

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

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

  if (node instanceof SVGGraphicsElement) { // 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>
ijxebb2r

ijxebb2r4#

通过直接调用clientWidth使用更少的代码:

const element = d3.select('yourElementIdOrClass');

const width = element.node().clientWidth;

相关问题