我正在使用d3渲染某些内容,并使用d3.zoom
用鼠标进行缩放。它可以工作,但是我还需要定期更改svg的内容(进行完整的$('svg').html($('svg').html())
调用,因为我的SVG包含HTML)。
问题是当我这样做时,我失去了缩放状态。我试图通过存储缩放变换并在更新后重新应用来跟踪它,但是它不起作用。
Here's a pen,我尝试使用dagre-d3示例图。
简而言之,这就是我在做什么:
let transform;
function dag(){
// ... set up stuff here
var svg = d3.select("svg"),
inner = svg.select("g");
// Set up zoom support
var zoom = d3.zoom().on("zoom", function() {
//store transform
transform = d3.event.transform
inner.attr("transform", d3.event.transform);
});
svg.call(zoom);
// render graph
new dagreD3.render()(inner, g);
// Center the graph
var initialScale = 0.75;
svg.call(zoom.transform, d3.zoomIdentity.translate((svg.attr("width") - g.graph().width * initialScale) / 2, 20).scale(initialScale));
svg.attr('height', g.graph().height * initialScale + 40);
}
setInterval(() => {
// simulate reloading content
dag()
console.log('render again')
//try and apply saved transform state
transform && inner.attr("transform", transform);
}, 2000)
答案 0 :(得分:2)
在缩放功能中设置了转换后,再次使用'initialScale'变量来设置svg比例,问题可以在这里看到:
extend.js
要解决此问题,您需要根据svg的当前比例转换来更改“ initialScale”变量中的值。如此处所示:
// Center the graph
var initialScale = 0.75;
svg.call(zoom.transform, d3.zoomIdentity.translate((svg.attr("width") - g.graph().width * initialScale) / 2, 20).scale(initialScale));