gpt4 book ai didi

javascript - 更改 SVG 内容时保留 d3 缩放状态?

转载 作者:行者123 更新时间:2023-11-30 14:30:14 25 4
gpt4 key购买 nike

我正在使用 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)

最佳答案

在缩放函数中设置变换后,使用“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

关于javascript - 更改 SVG 内容时保留 d3 缩放状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51310179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com