没有相同维度的JQuery可排序网格function

我希望创建一个可排序(通过拖放)网格,类似于JQuery的可排序网格( http://jqueryui.com/demos/sortable/#display-grid )。 但是,Sortable要求您仅使用具有相同尺寸的div。 出于我的目的,允许每个块具有不同的宽度和高度。

我正在寻找的function是捕捉网格function,同时“推”其他元素。 除了防止它们重叠并将其他元素推开之外,Draggable可以完成所有操作。

哦,它也不一定是Jquery。 如果它更容易,我愿意使用其他方法。

Jquery sortable不要求项目具有相同的尺寸,您可以在我的原型中看到: http : //brettlyman.net/dashboard/index3.html

大多数人使用

    作为可排序容器,

  • 作为可排序项,它们可以包含您想要的任何内容。 只要确保你输入“list-style-type:none; margin:0; padding:0;” 在
      的样式中,它看起来/表现得像一个容器。

不幸的是,在排序时你不能做一个自由forms的网格 – 这些项目必须紧邻彼此。 在我的原型中,我将所有东西都悬浮起来,所以它们向右填充,然后下降到下一行。 我在容器的大小调整上设置了网格选项,但是,我可以强制执行网格类型布局。

以为我会发布我的解决方案以防其他人遇到同样类型的问题。

简短的回答:

使用“停止”事件根据新位置重新计算所有网格元素。

普通的留言:

具有可变元素尺寸的可排序网格 – 它是一个视觉混乱,因为不同大小的元素移动多次,上下跳跃,而你拖动其中一个; 每次运动后布局完全不同。

研究类似的function我开发了jQuery插件“Swappable” http://www.eslinstructor.net/demo/swappable/swappable_home.html

最近我回答了关于这个插件的同样问题:

在Draged&Dropped时交换元素(也使用className)

请看一下讨论,也许对你有帮助。

最好的祝福,

-Vadim

我遇到了这个问题,试图为自己解决问题。

我正在尝试解决方法的第一次迭代: 使用父容器作为droppable 。 会告诉你它是否有效:

对于以下HTML:

1
2
3
...

使用以下JavaScript:

 $('#sortable') .sortable({ handle: '.handle', tolerance: 'pointer' }) .droppable({ drop: function(e, ui) { var previousElement = ui.draggable.parent().children().filter(function() { var $this = $(this); var pos = $this.position(); return (this != ui.draggable[0]) && (pos.left <= ui.position.left) && (pos.top <= ui.position.top); }).last(); if( previousElement.length ) { previousElement.after(ui.draggable[0]); ui.draggable.parent().data().sortable._noFinalSort = true; } } });