D3.jsをレスポンシブ対応させる(SVG自体を拡大縮小する)

備忘録的に。
svg内の各要素すべてを書き換える方法もあるが ここではsvg全体を丸ごと拡大縮小するやり方。


まずは htmlでsvgを記述。 id,width,heigthを設定する。

<svg id="field" width="500" height="300"
 viewBox="0 0 500 300"
 preserveAspectRatio="xMidYMid meet">
</svg>

viewBoxは左上の原点(0,0) からの座標と width , height を対応させるやつ。 ここでは同じ値で対応させる。
(d3.scale の domain , range みたいな感じかな?)
詳しくはこっち
SVGコードの基本 | CodeGrid

preserveAspectRatio は細かい縮小拡大の方向の微調整。 デフォルト値で "xMidYMid meet"
詳しくはこっち
座標系, 変換, 単位 – SVG 1.1 (第2版)
ゲームミュージックと生存確認をかねた画期的な: svgのpreserveAspectRatio属性の動作検証



以下

jQueryを使う方法、

D3.jsを使う方法の2つ


* jQueryを使う方法http://jsfiddle.net/shawnbot/BJLe6/

var width=500;
var height=300; 

var chart = $("#field"),
    aspect = chart.width() / chart.height(),
    container = chart.parent();

$(window).on("resize", function() {
    var targetWidth = container.width();
    chart.attr("width", targetWidth);
    chart.attr("height", Math.round(targetWidth / aspect));
}).trigger("resize");

やってることは、 アス比の計算、新しいウィンドウのサイズ取得、svg要素に適応


* D3.jsを使う方法javascript - Whats the best way to make a d3.js visualisation layout responsive? - Stack Overflow

var  chart = d3.select('#field');

var width=500;
var height=300;
var aspect = width / height;



d3.select(window)
  .on("resize", function() {
    var targetWidth = chart.node().getBoundingClientRect().width;
    chart.attr("width", targetWidth);
    chart.attr("height", targetWidth / aspect);
  });


D3の場合CSSに以下の記述が必要

#field{ width:100%; }



あとはsvg内に各要素を描画すればOK