D3.js:任意の要素の計算された幅と高さを取得する方法?


120

ユーザーがクリックした後、その周りに選択マーカーを描画する必要があるため、任意のg要素の幅と高さを正確に知る必要SVGがあります。

私がインターネットで見たのは次のようなものですd3.select("myG").style("width")。問題は、要素に常に明示的な幅属性が設定されているとは限らないことです。たとえば、内に円を作成すると、幅の代わりにg半径(r)が設定されます。でwindow.getComputedStyleメソッドを使用しても、circle「auto」が返されます。

で任意のsvgselementの幅を計算する方法はあり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)はありますか?
クリストファーハケット2015

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.