如何使用 d3 js 在 SVG 中正确使用 Use 标签?

Posted

技术标签:

【中文标题】如何使用 d3 js 在 SVG 中正确使用 Use 标签?【英文标题】:How to properly use the Use tag in SVG with d3 js? 【发布时间】:2019-07-25 02:36:55 【问题描述】:

我知道 d3 根据调用的顺序渲染元素。因此,如果我想在黑色矩形上渲染白色文本,我可以先调用 rect,然后再调用白色文本。

但是,在我的特殊情况下,我的矩形尺寸基于我的白色文本,所以我必须先调用白色文本。

我发现一个解决方法是使用 use 标签,但我无法让它工作,这是我目前的尝试:

正文:

      var textToolTip = gToolTip
        .append("text")

        .attr("id", "toUse")
        .text(.....)...

使用标签:

var useText = gToolTip.append("use").attr("xlink:xlink:href", "#toUse");

我也尝试过给 textToolTip xlink:href 但它没有用。对于使用标签,我尝试使用 xlink:href 而不是 xlink:xlink:href,但它不起作用。因为我找到了这个答案,所以我正在使用双 xlink:How do I define an SVG doc under <defs>, and reuse with the <use> tag?

【问题讨论】:

为什么不这样做呢? ***.com/questions/15500894/… 【参考方案1】:

如果我的理解正确,附加矩形会更简单,附加文本,然后根据文本调整矩形大小:

<!DOCTYPE html>
<html>

  <head>
    <script src="https://d3js.org/d3.v5.min.js"></script>
  </head>

  <body>
    <svg  ></svg>
    <script>
      
      var svg = d3.select('svg');
      
      var rect = svg.append("rect")
        .style("fill", "black")
        .attr("x", 20)
        .attr("y", 20);
      
      var text = svg.append("text")
        .text("Now is the time for all good men to come to the aid of their country")
        .attr("x", 20)
        .attr("y", 20)
        .attr("alignment-baseline","hanging")
        .style("fill","steelblue")
        .style("font-family", "arial")
        .style("font-size", "14pt")
        
      var bbox = text.node().getBBox();
      
      rect.attr("width", bbox.width);
      rect.attr("height", bbox.height);
    </script>
  </body>

</html>

【讨论】:

以上是关于如何使用 d3 js 在 SVG 中正确使用 Use 标签?的主要内容,如果未能解决你的问题,请参考以下文章

使用 D3.js(IE、safari 和 chrome)创建 SVG 后,如何保存/导出 SVG 文件?

如何在 d3.js 中拖动路径

如何设置 D3.js svg 的背景颜色?

将空值传递给 SVG 路径(使用 d3.js)以抑制丢失数据

如何使用 jsdom、D3 和 IJavascript 在 Jupyter 笔记本中输出 SVG

如何用SVG制作面积图(没有JS)