gpt4 book ai didi

javascript - d3js 跳动缩放行为

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

我正在探索 d3js(第 4 版)库并在尝试缩放行为时遇到了以下问题。

在通过单击 svg 触发编程缩放后使用鼠标滚轮进行缩放时,它会导致延迟/跳动行为,从而失去其位置。

我找到了这个 Stack Overflow 资源:d3.js pan and zoom jumps when using mouse after programatic zoom并认为这可能会帮助我。但它没有。

我已经设置了一个简单的示例,以便您明白我的意思。我在这里错过了什么?

$(document).ready(function() {
var svg = d3.select('svg');
var group = d3.select('g#content');

svg.call(
d3.zoom().scaleExtent([1, 30]).on('zoom', function() {
group.attr('transform', d3.event.transform);
})
);

svg.on('click', function() {
group
.transition()
.duration(1000)
.attr("transform", "translate(100,100) scale(2)");
});
});
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg width="1200" height="500" viewBox="0 0 1200 500">
<g id="content">
<path d="M10,10 l50,0 0,50 -50,0 0,-50 Z" />
<path d="M70,10 l50,0 0,50 -50,0 0,-50 Z" />
<path d="M130,10 l50,0 0,50 -50,0 0,-50 Z" />
<path d="M190,10 l50,0 0,50 -50,0 0,-50 Z" />
<path d="M250,10 l50,0 0,50 -50,0 0,-50 Z" />
<path d="M310,10 l50,0 0,50 -50,0 0,-50 Z" />
</g>
</svg>

编辑通过将以下几行添加到我的事件监听器中,放大时行为得到改善。缩小时它仍然跳动;

var transform = d3.zoomTransform(group.node());
transform.x = m.x;
transform.y = m.y;
transform.k = scale;

完整的更新片段:

$(document).ready(function() {
var svg = d3.select('svg');
var group = d3.select('g#content');

svg.call(
d3.zoom().scaleExtent([1, 30]).on('zoom', function() {
group.attr('transform', d3.event.transform);
})
);

svg.on('click', function() {
group
.transition()
.duration(1000)
.attr("transform", "translate(100,100) scale(2)");

var transform = d3.zoomTransform(group.node());
transform.x = 100;
transform.y = 100;
transform.k = 2;

});
});
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg width="1200" height="500" viewBox="0 0 1200 500">
<g id="content">
<path d="M10,10 l50,0 0,50 -50,0 0,-50 Z" />
<path d="M70,10 l50,0 0,50 -50,0 0,-50 Z" />
<path d="M130,10 l50,0 0,50 -50,0 0,-50 Z" />
<path d="M190,10 l50,0 0,50 -50,0 0,-50 Z" />
<path d="M250,10 l50,0 0,50 -50,0 0,-50 Z" />
<path d="M310,10 l50,0 0,50 -50,0 0,-50 Z" />
</g>
</svg>

提前致谢!

最佳答案

当您以编程方式应用缩放时,您应该这样做:

  svg.on('click', function() {
svg.transition()
.duration(750)
.call(zoom.transform, d3.zoomIdentity
.translate(100, 100) // set x and y transition
.scale(2) // set scale value
);
});

请注意,翻译必须在缩放之前应用。

另外,请注意 d3-zoom 对双击事件有一个默认行为(缩放)。如果您不想要它,可以使用以下代码将其禁用:

svg.on("dblclick.zoom", null);

工作演示:

$(document).ready(function() {
var svg = d3.select('svg');
var group = d3.select('g#content');
var zoom = d3.zoom().scaleExtent([1, 30]).on('zoom', function() {
group.attr('transform', d3.event.transform);
});

svg.call(zoom);

svg.on("dblclick.zoom", null);

svg.on('click', function() {
svg.transition()
.duration(750)
.call(zoom.transform, d3.zoomIdentity
.translate(100, 100)
.scale(2)
);
});
});
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg width="1200" height="500" viewBox="0 0 1200 500">
<g id="content">
<path d="M10,10 l50,0 0,50 -50,0 0,-50 Z" />
<path d="M70,10 l50,0 0,50 -50,0 0,-50 Z" />
<path d="M130,10 l50,0 0,50 -50,0 0,-50 Z" />
<path d="M190,10 l50,0 0,50 -50,0 0,-50 Z" />
<path d="M250,10 l50,0 0,50 -50,0 0,-50 Z" />
<path d="M310,10 l50,0 0,50 -50,0 0,-50 Z" />
</g>
</svg>

关于javascript - d3js 跳动缩放行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48450780/

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