这个问题有点令人困惑。问题是没有对齐路径末尾的文本——这很容易用"text-anchor"="end" 和"startOffset"="100%" 完成。
但是,将这些设置与 d3 arc 函数创建的路径一起使用,您最终会看到文本围绕内部曲线的末端和左侧直边拐弯,到达 arc 函数定义的路径末端:
http://jsfiddle.net/CZ6Dp/8/
真正的问题是,您希望文本对齐的路径(形状的外圆弧)只是定义形状的路径的一部分。
(顺便说一下,“left”和“right”不是“text-anchor”属性的有效值,将被忽略)。
@defghi1977 的回答提供了一种解决问题的方法,即确定您想要使用的路径段的长度并相应地调整起始偏移量。
解决该问题的另一种方法是创建一个单独的路径(未在屏幕上绘制),该路径仅代表您希望用于定位文本的路径部分。
有多种方法可以创建仅代表外部弧线的路径 (some example code here)。 @defghi1977 使用正则表达式从现有路径中获取它的方法可能对您的情况最有效。但实际上,我不仅要创建一个临时元素来计算长度,还必须将新路径添加到 DOM,以便它可以用作<textPath> 元素的参考路径。 (我认为这是这种方法的缺点——DOM 元素数量的两倍!)
var path = g.append("svg:path")
.attr("d", arct)
.style("fill","#ccc")
.attr("transform", "translate("+cfg.w/2+","+cfg.h/2+")")
.each(function(d,i) {
var justArc = /(^.+?)L/;
//grab everything up to the first Line statement
var thisSelected = d3.select(this);
var arcD = justArc.exec( thisSelected.attr("d") )[1];
defs.append("path")
.attr("id", "yyy") //normally the id would be based on the data or index
.attr("d", arcD)
.attr("transform", thisSelected.attr("transform") );
//if you can avoid using transforms directly on the path element,
//you'll save yourself having to repeat them for the text paths...
});
var text = g.append("text")
.style("font-size",30)
.style("fill","#000")
.attr("dy",0)
.append("textPath")
.attr("xlink:href","#yyy")
.style("text-anchor","end")
.attr("startOffset","100%")
.text("some text");
http://jsfiddle.net/CZ6Dp/9/
同样,考虑到额外的 DOM 加载,@defghi1977 的方法可能稍微好一点,尽管这个版本的好处是不依赖于浏览器对 getTotalLength 的支持。但据我所知,该方法实现得相当好。
因此,为了完整起见,请考虑这是一种替代方法。