如何使用 JavaScript 或 jQuery 同时拖动多个元素?

IT技术 javascript jquery jquery-ui jquery-plugins drag-and-drop
2021-03-01 19:01:45

我希望能够使用 jQuery 拖动一组元素,就像我在 Windows 桌面上选择并拖动多个图标一样。

我找到了Threedubmedia 的 jQuery.event.drag的演示

http://threedubmedia.com/code/event/drag/demo/multi
http://threedubmedia.com/code/event/drag#demos

我觉得这个插件很棒。这是一个很好的和流行的图书馆吗?您知道使用它的网站或应用程序吗?

是否有其他库或插件可以拖动多个对象?

可以jQuery UI的拖动多个对象?

6个回答
var selectedObjs;
var draggableOptions = {
    start: function(event, ui) {
        //get all selected...
        selectedObjs = $('div.selected').filter('[id!='+$(this).attr('id')+']');
    },
    drag: function(event, ui) {
        var currentLoc = $(this).position();
        var orig = ui.originalPosition;

        var offsetLeft = currentLoc.left-orig.left;
        var offsetTop = currentLoc.top-orig.top;

        moveSelected(offsetLeft, offsetTop);
    }       
};

$(document).ready(function() {
    $('#dragOne, #dragTwo').draggable(draggableOptions);
});

function moveSelected(ol, ot){
    console.log(selectedObjs.length);
    selectedObjs.each(function(){
        $this =$(this);
        var pos = $this.position();

        var l = $this.context.clientLeft;
        var t = $this.context.clientTop;

        $this.css('left', l+ol);
        $this.css('top', t+ot);
    })
}
感谢您向我展示如何使用 jQuery UI 进行多次拖动。这也有效。
2021-05-01 19:01:45
@GelinLuo 如果与helper:'clone'选项一起使用,示例小提琴不起作用,有什么想法吗?
2021-05-04 19:01:45
@green 您知道吗,当您从 A 移动一组然后从 B 移动时(例如),div 会改变它们的位置吗?
2021-05-07 19:01:45
这个小提琴建立在你的解决方案上,有一些小的更新:jsfiddle.net/zVZFq/358
2021-05-08 19:01:45

我是threedubmedia 插件的作者。我添加了此功能以支持多个元素,因为我在其他任何地方都找不到令人满意的解决方案。

如果您需要一个适用于 jQuery UI 的解决方案,这里有一个插件,它添加了一些多拖动功能,尽管演示在 Firefox for Mac 中似乎无法正常工作。

http://www.myphpetc.com/2009/11/jquery-ui-multiple-draggable-plugin.html

对不起,如果我不完全清楚。我是threedubmedia 插件的作者。我只是发布另一个链接作为使用 jQuery UI 创建类似功能的示例。
2021-04-21 19:01:45
感谢您介绍您的插件。我可以通过单击(而不是通过 ctrl 单击)对项目进行分组吗?我可以自定义项目分组时的效果吗?您的演示在分组时更改项目的颜色。但我想在分组时将对象的位置移动一些像素。我可以用你的插件处理拖拽结束事件吗?
2021-04-26 19:01:45
对不起,我的误解。我很高兴也很惊讶地得到了 Threedubmedia 插件作者的回答!我正在将您的 jquery.event.drag 用于我现在正在开发的软件。我喜欢你的插件。正如您所说,它非常简单而强大。
2021-05-15 19:01:45

这对我有用。

在这里小提琴:

var selectedObjs;
var draggableOptions = {
start: function(event, ui) {
    //get all selected...
    if (ui.helper.hasClass('selected')) selectedObjs = $('div.selected');
    else {
        selectedObjs = $(ui.helper);
        $('div.selected').removeClass('selected')
    }
},
drag: function(event, ui) {
    var currentLoc = $(this).position();
    var prevLoc = $(this).data('prevLoc');
    if (!prevLoc) {
        prevLoc = ui.originalPosition;
    }

    var offsetLeft = currentLoc.left-prevLoc.left;
    var offsetTop = currentLoc.top-prevLoc.top;

    moveSelected(offsetLeft, offsetTop);
    selectedObjs.each(function () {
           $(this).removeData('prevLoc');
        });
    $(this).data('prevLoc', currentLoc);
}
};

$('.drag').draggable(draggableOptions).click(function()     {$(this).toggleClass('selected')});


function moveSelected(ol, ot){
console.log("moving to: " + ol + ":" + ot);
selectedObjs.each(function(){
    $this =$(this);
    var p = $this.position();
    var l = p.left;
    var t = p.top;
    console.log({id: $this.attr('id'), l: l, t: t});


    $this.css('left', l+ol);
    $this.css('top', t+ot);
})
}

感谢 ChrisThompson 和 green 提供了几乎完美的解决方案。

我想补充一下(这在谷歌中很受欢迎),因为这个线程中的插件都没有工作,而且 jquery ui 不支持它的诞生,这是一个简单而优雅的解决方案。

将可拖动元素包装在一个容器中并使用一个事件将它们一次性全部拖动,这允许单个可拖动元素和多可拖动元素(但不是真正的选择性可拖动元素)。

jQuery(document).click(function(e) {

  if(e.shiftKey) {
      jQuery('#parent-container').draggable();
  }
}); 
这个解决方案是显而易见的,但并不总是可行的,尤其是当您想要一次拖动的元素位于不同的容器中并且无法更改此顺序时。
2021-04-17 19:01:45

看一下这个:

https://github.com/someshwara/MultiDraggable

用法:$(".className").multiDraggable({ group: $(".className")});

将元素组拖到一起。Group 也可以是指定单个元素的数组。

喜欢:$("#drag1").multiDraggable({ group: [$("#drag1"),$("#drag2") ]});

jQuery .live() 已从 1.9 版开始删除。
2021-04-25 19:01:45
是的。该插件适用于动态创建的元素 - jQuery live 用于实现这一点。
2021-05-04 19:01:45
这是否适用于调用后动态创建的元素multiDraggable
2021-05-12 19:01:45