Javascript D3 word cloud:如何自动调整字体大小,使文字不会用完,并将文字缩放到所有屏幕?
我正在使用Jason Davies d3-cloud.js来实现我的word cloud 1.只要初始窗口大小太小,单词就会消失。 因此,我有一个函数,可以计算单词大小所需的像素,但我使用的是if-else条件,它并不总是有效的:Javascript D3 word cloud:如何自动调整字体大小,使文字不会用完,并将文字缩放到所有屏幕?,javascript,css,angularjs,d3.js,word-cloud,Javascript,Css,Angularjs,D3.js,Word Cloud,我正在使用Jason Davies d3-cloud.js来实现我的word cloud 1.只要初始窗口大小太小,单词就会消失。 因此,我有一个函数,可以计算单词大小所需的像素,但我使用的是if-else条件,它并不总是有效的: _.forEach(data, function (word) { pixNeeded += that.wordService.calcFontSize(word.id) * word.text.length; }); that.divideBy = pixNe
_.forEach(data, function (word) {
pixNeeded += that.wordService.calcFontSize(word.id) * word.text.length;
});
that.divideBy = pixNeeded < 7000 ? 2.5
: pixNeeded < 9000 ? 2
: pixNeeded < 12000 ? 1.7
: pixNeeded < 13000 ? 1.6
: pixNeeded < 15000 ? 1.5
: pixNeeded < 16000 ? 1.4
: pixNeeded < 17000 ? 1.3
: 1;
if (that.h<600 ||that.w<500) // little window handling
{
that.divideBy=1;
that.scale=0.8;
if(pixNeeded>15000) { //small window+lots of words handling by shrink font
that.wordService.fontMax = 24;
that.wordService.fontMin = 8;
}
有更聪明的算法吗?或者如何将g元素安装到外部div
如果希望单词根据父元素的宽度调整大小,那么这可能会有所帮助
.style("font-size", function(d) { return Math.min(2 * r, (2 * r - 8) / this.getComputedTextLength() * 24) + "px"; });
r依赖于父元素
不完全确定,如果这是计算字体大小所需的,则必须创建此比例:
var fontSizeScale = d3.scale.pow().exponent(5).domain([0,1]).range([ minFont, maxFont]);
并在fontSize函数中调用它:
var maxSize = d3.max(that.data, function (d) {return d.size;});
// on the d3.layout.cloud()
.fontSize(function (d) {
return fontSizeScale(d.size/maxSize);
})
function zoomToFitBounds() {
var X0 = d3.min( words, function (d) {
return d.x - (d.width/2);
}),
X1 = d3.max( words, function (d) {
return d.x + (d.width/2);
});
var Y0 = d3.min( words, function (d) {
return d.y - (d.height/2);
}),
Y1 = d3.max( words, function (d) {
return d.y + (d.height/2);
});
var scaleX = (X1 - X0) / (width);
var scaleY = (Y1 - Y0) / (height);
var scale = 1 / Math.max(scaleX, scaleY);
var translateX = Math.abs(X0) * scale;
var translateY = Math.abs(Y0) * scale;
cloud.attr("transform", "translate(" +
translateX + "," + translateY + ")" +
" scale(" + scale + ")");
}
要使边界适合您的屏幕/分区,请执行以下操作:
在.on(“end”,drawCloud)函数中,调用此函数:
var maxSize = d3.max(that.data, function (d) {return d.size;});
// on the d3.layout.cloud()
.fontSize(function (d) {
return fontSizeScale(d.size/maxSize);
})
function zoomToFitBounds() {
var X0 = d3.min( words, function (d) {
return d.x - (d.width/2);
}),
X1 = d3.max( words, function (d) {
return d.x + (d.width/2);
});
var Y0 = d3.min( words, function (d) {
return d.y - (d.height/2);
}),
Y1 = d3.max( words, function (d) {
return d.y + (d.height/2);
});
var scaleX = (X1 - X0) / (width);
var scaleY = (Y1 - Y0) / (height);
var scale = 1 / Math.max(scaleX, scaleY);
var translateX = Math.abs(X0) * scale;
var translateY = Math.abs(Y0) * scale;
cloud.attr("transform", "translate(" +
translateX + "," + translateY + ")" +
" scale(" + scale + ")");
}
这是什么。getComputedTextLength()?这是一个SVG方法,它的官方文档说“返回呈现给定文本元素中所有字符的所有高级值的总和。”……基本上,它返回文本的长度和0如果文本没有呈现,那么minSize和maxSize来自哪里?我想你是指minFont,maxFont?它们对应于OP的fontMax和fontMin。Racheli的fontSizeScale将域[0,1]映射到所需的字体大小范围[8,24],如果这是您所询问的。