使对角线/路径上的元素可拖动

时间:2013-11-23 05:15:16

标签: javascript jquery jquery-ui jquery-ui-draggable

在使用jQuery UI之前,我已将元素在直线路径上拖动并固定到轴上,如下所示:

$('#element').draggable({
    axis:'y'
});

但是,我想知道如何在跟踪某个基本上是可拖动线的路径时使元素可拖动。

我基本上在开头有一个样式/位置的元素,并且它的结束位置的另一个样式/位置,我希望它可以沿着这两个位置之间的路径拖动。

如何使用javascript或jQuery执行此操作?

2 个答案:

答案 0 :(得分:5)

我不认为jQuery提供了这种功能。但是,您可以在纯JavaScript中执行此操作,或使用我制作的插件:

$.fn.dragBetween = function(eles) {
    var dragEle = this,
        md = false, offset, a, b, ab;
    eles[0] = $(eles[0])[0];
    eles[1] = $(eles[1])[0];
    dragEle.on("mousedown", function(e) {
        if (e.which == 1) {
            mD = true;
            offset = new Vector(
                e.clientX - this.offsetLeft,
                e.clientY - this.offsetTop
            );
            a = new Vector(eles[0].offsetLeft, eles[0].offsetTop);
            b = new Vector(eles[1].offsetLeft, eles[1].offsetTop);
            ab = b.sub(a);
        }
    });
    $(window).on("mousemove", function(e) {
        if (!mD) return false;

        var cursor = new Vector(e.clientX, e.clientY).sub(offset).sub(a),
            mag = cursor.dot(ab) / ab.dot(ab),
            proj = ab.times(Math.max(0, Math.min(1, mag)));
        var final = proj.add(a);
        dragEle.css({
            top: final._arr[1],
            left: final._arr[0]
        });
        e.preventDefault();
    }).mouseup(function() {
        mD = false;
    });
};

这是我急忙写的Vector课程:

function Vector(x, y) {
    this._arr = [x, y];
}
Vector.prototype.dot = function(v2) {
    var v1 = this;
    return v1._arr[0] * v2._arr[0] + v1._arr[1] * v2._arr[1];
}
Vector.prototype.add = function(v2) {
    var v1 = this;
    return new Vector(v1._arr[0] + v2._arr[0], v1._arr[1] + v2._arr[1]);
}
Vector.prototype.sub = function(v2) {
    var v1 = this;
    return new Vector(v1._arr[0] - v2._arr[0], v1._arr[1] - v2._arr[1]);
}
Vector.prototype.times = function(n) {
    var v = this;
    return new Vector(v._arr[0] * n, v._arr[1] * n);
}

要打电话,只需:

$("#drag").dragBetween(["#a", "#b"]);

演示:http://jsfiddle.net/DerekL/0j6e60d8/
有关公式说明,请参阅:https://www.desmos.com/calculator/tpegbbk8gt

答案 1 :(得分:0)

我无法使用Derek的答案,因为你失去了其他功能,jquery ui draggable提供了像遏制。

我发现它可以对角拖动,你可以使用这样的拖动事件修改css:

$(".leftTopCircle").draggable({ axis:"x", containment: ".topLeft", scroll: false });
$(".leftTopCircle").on( "drag", function(event, ui){
    $(this).css("top", ui.position.left+"px");
});