D3.js: come ottenere la larghezza e l'altezza calcolate per un elemento arbitrario?


120

Ho bisogno di conoscere esattamente la larghezza e l'altezza di un gelemento arbitrario nel mio SVGperché ho bisogno di disegnare un indicatore di selezione attorno ad esso una volta che l'utente ha cliccato su di esso.

Quello che ho visto in internet è qualcosa di simile: d3.select("myG").style("width"). Il problema è che l'elemento non avrà sempre un attributo di larghezza esplicito impostato. Ad esempio, quando creo un cerchio all'interno di g, avrà il radious ( r) impostato al posto della larghezza. Anche se utilizzo il window.getComputedStylemetodo su a circle, restituirà "auto".

C'è un modo per calcolare la larghezza di una selezione arbitraria svgin D3?

Grazie.

Risposte:


225

Per elementi SVG

Usando qualcosa di simile selection.node().getBBox()ottieni valori come

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

Per elementi HTML

Uso selection.node().getBoundingClientRect()


36
Per gli elementi HTML, usa getBoundingClientRect()invece di SVG-only getBBox(). In questo modo:d3.select("body").node().getBoundingClientRect().width
Toph

1
Potrebbe fare con un po 'più di informazioni per aiutare. Per elementi SVG o o HTML? È solo Firefox il problema? È stato segnalato qualcosa nella console? Qual è il valore restituito? Hai un esempio di codice minimo (jsfiddle) che ha dimostrato il problema?
Christopher Hackett

29

.getBoundingClientRect () restituisce la dimensione di un elemento e la sua posizione rispetto al viewport. Possiamo facilmente ottenere quanto segue

  • sinistra destra
  • in alto, in basso
  • altezza larghezza

Esempio :

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

1

Una volta ho affrontato il problema quando non sapevo quale elemento fosse attualmente memorizzato nella mia variabile (svg o html) ma avevo bisogno di ottenerlo larghezza e altezza. Ho creato questa funzione e voglio condividerla:

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

Piccola demo nello snippet nascosto di seguito. Gestiamo il clic sul div blu e sul cerchio rosso svg con la stessa funzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.