鼠标移动事件

时间:2016-09-04 23:09:54

标签: d3.js svg

我在svg上实现d3.js缩放行为,在同一个svg上我还需要捕获鼠标坐标,这样我就可以设置跟随鼠标光标位置的工具提示的位置。

问题在于我的鼠标移动'事件已覆盖d3.js缩放行为。 随着'mousemove'添加事件,缩放行为停止工作。

要么我有' mousemove'事件或'缩放'事件,但不是两个。有什么建议如何解决这个问题?感谢。

    // bind zoom behavior
    selection_svg.call(
        d3.behavior.zoom()
        .translate([0, 0])
        .scale(1)
        .scaleExtent([1, 14])
        .on('zoom', ()=>{ selection_plotArea.attr('transform', 'translate('+d3.event.translate+')scale('+d3.event.scale+')'); })
    );

    // tool tip coordinate
    const toolTipNode = selection_toolTip.node();
    toolTipNode.style.position = 'absolute';
    selection_svg.node().addEventListener('mousemove',function(evt){
        const coord_client = {
            x:evt.clientX,
            y:evt.clientY,
        }
        toolTipNode.style.left = `${coord_client.x}px`;
        toolTipNode.style.top = `${coord_client.y}px`;
    }, false);

我已将此问题的代码添加到小提琴中: https://jsfiddle.net/apollotang/rt9t1vdj/

2 个答案:

答案 0 :(得分:1)

问题似乎与tooltipNode捕获鼠标事件有关。通过向coord_client添加一些偏移,您的问题就会消失。

  selection_svg.on('mousemove', function () {
    const coord_client = {
      x: d3.event.layerX + 10,
      y: d3.event.layerY + 10
    };
    toolTipNode.style.left = `${coord_client.x}px`;
    toolTipNode.style.top = `${coord_client.y}px`;
  }, false);

注意:我还将clientXclientY更改为layerXlayerY,因为滚动更改鼠标位置时存在错误,{ {1}}将与鼠标分开。此外,事件处理代码已更改为由d3处理。

答案 1 :(得分:0)

如果你的svg附有mousemove事件,请确保你没有在mousemove事件中调用d3.event.stopPropagation(),否则你将阻止缩放行为。

相关问题