D3.js: Comment obtenir la largeur et la hauteur calculées pour un élément arbitraire?

120

J'ai besoin de connaître exactement la largeur et la hauteur d'un gélément arbitraire dans mon SVGparce que je dois dessiner un marqueur de sélection autour de lui une fois que l'utilisateur a cliqué dessus.

Ce que j'ai vu sur Internet est quelque chose comme: d3.select("myG").style("width"). Le problème est que l'élément n'aura pas toujours un jeu d'attributs de largeur explicite. Par exemple, lorsque je crée un cercle à l'intérieur du g, il aura le radious ( r) défini au lieu de la largeur. Même si j'utilise la window.getComputedStyleméthode sur a circle, elle retournera "auto".

Existe-t-il un moyen de calculer la largeur d'un svgsélement arbitraire dans D3?

Je vous remercie.

André Pena
la source

Réponses:

225

Pour les éléments SVG

En utilisant quelque chose comme selection.node().getBBox()vous obtenez des valeurs comme

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

Pour les éléments HTML

Utilisation selection.node().getBoundingClientRect()

Christopher Hackett
la source
36
Pour les éléments HTML, utilisez à la getBoundingClientRect()place du SVG uniquement getBBox(). Comme ça:d3.select("body").node().getBoundingClientRect().width
Toph
1
Pourrait faire avec un peu plus d'informations pour vous aider. Pour les éléments SVG ou HTML? Est-ce uniquement Firefox qui pose problème? Quelque chose est-il signalé dans la console? Quelle est la valeur renvoyée? Avez-vous un exemple de code minimal (jsfiddle) qui a démontré le problème?
Christopher Hackett
29

.getBoundingClientRect () renvoie la taille d'un élément et sa position par rapport à la fenêtre.

  • gauche droite
  • haut, bas
  • hauteur largeur

Exemple :

var element = d3.select('.elementClassName').node();
element.getBoundingClientRect().width;
Malik Khalil
la source
1

Une fois, j'ai rencontré le problème lorsque je ne savais pas quel élément actuellement stocké dans ma variable (svg ou html) mais que j'avais besoin de l'obtenir en largeur et en hauteur. J'ai créé cette fonction et je souhaite la partager:

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

Petite démo dans l'extrait caché ci-dessous. Nous gérons le clic sur le div bleu et sur le cercle svg rouge avec la même fonction.

Mikhail Shabrikov
la source