如何为d3文本元素添加背景颜色?

时间:2015-08-15 15:25:40

标签: d3.js

我正在尝试使用d3在文本后面添加一个rect元素来模拟d3文本元素不存在的背景颜色。我希望rect具有与文本本身完全相同的大小。

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

this.getBBox()为x和y返回0。

以下代码显示该框,但它的大小与文本大小不同,即使文本不存在(当图像存在时)也会绘制框。

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

感谢Cool Blue,以下代码现在正常工作:在文本后面显示一个rect,以便在大于节点圆时可读。在未来中,它可以用球形弧而不是矩形来改进,只能隐藏文本后面的圆形框架......

enter image description here

// 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(); })
}

0 个答案:

没有答案