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

标签 javascript d3.js svg

在 SVG 图形中,我创建了由矩形和一些文本组成的节点元素。文本的数量可能会有很大差异,因此我想根据文本的宽度设置矩形的宽度。

下面是使用 D3.js 创建的矩形(使用固定的宽度和高度值):

var rects = nodeEnter.append("rect")
    .attr("width", rectW)
    .attr("height", rectH);

后跟文本元素:

var nodeText = nodeEnter.append("text")
    .attr("class", "node-text")
    .attr("y", rectH / 2)
    .attr("dy", ".35em")
    .text(function (d) {
        return d.data.name;
    });
nodeText // The bounding box is valid not before the node addition happened actually.
    .attr("x", function (d) {
        return (rectW - this.getBBox().width) / 2;
    });

如您所见,目前我将文本置于可用空间的中心。然后我尝试根据它们的文本设置矩形的宽度,但我从来没有同时获得矩形元素和文本 HTML 元素(对于 getBBox())。这是我的尝试之一:

rects.attr("width",
        d => this.getBBox().width + 20
    );

但显然 this 是错误的,因为它指的是 rects 而不是文本。

这里正确的做法是什么?

最佳答案

我会使用 getComputedTextLength测量文本。我不知道 D3.js 中是否有等效项我的回答是使用纯 javascript 并假设矩形和文本中心是 {x:50,y:25 } 并且您使用的是 text{dominant-baseline:middle;text-anchor:middle;}

let text_length = txt.getComputedTextLength();

rct.setAttributeNS(null,"width",text_length )
rct.setAttributeNS(null,"x",(50 - text_length/2) )
svg{border:1px solid}
text{dominant-baseline:middle;text-anchor:middle;}
<svg viewBox="0 0 100 50">
  <rect x="25" y="12.5" width="50" height="25" stroke="black" fill="none" id="rct" />
  <text x="50" y="25" id="txt">Test text</text>
</svg>

或者代替 txt.getComputedTextLength()你可以使用 txt.textLength.baseVal.value

关于javascript - 如何根据文本宽度动态调整 SVG 矩形的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53814886/

相关文章:

javascript - d3js v5 + Topojson v3 单击图例显示/隐藏元素

javascript - 按作者列表分组并格式化作者列表

javascript - 从外部调用 bootstrap typeahead updater 函数

javascript - C3.js 中的时间序列图未访问时间戳

javascript - 如何访问 SVG 文档中的 <path>

javascript - 使用 Vivus.js 以所需方向动画线

internet-explorer - 使用 svg 图像在 Internet Explorer 上保持纵横比

javascript - 下拉文本输入选项

javascript - 在 AJAX 回调中更改按钮的文本和颜色

javascript - 连接到节点 d3.js 之前经过另一个点的线