D3力布局:在拖动使锅(变焦)平滑
问题描述:
我有一个d3.js静力布局图,可以得到相当大的(有时它的一部分被剪切),所以我想,让用户通过拖动来平移整个图形。我不认为我需要拖动单个节点,但我有一种感觉会让人困惑,但想要显示由svg边界剪切的图形部分。D3力布局:在拖动使锅(变焦)平滑
我在http://bl.ocks.org/3811811其中有一个最小的例子使用
visF.append("rect")
.attr("class", "background")
.attr("width", width)
.attr("height", height)
.call(d3.behavior.zoom().on("zoom", redrawVisF));
function redrawVisF() {
visF.attr("transform","translate(" + d3.event.translate + ")" + " scale(" + d3.event.scale + ")");
}
实现平移,但我觉得它真的是“skittery”,而不是很流畅可言,到这种地步,我猜它会阻止人们尝试拖动功能。有没有人知道为什么发生这种情况和/或如何解决它的想法?
答
的问题是,d3.behavior.zoom
获取当前页相对于点击物品的容器元素鼠标的位置,而你正在移动的容器元素!所以相对位置不断变化,因此你看到的抖动效应。
您可能想要移动背景<rect>
,以便它是<svg>
元素的直接子元素。这实现了两件事:
- 该位置现在将相对于
<svg>
容器,它不移动。 - 目前,你当你缩放或平移,因此可缩放的面积变化和视口的某些部分不再缩放移动
<rect>
。在同一个地方有背景<rect>
也解决了这个问题。
啊哈,我被移动RECT为好;使他们“独立”似乎工作:-)非常感谢你解决这个问题。 – unhammer