jQuery 可拖动限制在取消限制之前在 Y 轴上拖动 100 像素

jQuery Draggable restrict drag on Y axis for 100 pixels before unrestricting

我正在编辑汉诺塔游戏,用户可以在其中将圆盘从一个桩拖到另一个桩。

plugin I found 正在使用 jQuery UI draggable/dropable 来完成此操作。我想编辑插件以实现用户必须首先向上拖动(Y 轴)一定数量的像素然后才能不受任何限制地拖动 left/right/up/down 的功能。

有没有办法要求用户先向上拖动 100 像素,然后才允许用户在容器内任意位置拖动?

下面是我将可拖动功能绑定到光盘的代码(以及将拖动的坐标记录到本地存储中),以备不时之需。

discObj.getDisc().draggable({
    revert: 'invalid',
    containment: this.container,
    cursor: 'move',
    disabled: true,
    helper: 'clone',
    scroll: false,
    drag: function(event, ui) {
        var pos = ui.position;
        var numPos = localStorage.getItem('numStepPositions');
        var coordinates = 'disc:' + discID + ';left:' + pos.left + ';top:' + pos.top +';';

        localStorage.setItem('position' + numPos, coordinates);

        numPos++;
        localStorage.setItem('numStepPositions', numPos);
    }
}); 

您可以在检测到负 Y 平移后编辑 axis 参数:

$(".box").draggable({
    revert: 'invalid',
    cursor: 'move',
    //disabled: true,
    helper: 'clone',
    axis: "y",
    scroll: false,
    start: function (event, ui) {
        initialPos = ui.position.top;
        $(this).addClass("Yaxis");
    },
    drag: function (event, ui) {
        var pos = ui.position;
        if (pos.top < initialPos - 100 && $(this).is(".Yaxis")) {
            $(this).removeClass("Yaxis");
            $(this).draggable('option', 'axis', false);
        }

    },
    stop: function( event, ui ) {
     $(this).draggable('option', 'axis', "y");
    }
});

请参阅the fiddle


首先将axis: "y"添加到.draggable()选项中。然后,您必须在放置开始时存储拖动元素的初始顶部位置,并添加一个标志,告诉它是轴约束的:

start: function (event, ui) {
    initialPos = ui.position.top;
    $(this).addClass("Yaxis");
},

现在,如果拖动的元素已经移动超过 100px,并且具有 Yaxis 类名:

,则只需检查 drag 事件
var pos = ui.position;
if (pos.top < initialPos - 100 && $(this).is(".Yaxis")) {
    $(this).removeClass("Yaxis");
    $(this).draggable('option', 'axis', false);
}

最后在拖动停止处重置 axis:"y"

stop: function( event, ui ) {
     $(this).draggable('option', 'axis', "y");
}