用D3.js计算带有字母间距的textlength

时间:2016-05-18 12:51:13

标签: javascript d3.js svg graphics

当我计算textpath元素的文本长度时,当我以不同方式设置'letter-spacing'样式时,该值不会改变。

是否有办法处理因额外间距而产生的额外长度?

目前我计算textlength以隐藏双层分割图上的一些标签:

textsElements
.attr("dy", function(d) {
  var offset = (radius / strokeWidth)/2;
  var rotation = getRotationDeg(d)
  return rotation > 0 && rotation < 180 ?  -offset : offset;
})
.append("textPath")
.attr("startOffset", "50%")
.attr("class","labels-text")
.style("text-anchor", "middle")                 
.attr("xlink:href", function (d) { return '#' + createTextPathId(d); })
.text(function (d) { return d.name; });
// Hide labels that are to long 
textsElements.each(function(d){
  var el = d3.select(this);
  d.labelToLong= false;
  if(( d.hiddenArcLength - this.getComputedTextLength()) < 5) {
    el.style("opacity",0);
    d.labelToLong = true;
  }
}); 



 textpath.labels-text {letter-spacing: 1px;}

1 个答案:

答案 0 :(得分:0)

的确,getComputedTextLength()忽略了字母空间。

您可以尝试getBBox()

textsElements.each(function(d){
  var el = d3.select(this);
  d.labelToLong= false;
if(( d.hiddenArcLength - this.getBBox().width) < 5) {
  el.style("opacity",0);
  d.labelToLong = true;
 }
}); 

不幸的是,这对您没有帮助,因为您处理的是倾斜路径,而不是水平文本。因此,根据您的字距调整,您可以尝试使用给定值调整getComputedTextLength

textsElements.each(function(d){
  var el = d3.select(this);
  var tweak = 1.2;//you can make this value >1 or <1, according to the kerning
  d.labelToLong= false;
if(( d.hiddenArcLength - this.getComputedTextLength()*tweak) < 5) {
  el.style("opacity",0);
  d.labelToLong = true;
 }
});