我有一个包含三个D3 JS v3图和一些表格数据的报告页面。该页面看起来很大,而窗口最大化,但是当用户改变浏览器窗口,它开始行为古怪,即每个小区溢出含div
等D3&Angular:调整窗口大小的多个图块的最佳方式是什么?
经过一些研究,我发现,我只是需要设置viewBox
根SVG每个地块的属性,即
var margin = {top: 40, right: 20, bottom: 20, left: 20},
width = 450 - margin.left - margin.right,
height = 370 - margin.top - margin.bottom;
var chartSvg = d3.select("#myPlotDivId")
.append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.attr("viewBox", "0 0 " + (width + margin.left + margin.right) + " " + (height + margin.top + margin.bottom))
.attr("preserveAspectRatio", "xMidYMid meet")
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
这我可以在特定AngularJS控制器内做的,是没有问题的。不过,每次调整窗口大小时,我还需要更新全部三个图。有一个nice JSFiddle demonstrating this:
var aspect = chartSvg.width()/chartSvg.height(),
container = chartSvg.parent();
$(window).on("resize", function() {
var targetWidth = container.width();
chartSvg.attr("width", targetWidth);
chartSvg.attr("height", Math.round(targetWidth/aspect));
}).trigger("resize");
不过,我宁愿给控制器,并从那里我创建情节......我怎么能做到这一点的函数内做到这一点?我不想在调用我的控制器的页面上挂一个Window事件,或者为此创建一个全局指令。有任何想法吗?
使用不随窗口si更改的viewBox泽。 –