【问题标题】:Dragging a Div in jQuery - fine when mouse is slow, but fails on fast mouse movement在 jQuery 中拖动 Div - 当鼠标速度很慢时很好,但在快速鼠标移动时失败
【发布时间】:2011-08-11 02:44:27
【问题描述】:

我想用我自己的 jQuery 代码拖动一个 div。

当鼠标移动缓慢时,jsfiddle 上的这个例子可以正常工作

http://jsfiddle.net/craic/kr7Un/

但任何快速移动都会将鼠标拉出框外,并且会丢失跟踪。

jQuery UI draggable 没有这个问题,无论你移动多快都可以很好地跟踪:http://jqueryui.com/demos/draggable/

但我想推出自己的简单版本,以便可以将它与 Raphael、按键等集成。我查看了 jQuery UI 可拖动源,但对我来说,它非常难以理解(800 行)。

我认为事件冒泡不是问题...有什么想法吗?

【问题讨论】:

  • 好像跟鼠标拖尾有关?
  • 我不知道您是否注意到,当您将框拖得太快时,鼠标光标会离开框并失去它的“保持”。 :)
  • 是的,它叫做鼠标拖尾。

标签: jquery events draggable drag


【解决方案1】:

有两个问题。一种是当鼠标离开元素时您正在取消拖动,您不想这样做。第二个是鼠标移动只在盒子上,一旦光标离开盒子就不再执行鼠标移动。您可以存储要拖动的元素,然后将 mousemove 添加到整个页面。

编辑:实际上,我想 mouseup 也应该在文档上,以防万一您在快速移动期间释放鼠标单击并且光标位于框外。更新了 jsfiddle。

看这里:

http://jsfiddle.net/Jjgmz/1/

var box = $('#box');

box.offset({
    left: 100,
    top: 75
});

var drag = {
    elem: null,
    x: 0,
    y: 0,
    state: false
};
var delta = {
    x: 0,
    y: 0
};

box.mousedown(function(e) {
    if (!drag.state) {
        drag.elem = this;
        this.style.backgroundColor = '#f00';
        drag.x = e.pageX;
        drag.y = e.pageY;
        drag.state = true;
    }
    return false;
});


$(document).mousemove(function(e) {
    if (drag.state) {
        drag.elem.style.backgroundColor = '#f0f';

        delta.x = e.pageX - drag.x;
        delta.y = e.pageY - drag.y;

        $('#log').text(e.pageX + ' ' + e.pageY + ' ' + delta.x + ' ' + delta.y);

        var cur_offset = $(drag.elem).offset();

        $(drag.elem).offset({
            left: (cur_offset.left + delta.x),
            top: (cur_offset.top + delta.y)
        });

        drag.x = e.pageX;
        drag.y = e.pageY;
    }
});

$(document).mouseup(function() {
    if (drag.state) {
        drag.elem.style.backgroundColor = '#808';
        drag.state = false;
    }
});​

【讨论】:

  • 太棒了!我曾尝试将 mousemove 绑定到文档,但我没有保存 box 元素。谢谢! (并且使用 jsfiddle 来表示示例代码效果很好)
  • 感谢 2018 年 6 月。这真的困扰了我 3 天。虽然我想知道为什么鼠标太快会丢失目标?
  • 出于好奇,我对您的解决方案进行了调整大小,结果如下:jsfiddle.net/fs5wnemk/1。但如果兼容,那么通过纯 CSS 调整大小会更好:stackoverflow.com/a/60803488/490291
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多