D3.js 如何获得';d3中已经创建了什么? cells.append('rect')) .attr('x',函数(d){return d.x;}) .attr('y',函数(d){返回d.y;}) .attr('height',函数(d){return d.dy;}) .attr('fill',函数(d){返回d.children?null:color(d.parent.name);}) cells.append('text') .attr('x',函数(d){返回d.x+d.dx/2}) .attr('y',函数(d){返回d.y+d.dy/2}) .attr('填充','白色') .attr('font-size',14) .文本(功能(d){ if(d.name.lengthrect”)[i].getBBox.width){ 返回d.name; } });
我不知道为什么D3.js 如何获得';d3中已经创建了什么? cells.append('rect')) .attr('x',函数(d){return d.x;}) .attr('y',函数(d){返回d.y;}) .attr('height',函数(d){return d.dy;}) .attr('fill',函数(d){返回d.children?null:color(d.parent.name);}) cells.append('text') .attr('x',函数(d){返回d.x+d.dx/2}) .attr('y',函数(d){返回d.y+d.dy/2}) .attr('填充','白色') .attr('font-size',14) .文本(功能(d){ if(d.name.lengthrect”)[i].getBBox.width){ 返回d.name; } });,d3.js,D3.js,我不知道为什么 cells.rect.width 不起作用?但我想知道的是,在将文本附加到形状之前,如何检查形状的宽度 我还尝试将形状的宽度推送到数组中,然后使用索引循环在数组中循环,以检查名称的长度是否大于框的宽度。问题是创建形状时,首先创建面积最大的形状(框)。另一方面,追加文本时,它从右下角到左上角开始 我知道文本的长度和像素是两个不同的单位,但我要用一个简单的比率来转换它。如何获取屏幕上已绘制的矩形的宽度?您可以使用元素(this)及其bbox获取实际宽度。但这不会像您希望的那样工作,因
cells.rect.width
不起作用?但我想知道的是,在将文本附加到形状之前,如何检查形状的宽度
我还尝试将形状的宽度推送到数组中,然后使用索引循环在数组中循环,以检查名称的长度是否大于框的宽度。问题是创建形状时,首先创建面积最大的形状(框)。另一方面,追加文本时,它从右下角到左上角开始
我知道文本的长度和像素是两个不同的单位,但我要用一个简单的比率来转换它。如何获取屏幕上已绘制的矩形的宽度?您可以使用元素(this
)及其bbox
获取实际宽度。但这不会像您希望的那样工作,因为您正在比较字符数和像素宽度。要使其工作,您需要先绘制文本,然后检查其宽度与rect
相比,如果太大,则将其删除
这方面的代码(在绘制了rect
s和文本之后)如下所示
cells.append('rect')
.attr('x', function (d) { return d.x; })
.attr('y', function (d) { return d.y; })
.attr('height', function (d) { return d.dy; })
.attr('fill', function (d) { return d.children ? null : color(d.parent.name); })
cells.append('text')
.attr('x', function (d) { return d.x + d.dx / 2 })
.attr('y', function (d) { return d.y + d.dy / 2 })
.attr('fill', 'white')
.attr('font-size', 14)
.text(function (d) {
if (d.name.length < cells.rect.width) {
return d.name;
}
});
单元格。选择全部(“文本”)
.文本(功能(d,i){
if(this.getBBox().width<
document.querySelectorAll(“svg>rect”)[i].getBBox.width){
返回d.name;
}
});
rect对象中有一个子属性
cells.selectAll("text")
.text(function(d, i) {
if(this.getBBox().width <
document.querySelectorAll("svg > rect")[i].getBBox.width) {
return d.name;
}
});
可能会起作用。啊,这个解决方案不起作用。但我应该更清楚地说明这个问题。我知道文本的长度和像素是两个不同的单位,但是我要用一个简单的比率来转换它。如果我已经在屏幕上有了.rect,我如何获取宽度?提前感谢您在
if
语句中使用类似于第二个术语的内容。确切的选择器(“svg>rect”)取决于svg的结构。
cells.rect.attributes.width.value