我通过修改代码来创建wordcloud:https://github.com/jasondavies/d3-cloud。我可以通过修改w&来改变大小。但是我想在浏览器窗口改变时缩放词云。实现这一目标的最佳方法是什么?
代码也发布在http://plnkr.co/edit/AZIi1gFuq1Vdt06VIETn?p=preview
<script>
myArray = [{"text":"First","size":15},{"text":"Not","size":29},{"text":"Bird","size":80}, {"text":"Hello","size":40},{"text":"Word","size":76},{"text":"Marketplaces","size":75}]
var fillColor = d3.scale.category20b();
var w = 400, // if you modify this also modify .append("g") .attr -- as half of this
h = 600;
d3.layout.cloud().size([w, h])
.words(myArray) // from list.js
.padding(5)
.rotate(0)
.font("Impact")
.fontSize(function(d) { return d.size; })
.on("end", drawCloud)
.start();
function drawCloud(words) {
d3.select("body").append("svg")
.attr("width", w)
.attr("height", h)
.append("g")
.attr("transform", "translate(" + w/2 + "," + h/2 + ")")
.selectAll("text")
.data(words)
.enter().append("text")
.style("font-size", function(d) { return (d.size) + "px"; })
.style("font-family", "Impact")
.style("fill", function(d, i) { return fillColor(i); })
.attr("text-anchor", "middle")
.attr("transform", function(d,i) {
return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
}
)
.text(function(d) { return d.text; });
}
</script>
答案 0 :(得分:3)
解决方案#1:
第37行:
.style("font-size", function(d) { return (d.size) + "px"; })
替换
.style("font-size", function(d) { return (d.size/3) + "vh"; }) // "d.size/3" is an assumption use your appropriate relative width or height.
而不是使用px
使用vw
这是视口宽度。这是一个css3功能,它将根据视口调整文本大小。但是,您需要正确调整实际宽度和高度。
尝试阅读本文:http://css-tricks.com/viewport-sized-typography/
解决方案#2:
第37行:
.style("font-size", function(d) { return (d.size) + "px"; })
使用
.attr("class", nameOfClass) // use class names here like 'big-font', 'med-font', 'small-font'
并且在CSS中使用媒体查询定义样式,将根据条件中的d.size分配类,所以就像if(d.size&gt; 10)nameOfClass =&#34; big-font& #34;等
不使用JS给出单词宽度和高度,而是使用媒体查询断点为它们分配类。
阅读:http://www.w3schools.com/cssref/css3_pr_mediaquery.asp
我推荐解决方案2,因为我相信所有浏览器都不支持vw
和vh
。 http://caniuse.com/#feat=viewport-units。报告中存在一些与此相关的问题。
答案 1 :(得分:1)
解决方案#3:
要计算字体大小,您必须创建此比例:
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;});
.fontSize(function (d) {
return fontSizeScale(d.size/maxSize);
})
为了适应你的屏幕/ div的界限:
在.on("end", drawCloud)
函数中,调用此函数:
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 + ")");
}