svg的x和dx属性有什么区别?

时间:2013-10-01 22:25:50

标签: svg d3.js

svg的x和dx属性(或y和dy)有什么区别?何时适合使用轴移位属性(dx)与位置属性(x)?

例如,我注意到很多d3示例正在做这样的事情

chart.append("text")
   .attr("x", 0)
   .attr("y", 0)
   .attr("dy", -3)
   .text("I am a label")

当以下内容似乎做同样的事情时,设置y和dy的优点或原因是什么?

chart.append("text")
   .attr("x", 0)
   .attr("y", -3)
   .text("I am a label")

2 个答案:

答案 0 :(得分:85)

xy是绝对坐标,dxdy是相对坐标(相对于指定的xy)。

根据我的经验,在dx元素上使用dy<text>并不常见(例如,如果您有一些代码可能对编码方便有用定位文本然后分开代码进行调整。)

dxdy在使用嵌套在<tspan>元素中的<text>元素来建立更多的多行文字布局时非常有用。

有关详细信息,请查看Text section of the SVG spec

答案 1 :(得分:66)

要添加到Scott的答案中,与em(字体大小单位)一起使用的dy对于相对于绝对y坐标垂直对齐文本非常有用。这包含在MDN dy text element example

使用dy = 0.35em可以帮助垂直居中文本而不管字体大小。如果要围绕绝对坐标描述的点旋转文本中心,也会有所帮助。

<style>
text { fill: black; text-anchor: middle; }
line { stroke-width: 1; stroke: lightgray; }
</style>


<script>
dataset = d3.range(50,500,50);

svg = d3.select("body").append("svg");
svg.attr('width',500).attr('height', 500);

svg.append("line").attr('x1', 0).attr('x2', 500).attr('y1', 100).attr('y2', 100);
svg.append("line").attr('x1', 0).attr('x2', 500).attr('y1', 200).attr('y2', 200);

group = svg.selectAll("g")
    .data(dataset)
    .enter()
    .append("g");

// Without the dy=0.35em offset
group.append("text")
    .text("My text")
    .attr("x",function (d) {return d;})
    .attr("y",100)
    .attr("transform", function(d, i) {return "rotate("+45*i+","+d+",100)";});

// With the dy=0.35em offset
group.append("text")
    .text("My text")
    .attr("x",function (d) {return d;})
    .attr("y",200)
    .attr("dy","0.35em")
    .attr("transform", function(d, i) {return "rotate("+45*i+","+d+",200)";});
<script>

View it in Codepen

如果您不包含“dy = 0.35em”,则单词会在文本底部周围旋转,并在180度对齐旋转前的位置。包括“dy = 0.35em”将它们围绕文本的中心旋转。

请注意,无法使用CSS设置dy。