D3 将文本附加到 SVG 矩形

Posted

技术标签:

【中文标题】D3 将文本附加到 SVG 矩形【英文标题】:D3 Appending Text to a SVG Rectangle 【发布时间】:2014-01-05 19:42:04 【问题描述】:

我希望将 html 附加到 D3 中的矩形上,以提供多行工具提示。底部是我如何添加一个可能是问题的一部分的矩形。顶部是应该在我的世界中工作的代码。

 newRect.().html(" <textArea font-family=Verdana font-size=20 fill=blue > Test " + "</br>" + "Test2 </textArea>");

确实在 SVG 中插入了一个文本字段,但它只是不显示:HTML

<rect id="rectLabel" x="490" y="674"   fill="red">
    <textarea fill="blue" font-size="20" font-family="Verdana"> Test </br>Test2 </textarea>
</rect>

我有一个鼠标悬停功能,它运行以下内容:

    newRect = svg.append("rect")
    .attr("x", xCor)
    .attr("y", yCor)
    .attr("width", 130)
    .attr("height", 160)
    .attr("fill", "red")
    .attr("id", "rectLabel");

我认为我应该这样做,但它不起作用。它只是删除了我试图附加到的 g.node。

    newRect = $(this).enter().append("rect")
    .attr("x", xCor)
    .attr("y", yCor)
    .attr("width", 130)
    .attr("height", 160)
    .attr("fill", "red")
    .attr("id", "rectLabel");

问题: 为什么我的文字没有出现?我试过 .html、.textArea。我想要一个多行标签,所以我认为 .text 不能正常工作?另外,我应该如何附加矩形?

【问题讨论】:

【参考方案1】:

rect 不能包含 text 元素。而是使用文本和矩形的位置转换 g 元素,然后将矩形和文本都附加到它:

var bar = chart.selectAll("g")
    .data(data)
  .enter().append("g")
    .attr("transform", function(d, i)  return "translate(0," + i * barHeight + ")"; );

bar.append("rect")
    .attr("width", x)
    .attr("height", barHeight - 1);

bar.append("text")
    .attr("x", function(d)  return x(d) - 3; )
    .attr("y", barHeight / 2)
    .attr("dy", ".35em")
    .text(function(d)  return d; );

http://bl.ocks.org/mbostock/7341714

多行标签也有点棘手,你可能想看看这个wrap function。

【讨论】:

我希望我的文本框出现在鼠标悬停时,所以我正在创建一个函数来做到这一点。但这最终成为一个 g.node 并且不会让我附加到它。那么,当我创建数据然后只是显示和隐藏它时,我应该这样做还是? 可以工作。或者将鼠标监听器附加到 g 元素,您将能够轻松地从那里追加。 啊,我猜,因为我把鼠标监听器放在节点上,所以它给我 g.node 来调用这个? g.node 是你想要的,将文本附加到那个。【参考方案2】:

你试过 SVG text 元素吗?

.append("text").text(function(d, i)  return d[whichevernode];)

rect 元素不允许在其中包含 text 元素。它只允许描述性元素 (&lt;desc&gt;, &lt;metadata&gt;, &lt;title&gt;) 和动画元素 (&lt;animate&gt;, &lt;animatecolor&gt;, &lt;animatemotion&gt;, &lt;animatetransform&gt;, &lt;mpath&gt;, &lt;set&gt;)

将文本元素添加为同级元素并进行定位。

更新

使用 g 分组,这样的事情怎么样? fiddle

您当然可以将逻辑移动到可以附加到的 CSS 类中,从组中删除 (this.parentNode)

【讨论】:

虽然这可以将元素作为兄弟元素附加(兄弟部分是我做错的),但必须有一个更优雅的解决方案,感谢将其破解到最后? 经过几个小时的努力,试图将矩形的触摸事件映射到特定的文本对象(在 v3 中很容易,在 v4 中没有那么多),你的小提琴把我介绍给了nextSibling,它终于解决了问题。谢谢!

以上是关于D3 将文本附加到 SVG 矩形的主要内容,如果未能解决你的问题,请参考以下文章

如何根据文本宽度动态调整 SVG 矩形的大小?

D3.js 无法将背景图像添加到矩形

D3.js 网络图使用力导向布局和矩形节点

如何使 SVG 元素鼠标事件通过另一个元素冒泡?

svg / d3.js 矩形一个角上的圆角

如何在 D3.js 中为网络图的矩形节点添加文本?