我有一個包含三個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澤。 –