jQuery - 如何在拖动事件期间为可拖动 div 向移动光标设置动画

jQuery - how to animate draggable div towards moving cursor during drag event

我正在使用 jquery UI 可拖动,并希望在拖动事件期间有一个可拖动的 div 动画。想象一下,当静止时,示例中的正方形 div 附着在一块磁铁上。当您点击它并开始拖动时,它不会拖动直到达到某个距离阈值(距离 = div 中心与当前鼠标位置之间的距离)。达到该阈值后,div 将向鼠标移动,然后应进行正常的拖动事件。

我的问题是,当鼠标以足够快的速度拖动超过距离阈值时,div 将开始闪烁,因为它在显示动画 div 和显示动画 div 之间切换被拖着。发生的另一个问题是,如果您足够快地拖动鼠标然后停止,div 会动画到最后记录的鼠标位置,但是在进行计算时,鼠标可能已经在不同的位置,所以鼠标在一个地方, div 在另一个地方。关于如何使 div 对鼠标进行动画处理然后在一个平滑过渡中继续拖动事件的任何想法? (另外,我希望动画足够长,以便您可以看到 div 移动。如果将持续时间设置为 1,它可以正常工作,但我希望它在视觉上更具吸引力和流畅)这是一个演示: http://jsfiddle.net/b84wn2nf/

下面是演示中的一些代码:

$(".dragSquare").draggable({
drag: function (event, ui) {

    if($(this).hasClass("stuck")){
    var mx = event.pageX;
    var my = event.pageY;
    ui.position.left = $(this).position().left;
    ui.position.top = $(this).position().top;

    var d = Math.floor(Math.sqrt(Math.pow(mx - ($(this).offset().left + ($(this).width() / 2)), 2) + Math.pow(my - ($(this).offset().top + ($(this).height() / 2)), 2)));
    console.log(d)
    if (d > 200) {
        var animateToX = event.pageX - $(this).width() / 2;
        var animateToY = event.pageY - $(this).height() / 2;

        $(this).stop(true, true).animate({
            left: animateToX + 'px',
            top: animateToY + 'px'
        }, {
            /*easing: 'easeOutBounce,'*/
            duration: 500,
            start: function () {},
            complete: function () {
                $(this).removeClass("stuck");
            }
        });
    }
    }
} });

好的,所以我知道我很久以前就发布了这个,从那时起,我开始使用 Snap.js SVG 库而不是 jQuery,这使得取消一个更容易拖动,但在切换之前,我唯一能解决的方法是:修改源代码。

在 jquery-ui.js 中,找到 jQuery UI 可拖动部分,然后向下滚动到 _mouseDrag 方法。 您需要在自己的代码中做的是设置一个全局变量来告诉 jQuery 是否要覆盖拖动行为。我使用 'cancelDrag' 作为变量名。所以当它设置为 false 时,拖动行为正常。

在_mouseDrag中,您会看到如下代码:

this.helper[0].style.left = this.position.left + "px";
this.helper[0].style.top = this.position.top + "px";

你需要做的是将它包装在一个取决于你的布尔变量的条件语句中,所以它看起来像这样:

if(!cancelDrag){
    this.helper[0].style.left = this.position.left + "px";
    this.helper[0].style.top = this.position.top + "px";
}

基本上,如果 cancelDrag 设置为 true,jQuery 拖动处理程序将不会更改元素的位置。它并不理想,可能不应该使用,但它确实有效。确保如果您修改此文件,您没有使用缩小的源代码。