stv*_*534 2 javascript svg d3.js
我已经找到了一些例子,但很难找到任何工作,如果有人有更清楚或一些见解将非常感激.
var wrap = function() {
var self = d3.select(this),
textLength = self.node().getComputedTextLength(),
text = self.text();
while (textLength > (50) && text.length > 0) {
text = text.slice(0, -1);
self.text(text + '...');
textLength = self.node().getComputedTextLength();
}
};
const y = d3.scaleBand()
.range([height, 0], .1)
.domain(data.map(function (d) {
return d.name; <----- wrap need to somehow attach to this
})
);
Run Code Online (Sandbox Code Playgroud)
无论你想做什么,你的方法的问题在于,getComputedTextLength()它不适用于虚构元素,也不适用于未附加到元素的数据......它仅适用于存在于SVG上的真实SVG元素.
但是,由于您希望将该字符串数组传递到带范围的域(我们通常在渲染元素之前设置),因此在我看来您希望事先修剪长字符串.
如果这是正确的,可能的方法是渲染一个临时元素,只是为了得到它的计算文本长度,修剪它,创建一个新的字符串并丢弃临时元素.
所以,假设我们有这个数据数组:
var data = ["A very long long long text here",
"another very very long piece of text in this string",
"finally, here we have another very big string"
];
Run Code Online (Sandbox Code Playgroud)
我们可以使用修改版本的wrap函数来修剪字符串.这是一个演示,检查控制台:
var data = ["A very long long long text here",
"another very very long piece of text in this string",
"finally, here we have another very big string"
];
var svg = d3.select("svg");
data.forEach(wrap);
function wrap(d, i, arr) {
var self = svg.append("text")
.text(d);
var textLength = self.node().getComputedTextLength();
while (textLength > 50 && d.length > 0) {
arr[i] = arr[i].slice(0, -1);
self.text(arr[i] + '...');
textLength = self.node().getComputedTextLength();
}
arr[i] += "...";
self.remove();
}
console.log(data)Run Code Online (Sandbox Code Playgroud)
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg></svg>Run Code Online (Sandbox Code Playgroud)
由于这使用了真实的元素,因此字体大小等问 例如,使用其他字体和字体大小将上面的结果与下面的结果进行比较:
var data = ["A very long long long text here",
"another very very long piece of text in this string",
"finally, here we have another very big string"
];
var svg = d3.select("svg");
data.forEach(wrap);
function wrap(d, i, arr) {
var self = svg.append("text")
.text(d);
var textLength = self.node().getComputedTextLength();
while (textLength > 50 && d.length > 0) {
arr[i] = arr[i].slice(0, -1);
self.text(arr[i] + '...');
textLength = self.node().getComputedTextLength();
}
arr[i] += "...";
self.remove();
}
console.log(data)Run Code Online (Sandbox Code Playgroud)
text {
font-size: 8px;
font-family: "Arial Narrow";
}Run Code Online (Sandbox Code Playgroud)
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg></svg>Run Code Online (Sandbox Code Playgroud)
但是,请记住,getComputedTextLength()显然忽略了类似的东西letter-spacing,正如你在这里看到的:用D3.js计算带有字母间距的文本长度