Comment ajouter une couleur d'arrière-plan d3 éléments de texte?

J'essaye d'ajouter un rect élément à l'origine de texte avec d3 pour simuler la couleur d'arrière-plan qui n'existe pas pour les d3 éléments de texte. Je voudrais que le rect avoir exactement la même taille que le texte lui-même.

node.append("text") 
    .attr("class", "text")
    .attr("text-anchor", "middle")
    .attr("dx", 0)
    .attr("dy", ".35em")
    .text(function(d) {
          var bbox = this.getBBox();
          node.insert("rect",":first-child")
          .attr("x", bbox.x)
          .attr("y", bbox.y)
          .attr("width", bbox.width)
          .attr("height", bbox.height)
          .style("fill", "yellow");
        return d.name;
    });

cette.getBBox() renvoie 0 pour x et de y.

Le code suivant afficher la boîte, mais il n'y a pas de très avec la taille du texte, et la boîte est tiré, même lorsque le texte n'est pas (si une image existe).

node.filter(function(d) {return (!d.image)}).append("text") 
    .attr("class", function(d) { return "text "+d.type; })
    .attr("text-anchor", "middle")
    .attr("dx", 0)
    .attr("dy", ".35em")
    //.text(function(d) { if (!d.imgB64) { return d.label; }
    .text(function(d) {
        return d.name;
    })
    .each(function(d) {
       var bbox = this.getBBox();
          node.insert("rect", "text")
          .style("fill", "#FFE6F0")
          .attr("x", bbox.x)
          .attr("y", bbox.y)
          .attr("width", bbox.width)
          .attr("height", bbox.height);
    });

SOLUTION

Grâce à Cool Blue, le code suivant fonctionne maintenant correctement: afficher un rect derrière le texte afin qu'il soit lisible quand plus grand que le nœud de cercle. Dans le futur, il pourrait être amélioré par une sphère de l'arc, plutôt que les rect seulement à cacher le cercle image derrière le texte...

Comment ajouter une couleur d'arrière-plan d3 éléments de texte?

//only display node labels if node has no image 
node.filter(function(d) {return (!d.image)}).append("text") 
    .attr("class", function(d) { return "text "+d.type; })
    .attr("text-anchor", "middle")
    .attr("dx", 0)
    .attr("dy", ".35em")
    .text(function(d) {
        return d.name;
    })
    .call(getTextBox);

//only display a rect behind labels if node has no image 
node.filter(function(d) {return (!d.image)}).insert("rect","text")
    .attr("x", function(d){return d.bbox.x})
    .attr("y", function(d){return d.bbox.y})
    .attr("width", function(d){return d.bbox.width})
    .attr("height", function(d){return d.bbox.height})
    .style("fill", "#FFE6F0");

function getTextBox(selection) {
    selection.each(function(d) { d.bbox = this.getBBox(); })
}
  • Qu'advient-il si vous remplacez box.x avec d3.select(this).attr("x")?
  • Mais de toute façon, la boîte englobante sera de zéro largeur et la hauteur, car il n'y a pas de texte, a ajouté encore. Je le ferais autrement... Voir cet exemple
  • J'ai réussi à l'avoir en partie de travail en déplaçant le code dans un .each(function(d){ ... }) cependant il y a toujours des problèmes: la boîte de toujours avoir la même taille alors que j'aimerais qu'il taille varier en fonction de la taille du texte et il dessine une case à cocher pour chaque nœuds, même ceux n'ayant aucun label (texte). Voir le code ci-dessus.
  • Votre code est assez complexe, je ne suis pas sûr de ce qu'il faut chercher là. Utilisez-vous getBB de faire varier le nœud (cercle) de taille basée sur la longueur du texte?
  • Oui, découvrez cet article de l'exemple que j'ai référencé et ici et ici. Vous pouvez stocker temporairement les svgRect retourné par getBBox sur la donnée (d) de l'élément de texte et s'appliquent que pour le rectangle de sélection dans un autre énoncé.
  • J'utilise glyph.call(getBB) de mettre la BBox sur le système de référence de chaque élément, puis-je utiliser backGround = node.select("circle").each(function(d){ d3.select(this).attr(makeCircleBB(d))}) à faire les éléments d'arrière-plan. Vous pouvez consulter le makeCircleBB pour voir la dernière partie...

InformationsquelleAutor Pierre | 2015-08-15