D3.js: Rasgele bir öğe için hesaplanan genişlik ve yükseklik nasıl elde edilir?


120

İçimdeki keyfi bir gelemanın genişliğini ve yüksekliğini tam olarak SVGbilmem gerekiyor çünkü kullanıcı tıkladıktan sonra etrafına bir seçim işareti çizmem gerekiyor.

Ne internette gördüğüm gibi bir şey: d3.select("myG").style("width"). Sorun, öğenin her zaman açık bir genişlik özniteliğine sahip olmamasıdır. Örneğin, içinde bir daire oluşturduğumda , genişlik yerine gradious ( r) kümesine sahip olacak . window.getComputedStyleYöntemi a üzerinde kullansam bile circle, "auto" döndürür.

svgİçinde rastgele bir seçimin genişliğini hesaplamanın bir yolu var mı D3?

Teşekkür ederim.

Yanıtlar:


225

SVG öğeleri için

selection.node().getBBox()Sizin gibi bir şey kullanarak değerler elde edin

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

HTML öğeleri için

kullanım selection.node().getBoundingClientRect()


36
HTML öğeleri getBoundingClientRect()için yalnızca SVG yerine kullanın getBBox(). Öyle:d3.select("body").node().getBoundingClientRect().width
Toph

1
Yardımcı olmak için biraz daha bilgi verebilirim. SVG veya HTML öğeleri için mi? Sorun sadece Firefox mu? Konsolda herhangi bir şey rapor edildi mi? Dönen değer nedir? Problemi gösteren minimal bir kod örneğiniz (jsfiddle) var mı?
Christopher Hackett

29

.getBoundingClientRect () , bir öğenin boyutunu ve görünüm alanına göre konumunu döndürür.

  • sol sağ
  • üst, alt
  • yükseklik genişlik

Misal :

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

1

Değişkenimde (svg veya html) şu anda hangi öğenin depolandığını bilmediğimde sorunla karşılaştığımda, ancak genişliğini ve yüksekliğini almam gerekiyordu. Bu işlevi yarattım ve paylaşmak istiyorum:

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

Aşağıdaki gizli kod parçacığında küçük demo. Mavi div ve kırmızı svg çemberindeki tıklamayı aynı işlevle ele alıyoruz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.