D3.js : 임의의 요소에 대해 계산 된 너비와 높이를 얻는 방법은 무엇입니까?


120

사용자가 클릭하면 그 주위에 선택 마커를 그려야하기 때문에 g내 임의의 요소 의 너비와 높이를 정확히 알아야 SVG합니다.

내가 인터넷에서 본 것은 다음과 같습니다 d3.select("myG").style("width"). 문제는 요소가 항상 명시적인 너비 속성 집합을 가지지 않는다는 것입니다. 예를 들어 내부에 원을 만들면 너비 대신 g반경 ( r)이 설정됩니다. 에 window.getComputedStyle메서드를 사용하더라도 circle"auto"를 반환합니다.

에서 임의의 svg요소 의 너비를 계산하는 방법이 D3있습니까?

감사합니다.

답변:


225

SVG 요소의 경우

같은 것을 사용하면 다음과 같은 selection.node().getBBox()값을 얻을 수 있습니다.

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

HTML 요소의 경우

사용하다 selection.node().getBoundingClientRect()


36
HTML 요소 getBoundingClientRect()의 경우 SVG 전용 getBBox(). 다음과 같이 :d3.select("body").node().getBoundingClientRect().width
Toph

1
도움이되는 정보가 조금 더 있습니다. SVG 또는 HTML 요소의 경우? 문제는 Firefox 뿐입니 까? 콘솔에보고 된 것이 있습니까? 반환 된 값은 무엇입니까? 문제를 보여주는 최소한의 코드 예제 (jsfiddle)가 있습니까?
Christopher Hackett

29

.getBoundingClientRect () 는 요소의 크기와 뷰포트에 대한 상대적 위치를 반환합니다.

  • 왼쪽 오른쪽
  • 상단, 하단
  • 높이 너비

예 :

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

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 원에 대한 클릭을 동일한 기능으로 처리합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.