对具有固定位置值的 DOM 元素进行排序(例如:left:20px)
Sorting of DOM elements which have fixed position values (for eg: left:20px)
各位专家大家好
我的问题是关于 jquery。
我正在使用 draggable dropabble methods.I 有一个 droppable div(parent) 。将元素(本身是 div)拖放到可放置 div (parent div) 的左侧时,元素会附加到左侧 ...如果靠近右边它附加到右边。
为此,我使用左右定位(eg:left:30px,right:40px)。我也使用了左右浮动。
到这里它工作完美。
现在我也想实现排序...我的意思是可放置容器 (parent div) 中的元素也应该排序。为此,我使用了 ui.sortable
.但是它不起作用,因为 DOM 元素有一个固定的位置,所以它不排序。
现在我尝试在第一次尝试排序时更改 DOM 元素的 css
$( ".parent" ).sortable({
placeholder: "highlight",
stop:function(event,ui){
$(".parent").children("div").css("float","left");
$(".parent").children("div").css("position","relative");
$(".parent").children("div").css("right","");
$(".parent").children("div").css("left","");
} });
上面的代码在第一次尝试时没有排序,而是根据代码中的 DOM 位置重新排列 DOM 元素。在第一次尝试后,它更改了 css 和它排序完美。
我想在不重新排列 child divs
的情况下对第一次尝试进行排序
注意: sortable 不起作用,因为我已经给出了 dom 位置..或浮点值....
我希望我能展示一个完整的演示,但我做不到。不过我做了一个小演示。首先在此处观看此 This Here You cant sort item 3 with others. Now watch this . Click 它有效,但在第一次尝试时它只是重新排列,然后它对我的问题有效 perfectly.Simillar 。请阅读我上面的问题并查看两个演示
如果有人知道解决办法请告诉我。
好的,所以我在此处编辑了您的 fiddle 以重新排序 div,以便排序有效。基本上,有 2 个步骤:
$('#sortable li').each(function(index){
$(this).attr('data-orgleft',$(this).offset().left);
$(this).css({float:"left",position:"relative"});
});
遍历所有列表元素,查看它们在页面上的位置,并将它们的位置分配给属性(也可以在此处使用 .data(),但在 dom 中不太明显)。在这样做的同时,我们还删除了 'float' 并将位置设置为 relative.
var $wrapper = $('#sortable');
$wrapper.find('li').sort(function (a, b) {
return +a.dataset.orgleft - +b.dataset.orgleft;
})
.appendTo( $wrapper );
然后我们根据这个数据属性对 div 进行排序,如另一个问题中的 here 所示。这样一来,您就可以从一开始就正常使用 sortable 。 (在您的应用程序中,您需要将其放入一个函数中,并在每次放入 div 时调用它)
以防万一你的 draggables 会延伸到多行,重新排序它们的方式与 here 中一样,基本上它在顶部和左侧排序。
$wrapper.find('li').sort(function(a,b){
var x = a.dataset.orgtop - b.dataset.orgtop;
return x == 0? a.dataset.orgleft - +b.dataset.orgleft : x;
}).appendTo( $wrapper );
各位专家大家好 我的问题是关于 jquery。 我正在使用 draggable dropabble methods.I 有一个 droppable div(parent) 。将元素(本身是 div)拖放到可放置 div (parent div) 的左侧时,元素会附加到左侧 ...如果靠近右边它附加到右边。
为此,我使用左右定位(eg:left:30px,right:40px)。我也使用了左右浮动。
到这里它工作完美。
现在我也想实现排序...我的意思是可放置容器 (parent div) 中的元素也应该排序。为此,我使用了 ui.sortable .但是它不起作用,因为 DOM 元素有一个固定的位置,所以它不排序。
现在我尝试在第一次尝试排序时更改 DOM 元素的 css
$( ".parent" ).sortable({
placeholder: "highlight",
stop:function(event,ui){
$(".parent").children("div").css("float","left");
$(".parent").children("div").css("position","relative");
$(".parent").children("div").css("right","");
$(".parent").children("div").css("left","");
} });
上面的代码在第一次尝试时没有排序,而是根据代码中的 DOM 位置重新排列 DOM 元素。在第一次尝试后,它更改了 css 和它排序完美。 我想在不重新排列 child divs
的情况下对第一次尝试进行排序注意: sortable 不起作用,因为我已经给出了 dom 位置..或浮点值....
我希望我能展示一个完整的演示,但我做不到。不过我做了一个小演示。首先在此处观看此 This Here You cant sort item 3 with others. Now watch this . Click 它有效,但在第一次尝试时它只是重新排列,然后它对我的问题有效 perfectly.Simillar 。请阅读我上面的问题并查看两个演示
如果有人知道解决办法请告诉我。
好的,所以我在此处编辑了您的 fiddle 以重新排序 div,以便排序有效。基本上,有 2 个步骤:
$('#sortable li').each(function(index){
$(this).attr('data-orgleft',$(this).offset().left);
$(this).css({float:"left",position:"relative"});
});
遍历所有列表元素,查看它们在页面上的位置,并将它们的位置分配给属性(也可以在此处使用 .data(),但在 dom 中不太明显)。在这样做的同时,我们还删除了 'float' 并将位置设置为 relative.
var $wrapper = $('#sortable');
$wrapper.find('li').sort(function (a, b) {
return +a.dataset.orgleft - +b.dataset.orgleft;
})
.appendTo( $wrapper );
然后我们根据这个数据属性对 div 进行排序,如另一个问题中的 here 所示。这样一来,您就可以从一开始就正常使用 sortable 。 (在您的应用程序中,您需要将其放入一个函数中,并在每次放入 div 时调用它)
以防万一你的 draggables 会延伸到多行,重新排序它们的方式与 here 中一样,基本上它在顶部和左侧排序。
$wrapper.find('li').sort(function(a,b){
var x = a.dataset.orgtop - b.dataset.orgtop;
return x == 0? a.dataset.orgleft - +b.dataset.orgleft : x;
}).appendTo( $wrapper );