我有UL-LI,例如
<ul>
<li id="1">item-1</li>
<li id="2">item-2</li>
<li id="3">item-3</li>
<li id="4">item-4</li>
</ul>
我想将其中一个项目移到列表中的另一个位置。例如第2项至第4项之后。
通常我可以通过删除项目然后将其追加到另一个项目来完成此操作。
但我想用动画在视觉上做到这一点。如同,第2项下降到第4项之后。
我怎样才能做到这一点?
答案 0 :(得分:4)
ID不应以数字开头......
$('#two').slideUp(500, function () {
$('#four').after(this);
$(this).slideDown(500);
});
以下是演示:http://jsfiddle.net/jasper/8JFBA/
或者,如果您总是想要将元素添加到结尾:
$('#two').slideUp(500, function () {
$('ul').append(this);
$(this).slideDown(500);
});
以下是演示:http://jsfiddle.net/jasper/8JFBA/1/
好的,所以如果你想让元素滑到它的新位置,你可以去:
//absolutely position the element and give it a top property so it doesn't go to the top of the container
$('#two').css({ position : 'absolute', top : $('#two').position().top });
//now get the offset to the bottom of the list by getting the top offset and height for the last list-item
var lastOffset = ($(this).children().last().position().top + $(this).children().last().height());
//now animate the element to the new position
$('#two').animate({ top : lastOffset }, 1000, function () {
//when the animation is done, re-add the element to the new position in the list and reset it's position and top values
$(this).appendTo('ul').css({ position : 'relative', top : 0 });
});
演示:http://jsfiddle.net/jasper/8JFBA/3/
您不仅可以动画移动到列表末尾的元素,还可以在列表项向上移动时为其余动画设置动画:
var $LIs = $('ul').children(),
liHeight = 20;
$LIs.on('click', function () {
var index = ($(this).index()),
$LIsAfter = $LIs.filter(':gt(' + index + ')');
console.log(index);
$(this).css({ position : 'absolute', top : $(this).position().top });
$.each($LIsAfter, function (i) {
$(this).css({ position : 'absolute', top : ((i + index + 1) * liHeight) });
});
$(this).stop(true, true).animate({ top : (($LIs.length - 1) * liHeight)}, 1000, function () {
$(this).appendTo('ul').css({ position : 'relative', top : 0 });
});
$.each($LIsAfter, function (i) {
$(this).stop(true, true).animate({ top : ((index + i) * liHeight) }, 1000, function () {
$(this).css({ position : 'relative', top : 0 });
});
});
});
以下是演示:http://jsfiddle.net/jasper/8JFBA/8/
这还不完全,还有一两个错误,但它应该有助于让任何人开始这个想法。
答案 1 :(得分:4)
我试图在下降时实现更平滑的过渡,而下面是我的版本..
您需要尝试演示以了解其工作原理。从下拉列表中选择值并点击Descend以查看动画。
修改:在$from
之前更新addClass('active')
的顶部位置,从准确位置开始,而不是顶部:0px。感谢Jasper找到了这个问题。
var $from = $('#from');
var $to = $('#to');
$('button').click (function () {
var from = $from.val();
var to = $to.val();
var $li = $('ul li');
var $fromEl = $('#' + from);
var $toEl = $('#' + to);
//only descending
if (from == to || $li.index($fromEl) > $li.index($toEl)) return;
var destX = $toEl.position().top;
$toEl.after('<li id="tmpLi2"></li>');
$('#tmpLi2').animate({height: $fromEl.outerHeight()}, 1000);
//add a blank li for smooth animation
$fromEl
.after('<li id="tmpLi1"> </li>')
.css ('top', $fromEl.position().top)
.addClass ('active' )
.animate({
top: (destX)
},
1000,
function() {
$toEl.after(this);
$('#tmpLi2').remove();
$(this).removeClass('active');
});
$('#tmpLi1').slideUp(function() { $(this).remove()});
});