我在SVG中绘制文本标签.我有一个固定的宽度(比如200px).当文字太长时,我该如何修剪呢?
理想的解决方案还会添加文本被剪切的省略号(...).但我也可以没有它.
use*_*569 22
使用d3库
溢出文本的包装函数:
function wrap() {
var self = d3.select(this),
textLength = self.node().getComputedTextLength(),
text = self.text();
while (textLength > (width - 2 * padding) && text.length > 0) {
text = text.slice(0, -1);
self.text(text + '...');
textLength = self.node().getComputedTextLength();
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
text.append('tspan').text(function(d) { return d.name; }).each(wrap);
Run Code Online (Sandbox Code Playgroud)
Oph*_*erV 17
实现Erik的第三个建议我提出了这样的事情:
//places textString in textObj, adds an ellipsis if text can't fit in width
function placeTextWithEllipsis(textObj,textString,width){
textObj.textContent=textString;
//ellipsis is needed
if (textObj.getSubStringLength(0,textString.length)>=width){
for (var x=textString.length-3;x>0;x-=3){
if (textObj.getSubStringLength(0,x)<=width){
textObj.textContent=textString.substring(0,x)+"...";
return;
}
}
textObj.textContent="..."; //can't place at all
}
}
Run Code Online (Sandbox Code Playgroud)
似乎做的伎俩:)
@user2846569 告诉我怎么做(是的,使用 d3.js)。但是,我必须做一些小改动才能工作:
function wrap( d ) {
var self = d3.select(this),
textLength = self.node().getComputedTextLength(),
text = self.text();
while ( ( textLength > self.attr('width') )&& text.length > 0) {
text = text.slice(0, -1);
self.text(text + '...');
textLength = self.node().getComputedTextLength();
}
}
svg.append('text')
.append('tspan')
.text(function(d) { return d; })
.attr('width', 200 )
.each( wrap );
Run Code Online (Sandbox Code Playgroud)