2015-07-28 126 views
0

我正在使用d3.js可視化來描繪節點。截至目前,我正在收到文本。我有一個代碼來調整rect的寬度,取決於進入它的文本的長度。但是,有時它不起作用,文本將從rect框中刪除。這是代碼。如何在我的svg的矩形框中將文本放入d3.js中?

nodeEnter.append("rect").attr("x", 
 
     function(d) { 
 
      var x = d.name.length; 
 
      x = x + 150; 
 
      return -(x)/2; 
 
     }).attr("y", -10).attr(
 
     "width", 
 
     function(d) { 
 
      var x = d.name.length; 
 
      x = x + 150; 
 
      return x; 
 
     }).attr("height", 20).style({ 
 
     "fill": function(d) { 
 
      return d._children ? "lightsteelblue" : "#fff"; 
 
     }, 
 
     "stroke": "steelblue", 
 
     "stroke-width": "1.5px" 
 
    }); 
 

 
    nodeEnter.append("text").attr("x", 0).attr("y", 0) 
 
     .attr("dy", ".35em").attr(
 
      "text", 
 
      function(d) { 
 
       return d.children || d._children ? "end" : "start"; 
 
      }).text(function(d) { 
 
      return d.name; 
 
     }).style({ 
 
      "fill-opacity": 1e-6, 
 
      "font-size": "10px", 
 
      "font-family": "sans-serif" 
 
     }).attr(
 
      "text-anchor", "start");

這裏我把文本的長度去入禁區,並添加150.但是,工作不超過一個點。我可以在這裏得到任何幫助嗎?

根據使用getBBox()的建議。我嘗試使用它,這裏是編輯的代碼

var text = nodeEnter.append("svg:text").attr("x", 0).attr("y", 0) 
 
    .attr("dy", ".35em").attr(
 
     "text", 
 
     function(d) { 
 
      return d.children || d._children ? "end" : "start"; 
 
     }).text(function(d) { 
 
     return d.name; 
 
    }).style({ 
 
     "fill-opacity": 1e-6, 
 
     "font-size": "10px", 
 
     "font-family": "sans-serif" 
 
    }).attr(
 
     "text-anchor", "middle"); 
 
    
 
    var bbox = text.node().getBBox(); 
 
    nodeEnter.append("rect").attr("x", 
 
     function(d) { 
 
      var x = d.name.length; 
 
      x = x + 150; 
 
      return -(x)/2; 
 
     }).attr("y", -10).attr(
 
     "width", bbox.width).attr("height", bbox.height) 
 
     .style({ 
 
     "fill": function(d) { 
 
      return d._children ? "lightsteelblue" : "#fff"; 
 
     }, 
 
     "stroke": "steelblue", 
 
     "stroke-width": "1.5px" 
 
    });

本公司製造的矩形框內的文字消失,只有溢出的文本可見

+0

請參閱https://stackoverflow.com/questions/20115090/d3-js-auto-font-sizing-based-on-nodes-individual-radius-diameter - 此工作方式與其他方式類似,您可以在其中調整矩形,而不是文字。 –

回答

1

首先創建一個常數rects寬度。
然後創建文本元素並將邊界框getBBox().width的寬度作爲屬性添加到數據集(例如twidth)。
最後根據添加的屬性(twidth)更新矩形元素的寬度。

+0

首先創建文本元素並根據getBBox.width()添加矩形使文本在框中消失。 –

+0

@ user3531436你需要填充的rects嗎? –

+0

是的。我需要在rect –