D3.js中SVG文本旋转异常:单个字符旋转而非整体问题求助
解决D3.js中文本旋转时单个字符分离的问题
嘿,我来帮你搞定这个文本旋转的坑!你遇到的单个字符旋转的问题,其实是因为SVG里<text>元素的rotate属性本身就是用来给每个字符单独设置旋转角度的,这和你想要的“整个文本块一起旋转”完全不是一回事~
正确的整体旋转方法:用SVG的transform属性
要让整个文本整体旋转,你需要使用SVG的transform属性里的rotate()函数,而且必须指定旋转的中心点(不然默认会围绕SVG原点(0,0)旋转,位置会完全跑偏)。修改你的代码如下:
var texts = svg.selectAll("text") .data(data) .enter() .append("text") .attr("x", function(d, i) { return (i * 30) + 50; }) .attr("y", function(d) { return 250 - (d.some_var * 50); }) // 替换原来的rotate属性,用transform实现整体旋转 .attr("transform", function(d, i) { // 获取文本的x、y坐标作为旋转中心 var textX = (i * 30) + 50; var textY = 250 - (d.some_var * 50); // rotate(角度 旋转中心X 旋转中心Y) return `rotate(315 ${textX} ${textY})`; }) // 可选:调整文本对齐,让旋转后位置更精准 .attr("text-anchor", "middle") .attr("dominant-baseline", "middle") .text(function(d){ return d.name; });
为什么原来的写法不对?
简单说:
- SVG
<text>的rotate属性:是一个可选的数值列表,每个数值对应一个字符的旋转角度,所以会出现每个字符各自转的情况。 - SVG
transform的rotate():是对整个<text>元素做几何变换,所有字符会作为一个整体跟着旋转。
如果旋转后文本的位置还是有点别扭,调整text-anchor和dominant-baseline这两个属性可以帮你把文本精准定位到目标位置哦~
内容的提问来源于stack exchange,提问作者seth127
相关产品推荐
相关产品推荐

