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.