D3.js - 如何在此可折叠树中的文本中添加新行?
D3.js - How can I add a new line to the text in this Collapsible Tree?
我有一个由 D3 构建的可折叠树。
这是 JSFIDDLE:http://jsfiddle.net/mEyQW/57/
如您所见,当节点完全展开时,文本全部重叠。
我想添加新行来替换 space(可能有 1 或 2)。例如:SDS 123 将变为
安全数据表
123
我已经尝试了几个在堆栈溢出中找到的类似答案,但仍然无法解决我的问题。
你能帮忙吗?由 JSFIDDLE 提供将不胜感激!!
nodeEnter.append("text")
.attr("x", function(d) { return d.children1 || d._children1 ? -10 : 10; })
.attr("dy", ".35em")
.attr("text-anchor", function(d) { return d.children1 || d._children1 ? "end" : "start"; })
.text(function(d) { return d.NickName ; })
.style("fill-opacity", 1e-6);
谢谢!!
我遇到了类似的问题,所以我不得不做一些手工工作。首先,您需要一个实际 'wrap' 文本的函数:
function wordwrap(text, max) {
var regex = new RegExp(".{0,"+max+"}(?:\s|$)","g");
var lines = [];
var line;
while ((line = regex.exec(text))!="") {lines.push(line);}
return lines
}
然后,您需要将此函数应用于每个文本元素。在你的代码中我会这样写:
nodeEnter.append("text")
.attr("x", function(d) { return d.children1 || d._children1 ? -10 : 10; })
.attr("dy", ".35em")
.attr("text-anchor", function(d) { return d.children1 || d._children1 ? "end" : "start"; })
.style("fill-opacity", 1e-6)
.each(function (d) {
if (d.NickName!=undefined) {
var lines = wordwrap(d.NickName, 15)
for (var i = 0; i < lines.length; i++) {
d3.select(this).append("tspan")
.attr("dy",13)
.attr("x",function(d) {
return d.children1 || d._children1 ? -10 : 10; })
.text(lines[i])
}
}
});
最终结果是这样的:
当然你应该花一些时间来调整每个文本元素的 x
位置。
编辑
一种更简单的方法是将 wordwrap 方法设置为:
function wordwrap2(text) {
var lines=text.split(" ")
return lines
}
并像下面这样应用它:
nodeEnter.append("text")
.attr("x", function(d) { return d.children1 || d._children1 ? -10 : 10; })
.attr("dy", ".35em")
.attr("text-anchor", function(d) { return d.children1 || d._children1 ? "end" : "start"; })
.style("fill-opacity", 1e-6)
.each(function (d) {
if (d.NickName!=undefined) {
var lines = wordwrap2(d.NickName)
for (var i = 0; i < lines.length; i++) {
d3.select(this).append("tspan")
.attr("dy",13)
.attr("x",function(d) {
return d.children1 || d._children1 ? -10 : 10; })
.text(lines[i])
}
}
});
这是最后一种方法的 fiddle:http://jsfiddle.net/mEyQW/59/
希望对您有所帮助。
我很难用逗号分隔一行并将文本片段置于列表格式中。以下改编有效。
function splitoncomma(text) {
var lines=text.split(",") //splits text on comma
return lines
}
label.append("div")
.attr("class", "class_name")
.each(function (d) {
if (textValue(d)!==undefined) {
var lines = splitoncomma(textValue(d))
for (var i = 0; i < lines.length; i++) {
d3.select(this)
.append("text")
.append("tspan")
.style("float","left")// the float:left avoids default inline positioning
.text(lines[i])
}
}
需要左浮动样式以避免默认内联放置。
我有一个由 D3 构建的可折叠树。 这是 JSFIDDLE:http://jsfiddle.net/mEyQW/57/
如您所见,当节点完全展开时,文本全部重叠。 我想添加新行来替换 space(可能有 1 或 2)。例如:SDS 123 将变为
安全数据表
123
我已经尝试了几个在堆栈溢出中找到的类似答案,但仍然无法解决我的问题。 你能帮忙吗?由 JSFIDDLE 提供将不胜感激!!
nodeEnter.append("text")
.attr("x", function(d) { return d.children1 || d._children1 ? -10 : 10; })
.attr("dy", ".35em")
.attr("text-anchor", function(d) { return d.children1 || d._children1 ? "end" : "start"; })
.text(function(d) { return d.NickName ; })
.style("fill-opacity", 1e-6);
谢谢!!
我遇到了类似的问题,所以我不得不做一些手工工作。首先,您需要一个实际 'wrap' 文本的函数:
function wordwrap(text, max) {
var regex = new RegExp(".{0,"+max+"}(?:\s|$)","g");
var lines = [];
var line;
while ((line = regex.exec(text))!="") {lines.push(line);}
return lines
}
然后,您需要将此函数应用于每个文本元素。在你的代码中我会这样写:
nodeEnter.append("text")
.attr("x", function(d) { return d.children1 || d._children1 ? -10 : 10; })
.attr("dy", ".35em")
.attr("text-anchor", function(d) { return d.children1 || d._children1 ? "end" : "start"; })
.style("fill-opacity", 1e-6)
.each(function (d) {
if (d.NickName!=undefined) {
var lines = wordwrap(d.NickName, 15)
for (var i = 0; i < lines.length; i++) {
d3.select(this).append("tspan")
.attr("dy",13)
.attr("x",function(d) {
return d.children1 || d._children1 ? -10 : 10; })
.text(lines[i])
}
}
});
最终结果是这样的:
当然你应该花一些时间来调整每个文本元素的 x
位置。
编辑 一种更简单的方法是将 wordwrap 方法设置为:
function wordwrap2(text) {
var lines=text.split(" ")
return lines
}
并像下面这样应用它:
nodeEnter.append("text")
.attr("x", function(d) { return d.children1 || d._children1 ? -10 : 10; })
.attr("dy", ".35em")
.attr("text-anchor", function(d) { return d.children1 || d._children1 ? "end" : "start"; })
.style("fill-opacity", 1e-6)
.each(function (d) {
if (d.NickName!=undefined) {
var lines = wordwrap2(d.NickName)
for (var i = 0; i < lines.length; i++) {
d3.select(this).append("tspan")
.attr("dy",13)
.attr("x",function(d) {
return d.children1 || d._children1 ? -10 : 10; })
.text(lines[i])
}
}
});
这是最后一种方法的 fiddle:http://jsfiddle.net/mEyQW/59/
希望对您有所帮助。
我很难用逗号分隔一行并将文本片段置于列表格式中。以下改编有效。
function splitoncomma(text) {
var lines=text.split(",") //splits text on comma
return lines
}
label.append("div")
.attr("class", "class_name")
.each(function (d) {
if (textValue(d)!==undefined) {
var lines = splitoncomma(textValue(d))
for (var i = 0; i < lines.length; i++) {
d3.select(this)
.append("text")
.append("tspan")
.style("float","left")// the float:left avoids default inline positioning
.text(lines[i])
}
}
需要左浮动样式以避免默认内联放置。