D3.js: Làm thế nào để lấy chiều rộng và chiều cao được tính toán cho một phần tử tùy ý?


120

Tôi cần biết chính xác chiều rộng và chiều cao cho một gphần tử tùy ý trong của tôi SVGvì tôi cần vẽ một điểm đánh dấu lựa chọn xung quanh nó khi người dùng đã nhấp vào nó.

Những gì tôi đã nhìn thấy trong internet là cái gì đó như: d3.select("myG").style("width"). Vấn đề là phần tử sẽ không phải lúc nào cũng có tập thuộc tính chiều rộng rõ ràng. Ví dụ, khi tôi tạo một vòng tròn bên trong g, nó sẽ có bộ radious ( r) thay vì chiều rộng. Ngay cả khi tôi sử dụng window.getComputedStylephương thức trên a circle, nó sẽ trả về "tự động".

Có cách nào để tính chiều rộng của một vùng tùy ý svgtrong D3không?

Cảm ơn bạn.

Câu trả lời:


225

Đối với các phần tử SVG

Sử dụng thứ gì đó giống như selection.node().getBBox()bạn nhận được các giá trị như

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

Đối với các phần tử HTML

Sử dụng selection.node().getBoundingClientRect()


36
Đối với các phần tử HTML, hãy sử dụng getBoundingClientRect()thay vì chỉ SVG getBBox(). Như vậy:d3.select("body").node().getBoundingClientRect().width
Toph

1
Có thể làm với một chút thông tin để giúp đỡ. Đối với các phần tử SVG hoặc hoặc HTML? Có phải chỉ có Firefox là vấn đề? Có gì được báo cáo trong bảng điều khiển không? Giá trị trả về là gì? Bạn có một ví dụ mã tối thiểu (jsfiddle) chứng minh sự cố không?
Christopher Hackett

29

.getBoundsClientRect () trả về kích thước của một phần tử và vị trí của nó so với khung nhìn.

  • trái phải
  • trên, dưới
  • chiều cao chiều rộng

Thí dụ :

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

1

Có lần tôi gặp phải vấn đề khi không biết phần tử nào hiện được lưu trữ trong biến của mình (svg hoặc html) nhưng tôi cần lấy chiều rộng và chiều cao của nó. Tôi đã tạo chức năng này và muốn chia sẻ nó:

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;
}

Bản demo nhỏ trong đoạn mã ẩn bên dưới. Chúng tôi xử lý nhấp chuột vào div màu xanh và trên vòng tròn svg màu đỏ với chức năng tương tự.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.