私が見つけたこれにアプローチする最も簡単な方法は、ズームしている状態の境界ボックスに基づいて、g
状態を囲む要素 (例) に変換を設定することです。#states
// your starting size
var baseWidth = 600;
d3.selectAll('#states path')
.on('click', function(d) {
// getBBox() is a native SVG element method
var bbox = this.getBBox(),
centroid = [bbox.x + bbox.width/2, bbox.y + bbox.height/2],
zoomScaleFactor = baseWidth / bbox.width,
zoomX = -centroid[0],
zoomY = -centroid[1];
// set a transform on the parent group element
d3.select('#states')
.attr("transform", "scale(" + scaleFactor + ")" +
"translate(" + zoomX + "," + zoomY + ")");
});
ここでクリーンアップするためにできることは他にもたくさんあります - 最終的なズームにいくらかのマージンを与える、幅または高さに基づいてズームする必要があるかどうかを確認する、ズームに応じてストローク幅を変更する、トランジションをアニメートするなど - しかしそれは基本コンセプト。