D3.js: ¿Cómo obtener el ancho y alto calculados para un elemento arbitrario?


120

Necesito saber exactamente el ancho y la altura de un gelemento arbitrario en mi SVGporque necesito dibujar un marcador de selección a su alrededor una vez que el usuario ha hecho clic en él.

Lo que he visto en internet es algo así como: d3.select("myG").style("width"). El problema es que el elemento no siempre tendrá un atributo de ancho explícito establecido. Por ejemplo, cuando creo un círculo dentro de g, tendrá radious ( r) en lugar del ancho. Incluso si uso el window.getComputedStylemétodo en a circle, devolverá "auto".

¿Hay alguna forma de calcular el ancho de una selección arbitraria svgen D3?

Gracias.

Respuestas:


225

Para elementos SVG

Usando algo como selection.node().getBBox(), obtienes valores como

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

Para elementos HTML

Utilizar selection.node().getBoundingClientRect()


36
Para elementos HTML, use en getBoundingClientRect()lugar de solo SVG getBBox(). Así:d3.select("body").node().getBoundingClientRect().width
— Toph

1
Me vendría bien un poco más de información para ayudar. ¿Para SVG o elementos HTML? ¿Es solo Firefox el problema? ¿Se informa algo en la consola? ¿Cuál es el valor devuelto? ¿Tiene un ejemplo de código mínimo (jsfiddle) que demostró el problema?
— Christopher Hackett

29

.getBoundingClientRect () devuelve el tamaño de un elemento y su posición en relación con la ventana gráfica.

  • izquierda derecha
  • arriba, abajo
  • anchura altura

Ejemplo:

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

1

Una vez me enfrenté al problema cuando no sabía cuál era el elemento almacenado actualmente en mi variable (svg o html) pero necesitaba obtener el ancho y el alto. Creé esta función y quiero compartirla:

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

Pequeña demostración en el fragmento oculto a continuación. Manejamos clic en el div azul y en el círculo svg rojo con la misma función.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.