D3将文本附加到SVG矩形


73

我正在将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" width="130" height="160" 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不会正确工作?另外,我应该如何追加矩形?

Answers:


130

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函数


我希望我的文本框出现在鼠标悬停在上面,所以我正在创建一个函数来做到这一点。但这最终是一个g.node,并且不允许我附加到它。因此,当我创建数据然后仅显示和隐藏它时我应该这样做吗?
gbam 2013年

可以的。或将鼠标侦听器附加到g元素,您将可以轻松地从那里追加。
亚当·皮尔斯

啊,自从我将鼠标侦听器放在节点上以来,我一直在猜测为什么它给我g.node来调用它?
gbam 2013年

g.node是您想要的,在其后附加文本。
亚当·皮尔斯

8

您是否尝试过SVG文本元素?

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

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

将文本元素附加为同级,然后进行定位。

更新

使用g分组,这样的事情怎么样?小提琴

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


尽管这可以将元素添加为同级元素(同级元素是我做错的事情),但必须有一个更优雅的解决方案,谢谢最终将其砍掉?
gbam 2013年

经过数小时的努力,尝试将rect的触摸事件映射到特定的文本对象(在v3中很容易,在v4中不那么多),您的小提琴手向我介绍了nextSibling,最终解决了问题。谢谢!
马丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.