ventana tamaño resolucion pantalla navegador detectar alto javascript d3.js

javascript - tamaño - D3.js: ¿Cómo obtener el ancho y la altura calculados para un elemento arbitrario?



javascript alto de pantalla (3)

Necesito saber exactamente el ancho y la altura de un elemento g arbitrario en mi SVG porque 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á el radioso ( r ) establecido en lugar del ancho. Incluso si uso el método window.getComputedStyle en un circle , devolverá "auto".

¿Hay alguna manera de calcular el ancho de un evento svg arbitrario en D3 ?

Gracias.


.getBoundingClientRect () devuelve el tamaño de un elemento y su posición relativa a la ventana gráfica. Podemos seguir fácilmente

  • izquierda derecha
  • arriba, abajo
  • anchura altura

Ejemplo:

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


Para elementos SVG

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

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

Para elementos HTML

Utilice selection.node().getBoundingClientRect()


Una vez que me enfrenté con el problema cuando no sabía cuál era el elemento actualmente almacenado en mi variable (svg o html), pero necesitaba obtenerlo de ancho y 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. Nos ocupamos de hacer clic en el div azul y en el círculo rojo svg con la misma función.

var svg = d3.select(''svg'') .attr(''width'', 50) .attr(''height'', 50); function computeDimensions(selection) { var dimensions = null; var node = selection.node(); if (node instanceof SVGElement) { dimensions = node.getBBox(); } else { dimensions = node.getBoundingClientRect(); } console.clear(); console.log(dimensions); return dimensions; } var circle = svg .append("circle") .attr("r", 20) .attr("cx", 30) .attr("cy", 30) .attr("fill", "red") .on("click", function() { computeDimensions(circle); }); var div = d3.selectAll("div").on("click", function() { computeDimensions(div) });

* { margin: 0; padding: 0; border: 0; } body { background: #ffd; } .div { display: inline-block; background-color: blue; margin-right: 30px; width: 30px; height: 30px; }

<h3> Click on blue div block or svg circle </h3> <svg></svg> <div class="div"></div> <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.11.0/d3.min.js"></script>