缘由:一般在缩放事件中更新transform属性时会读取d3.event.scale和d3.event.translate中的值获得当前的缩放比例和平移值。当在事件以外更新时,元素虽然实现了指定的换,可是d3.event中的值并无更新,因此再次缩放时依然实在旧的参数上计算新的变换参数,从而致使新的参数可能与实际的参数差别很大。svg
解决方法:d3.event.scale和d3.event.translate参数实际上来自与svg元素的__zoom属性,该属性包含三个参数:k,x,y;分别对应scale,translate[0]和translate[1],因此若是在事件以外修改transform属性(例如居中全部的元素),只须要同步修改上面提到的属性就行了。
举例:code
svg.attr("transform","translate(100,200),scale(4)"); svg.__zoom.k=4; svg.__zoom.x=100; svg.__zoom.y=200;