我正在尝试使用d3 v4为SVG元素添加背景色。为了做到这一点,我想我必须得到一个参考
text.node().getBBox()
所以我尝试了下面的...
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
...
focus.append("circle")
.attr("r", 4.5);
var text = focus.append("text")
.attr("x", 9)
.attr("dy", ".35em");
alert(text);
var svgrect = text.node().getBBox();
alert(svgrect);
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
rect.setAttribute("x", svgrect.x);
rect.setAttribute("y", svgrect.y);
rect.setAttribute("width", svgrect.width);
rect.setAttribute("height", svgrect.height);
rect.setAttribute("fill", "yellow");
svg.node().insertBefore(rect, text);
但是虽然我看到了第一个警报,我没有看到第二个警报。在Firefox上,我得到错误
NS_ERROR_FAILURE:
没有任何进一步的信息如何在Firefox上获取边界框?
1条答案
按热度按时间vhipe2zx1#
我无法让getBBox()(或互联网上任何其他建议的方法)处理文本元素,所以我进入Chrome并构建了一个字符宽度查找表,然后console.将其登录到控制台,以便我可以将其复制到我的代码中,并使用它来查找文本中的字符。它很难看,而且没有考虑css的变化,但如果字体大小不变,它就能工作。
我在这里提供给那些没有其他途径获得信息的可怜人。
我是如何构建查找表的:
现在-在 chrome -击中键盘上的每个字符一次,退格键后,每个所以你只测量一个字符,然后回去做Shift字符。这将在您的字典中注册每个键及其长度
完成后,在开发人员控制台中:
你会得到这样的东西:
现在将其赋值给一个变量,每当你需要获取该文本节点的长度时,你只需获取值并循环字符以获取长度,就像这样:
这个解决方案让我有点抓狂,但它在字体大小不变的情况下是有效的,而且它们在两个浏览器中的大小大致相同。