【发布时间】:2018-01-30 04:18:05
【问题描述】:
我正在探索 d3js(第 4 版)库,并在玩弄缩放行为时遇到了以下问题。
在通过单击 svg 触发程序化缩放后使用鼠标滚轮进行缩放时,它会导致失去其位置的 laagy/jumpy 行为。
我找到了这个 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;
完整更新的 sn-p:
$(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>
提前致谢!
【问题讨论】:
标签: javascript d3.js