2015-08-15 23 views
7

Tôi đang cố gắng thêm phần tử trực tiếp phía sau văn bản với d3 để mô phỏng màu nền không tồn tại đối với các phần tử văn bản d3. Tôi muốn rect có cùng kích thước với chính văn bản.Cách thêm màu nền cho thành phần văn bản d3?

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() trả về 0 cho cả x và y.

Đoạn mã sau hiển thị hộp, nhưng kích thước không giống với kích thước văn bản và hộp được vẽ ngay cả khi văn bản không phải (khi có hình ảnh).

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

Nhờ mát xanh, các mã sau đây hiện đang làm việc đúng cách: hiển thị một rect phía sau văn bản để nó có thể đọc được khi lớn hơn vòng tròn nút. Trong futur nó có thể được cải thiện với một vòng cung hình cầu chứ không phải là rect để chỉ ẩn khung vòng tròn phía sau văn bản ...

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

Điều gì xảy ra nếu bạn thay thế 'box.x' bằng' d3.select (this) .attr ("x") '? –

+0

Nhưng dù sao, hộp giới hạn sẽ có chiều rộng và chiều cao bằng không vì chưa có văn bản nào được thêm vào. Tôi sẽ làm điều đó một cách khác ... Xem [ví dụ này] (http://bl.ocks.org/cool-Blue/9f49525e782491c8b68a) –

+0

Tôi quản lý để nó hoạt động một phần bằng cách di chuyển mã trong một .each (hàm (d) {...}) tuy nhiên vẫn có vấn đề: hộp luôn có cùng kích thước trong khi tôi muốn nó có kích thước khác nhau với kích thước văn bản và nó vẽ một hộp cho mỗi nút, ngay cả những nút không có nhãn (văn bản) . Xem mã ở trên. – Pierre

Trả lời

3

Như đã đề cập trong các ý kiến, sử dụng mô hình này và thêm bất kỳ chi tiết nào bạn cần ...

var textNode = node.filter(function(d) {return (!d.image)}) 

textNode.append("text") 
    .attr("class", "text") 
    .attr("text-anchor", "middle") 
    .attr("dx", 0) 
    .attr("dy", ".35em") 
    .text(function(d) { 
     return d.name; 
    }).call(getBB); 
textNode.insert("rect","text") 
    .attr("width", function(d){return d.bbox.width}) 
    .attr("height", function(d){return d.bbox.height}) 
    .style("fill", "yellow"); 

function getBB(selection) { 
    selection.each(function(d){d.bbox = this.getBBox();}) 
} 
+0

Điều này không làm việc cho tôi, không có thông báo lỗi nhưng vẫn không có hình chữ nhật. Theo các khuyến nghị trước đây của bạn, tôi đã quản lý để có được kích thước hộp thích hợp với .call (getBB), bây giờ tôi cần phải chèn rect. – Pierre

+1

Bạn cần thêm thuộc tính x và y. Tôi nghĩ họ có thể bằng không. Nút có phải là phần tử g có dữ liệu bị ràng buộc không? Ah vâng, tôi thấy vấn đề ... Văn bản chưa có, vâng, cuộc gọi riêng biệt là cách để đi. Tôi đã cố gắng để được quá terse. –

+0

Với .cext (getTextBox) ngay sau .text() và sau đó chèn nút như sau, tôi nhận được thông báo lỗi đánh giá d.bbox.width \t node.insert ("rect", "text") \t \t. attr ("width", function (d) {return d.bbox.width}) \t \t .attr ("height", hàm (d) {return d.bbox.height}) \t \t.phong cách ("điền", "màu vàng"); – Pierre

Các vấn đề liên quan