[英]Preserve d3 zoom state when changing out SVG contents?
我正在使用d3渲染某些內容,並使用d3.zoom
進行鼠標縮放。 它可以工作,但是我還需要定期更改svg的內容(執行完整的$('svg').html($('svg').html())
調用,因為我的SVG包含HTML)。
問題是當我這樣做時,我失去了縮放狀態。 我試圖通過存儲縮放變換並在更新后重新應用來跟蹤它,但是它不起作用。
簡而言之,這就是我正在做的事情:
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)
在縮放功能中設置了轉換后,再次使用'initialScale'變量來設置svg比例,問題可以在這里看到:
// 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的當前比例轉換來更改“ initialScale”變量中的值。 如此處所示:
// Center the graph
var initialScale = (typeof transform != 'undefined') ? transform.k : 0.75;
svg.call(zoom.transform, d3.zoomIdentity.translate((svg.attr("width") - g.graph().width * initialScale) / 2, 20).scale(initialScale));
帶有修復的代碼的代碼筆: https ://codepen.io/anon/pen/MBwBYY?editors=0011
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.