我发现,解决此问题的最简单方法是根据您要缩放到的状态的边界框,对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 + ")");
});
Run Code Online (Sandbox Code Playgroud)
你可以在这里做更多的事情来清理它 - 为最终变焦提供一些余量,检查是否应该根据变焦进行宽度或高度,根据变焦更改行程宽度,为过渡设置动画等等 - 但这就是基本概念.