Я придумал это решение: http://jsfiddle.net/FabienDemangeat/TBYWw/
Идея состоит в том, чтобы выбрать индекс элемента Li, который будет перемещаться, и его назначение.
Если значение назначения ниже индекса элемента li для перемещения, эффект будет обратным.
Некоторые детали не идеальны, но это может стать отправной точкой. Я вдохновил себя от фрагмента, предоставленного "Никакими Сюрпризами"
Основная функция 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,
});
}