使用jQuery将列表项移动到无序列表的顶部
可以说我有以下无序列表
我正在寻找的是当我点击Tom时,它会移动(动画而不拖动)到列表的顶部(索引0)。
我认为jquery可以排序,但我找不到以编程方式激活移动部件的方法。
我想出了一个似乎运作良好的解决方案。 这是一个概念certificate,因此您可能需要对其进行一些修改,以便更好地适应您的具体情况。 此外,我只在Firefox中测试过它,但我没有看到为什么这在所有浏览器中都不起作用的原因。 无论如何,这里是:
它计算点击的LI
和第一个LI
之间的偏移差异,并通过将其position
设置为relative
并为top
属性设置动画,将单击的LI
移动到top
。 类似地,它计算被点击的LI
留下多少空间并相应地向下移动所有先前的空间。 完成动画后,它会重新排列DOM以匹配新订单并恢复定位样式。
希望有所帮助!
发现这个更整洁:
$('li').on('click', function() { $(this).parent().prepend(this); });
实例
假设:
然后:
$("#list a").click(function() { $(this).parent().before("#list a:first"); return false; });
如果你想要制作动画,那就更难了。 一种选择:
$("#list a").click(function() { $(this).parent().slideUp(500).before("#list a:first").slideDown(500); return false; });
另外一个选项:
$("#list a").click(function() { var item = $(this).parent(); var prev = item.prev(); while (prev.length > 0) { item.before(prev); prev = item.prev(); } return false; });
但我怀疑你会以这种方式获得流畅的动画效果。
我玩弄了没有惊喜的小提琴,并扩展了交换两组任意元素的代码(唯一的限制是它们必须直接相互跟随)。
看到这里: http : //jsfiddle.net/ZXYZ3/139/
我提出了这个解决方案: http : //jsfiddle.net/FabienDemangeat/TBYWw/
我们的想法是选择将移动的Li元素的索引及其目的地。 如果目标值低于要移动的li元素的索引,则效果将反转。
有些部分并不完美,但它可以作为一个起点。 我从“No Surprises”提供的片段中激发了自己的灵感
主函数swapLiElements
交换两个li元素,回调函数作为参数允许轻松地进行多个交换( 参见小提琴 )。
function swapLiElements($northLi, $southLi, isPushingDown, duration, easing, callbackFunction) { var movement = $northLi.outerHeight(); // Set position of the li elements to relative $northLi.css('position', 'relative'); $southLi.css('position', 'relative'); // Set the z-index of the moved item to 999 to it appears on top of the other elements if(isPushingDown) $northLi.css('z-index', '999'); else $southLi.css('z-index', '999'); // Move down the first li $northLi.animate({'top': movement}, { duration: duration, queue: false, easing: easing, complete: function() { // Swap the li in the DOM if(isPushingDown) $northLi.insertAfter($southLi); else $southLi.insertBefore($northLi); resetLiCssPosition($northLi); resetLiCssPosition($southLi); callbackFunction(); } }); $southLi.animate({'top': -movement}, { duration: duration, queue: false, easing: easing, }); }