【问题标题】:jQuery UI sortable/draggable nesting examplejQuery UI 可排序/可拖动嵌套示例
【发布时间】:2014-01-08 09:32:09
【问题描述】:

我一直在使用可排序和可拖动的 jQuery UI,我正在寻找一种方法来嵌套列表项(仅第一级和第二级),具体取决于它们在列表中的放置位置。

我正在尝试做的简单 JSFiddle 示例:http://jsfiddle.net/picitelli/XZ4Tw/

$(".items").sortable({
    connectWith: ".items",
    placeholder: "placeholder",
    update: function(event, ui) {
        // update
    },
    sort: function(event, ui) {
        // sort
    }
});
$(".item").droppable({
    accept: ".item",
    hoverClass: "dragHover",
    drop: function( event, ui ) {
        console.log('drop');
        if (ui.position.left >= 20) {
            $(this).removeClass("first-level");
            $(this).addClass("second-level");
        } else {
            $(this).removeClass("second-level");
            $(this).addClass("first-level");
        }
    },
    over: function( event, ui ) {
        // over
    },
    activate: function( event, ui ) {
        // activate
    }
});

我希望能够拖动一个列表项并将其放在另一个列表项之前/之后,具体取决于我与列表左侧 (x) 的距离以及与底部/顶部的距离(y) 我要放在附近的列表项,它将使该列表项成为第一级和第二级项目。例如,如果我将一个列表项拖到另一个列表项的顶部,并且我更靠近悬停在该列表项的底部,而不是离底部更远,如果我放下它,它将捕捉到所述列表项的底部并且是一级项。如果我将该列表项移到更远的位置并放下它,它将吸附到底部并成为二级项。占位符也会更新,调用一个类,只是在悬停时,以显示删除的列表项在实际删除之前将是第一级或第二级。

根据上面的小提琴,在 drop 方法中,我正在检查拖动的列表项距左侧多远。如果它大于或等于 20px,我将添加一个缩进列表项的“二级”类。如果它小于 20 像素,我将添加一个“第一级”类,以保持列表项向左对齐。仅对于左 (x) 计算,这是可行的,但它没有将类应用于已删除的列表项,而是将它们应用于已“跳过”的列表项。我没有调用正确的方法来执行此操作吗?另外,我将如何执行这样的计算来确定列表项的捕捉位置取决于它与我悬停的列表项的距离(y)?

任何反馈/方向将不胜感激。

【问题讨论】:

标签: jquery jquery-ui


【解决方案1】:

嗯,我认为你的问题看起来是一个有趣的挑战。我知道如何去做,但不确定。所以我试了一下。希望这会很有用。我不确定它是否能满足您的所有需求,因此如果缺少某些东西,请告诉我。谢谢。

这是我想出的一个例子:使用sortable 事件。

CSS

.placeholder-sub {
    background: #fff;
    border: 1px dashed #ccc;
    height: 50px;
    width: 480px;
    margin-left: 20px;
}

jQuery

$(".items").sortable({
    connectWith: ".items",
    placeholder: "placeholder",
    update: function(event, ui) {
        // update
    },
    start: function(event, ui) {
        if(ui.helper.hasClass('second-level')){
            ui.placeholder.removeClass('placeholder');
            ui.placeholder.addClass('placeholder-sub');
        }
        else{ 
            ui.placeholder.removeClass('placeholder-sub');
            ui.placeholder.addClass('placeholder');
        }
    },
    sort: function(event, ui) {
        var pos;
        if(ui.helper.hasClass('second-level')){
            pos = ui.position.left+20; 
            $('#cursor').text(ui.position.left+20);
        }
        else{
            pos = ui.position.left; 
            $('#cursor').text(ui.position.left);    
        }
        if(pos >= 32 && !ui.helper.hasClass('second-level')){
            ui.placeholder.removeClass('placeholder');
            ui.placeholder.addClass('placeholder-sub');
            ui.helper.addClass('second-level');
        }
        else if(pos < 25 && ui.helper.hasClass('second-level')){
            ui.placeholder.removeClass('placeholder-sub');
            ui.placeholder.addClass('placeholder');
            ui.helper.removeClass('second-level');
        }
    }
});

Fiddle

【讨论】:

  • 特雷弗,这太棒了。非常感谢!
  • 欢迎您!请将此答案标记为已接受,您可以单击答案左侧的复选标记。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
相关资源
最近更新 更多