Edge不会在svg中正确处理缩放和text-anchor:middle

时间:2016-02-23 17:09:38

标签: d3.js svg microsoft-edge

我正在使用D3编写图形显示程序,我发现Microsoft Edge无法正确处理边缘缩放的问题。我的代码如下:

HTML:

<svg id="container" width="200" height="200">
  <g id="inner-container">

  </g>
</svg>

JS:

var container = d3.select("#container");
var innerContainer = container.select("g");
container.call(d3.behavior.zoom().scaleExtent([.5,4]).on("zoom", function(){
  innerContainer.attr("transform", "translate(" + d3.event.translate + ") scale(" + d3.event.scale + ")");
}));

var nodes = innerContainer.append("g").selectAll(".graph-node");
var labels = innerContainer.append("g").selectAll(".graph-label");

var data = ["A", "B", "C", "D", "E"];

nodes.data(data).enter().call(function (selection){
  selection = selection.append("g");
  selection.attr("class", ".graph-node");
  selection.attr("transform", function(d, i){
    return ["translate(", (i * 20).toString(), " ", (i * 20).toString(), ")"].join("");
  });
  selection.append("rect")
    .attr("width", 20)
    .attr("height", 20)
    .attr("rx", 2).attr("ry", 2)
    .attr("fill", "red");
  selection.append("text")
    .text(function(d){ return d; })
    .attr("text-anchor", "middle")
    .attr("x", 10).attr("y", 15)
    .style("fill", "white");
});
labels.data(data).enter().call(function (selection){
  selection = selection.append("g");
  selection.attr("class", "graph-label");
  selection.append("text")
    .text(function (d) { return "Node" + d; });
  selection.attr("transform", function (d, i) {
    return ["translate(", (i * 20 + 25).toString(), " ", (i * 20 + 15).toString(), ")"].join("");
  });
});

View in JSFiddle

在谷歌浏览器,IE和Firefox中,缩放的工作方式完全符合预期。但是,当我在Microsoft Edge中运行此代码时,节点顶部的文本标签将在我放大时向右移动,当它们离开矩形时完全消失。如果我没有设置text-anchor,问题就会消失,但这意味着我必须手动考虑文本定位,特别是考虑到网站在国际上的使用时间。 (文本字符本身并不重要,因为它们来自最终产品中的自定义字体。)

我该如何解决这个问题,提供一个居中的文字标签,然后让它仍能在Edge上正确显示?

1 个答案:

答案 0 :(得分:0)

在文本布局中遇到类似浏览器不兼容的情况多次。如果您未能找到适用于所有人的CSS属性的神奇组合,则可以使用以下另一个选项:

在您的网页中添加<pre>元素。根据定义,此元素不可见。选择具有D3&#39; s select的元素。将要布局的文本添加为​​innerHTML。使用classedstyle来设置元素样式的方式与设置文本样式的方式完全相同。现在,您可以使用浏览器函数getComputedTextLength或通过读取元素的维度来获取文本的确切长度。

在方便的重用函数或TextLengthCalculator类中隐藏所有这些。

获得尺寸后,您可以自己计算所需的偏移量,只需通过调整x和y属性来移动文本。

这很快并且考虑了本地化和样式。它甚至是干净和可靠的,因为它仍然是浏览器本身进行计算。虽然浏览器有时会在这里产生不同的结果,但至少每个浏览器都与自己的计算一致。