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...
//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
avecd3.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 utiliserbackGround = 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...
Vous devez vous connecter pour publier un commentaire.
Comme mentionné dans les commentaires, l'utilisation de ce modèle et ajouter tous les détails dont vous avez besoin...
this === selection // true
dans le code posté... j'ai juste utilisé la sélection, car plus claires. De toute façon, bien que son travail. Pouvez-vous nous faire à tous une faveur et de les partager (post) votre code de travail s'il vous plaît? 🙂