好的,我们开始:
基于Lars' comment,我们可以为鼠标滚轮事件指定事件处理程序。如answer 所示,我们首先将wheel.zoom 事件映射到自定义处理程序pan
selection.call(zoomer)
.on("wheel.zoom",pan) // handler function for mousewheel zoom
其次,我们需要定义平移手势,基本上是在x和/或y方向的translate。
function pan() {
svg.attr("transform", "translate(" + [dx,dy] + ")");
}
我们还需要量化两个方向的移动,并将其与鼠标滚轮移动相关联。通过查看MouseWheel事件的细节,我们发现了两个有用的属性deltaX和deltaY,表示鼠标滚轮在每个方向上移动了多少。
最终的pan函数如下
function pan() {
current_translate = d3.transform(svg.attr("transform")).translate;
dx = d3.event.wheelDeltaX + current_translate[0];
dy = d3.event.wheelDeltaY + current_translate[1];
svg.attr("transform", "translate(" + [dx,dy] + ")");
d3.event.stopPropagation();
}
这是一个working fiddle 和bl.ock 也修改了迈克的geometric zoom example。
跨浏览器支持:
鼠标滚轮事件似乎在浏览器之间有所不同。对于 Safari 和 Firefox 支持,您需要添加以下内容:
selection.call(zoomer)
.on("wheel.zoom",pan)
.on("mousewheel.zoom", pan)
.on("DOMMouseScroll.zoom", pan)
另外,wheelDelta 的解释在 Firefox 中是相反的。 wheelDelta可以被this function修复
function crossWheelDelta()
// cross-browser wheel delta
var e = window.event || e; // old IE support
return Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));
}