所以,我有一个项目列表,例如:
<ul id="listHolder">
<li id="l1">List item 1</li>
<li id="l2">List item 2</li>
<li id="l3">List item 3</li>
等。 定期触发ajax调用,我可能需要重新排序列表(通过使其中一个较低的项成为列表中的第一个)。只需更改#listHolder的HTML即可轻松完成,但我想设置它的动画,以便相应的项目向上移动到正确的位置,其他项目向下移动。
我不知道从哪里开始= /
NB。它不必是一个列表:div或任何其他元素都可以。
答案 0 :(得分:15)
好的,我已经做到了 - 它比我想象的要简单。
请注意,如果您在一秒钟内单击多个列表对象,则一切都会出错。你可以很容易地阻止它,但这对我来说不是问题。
$("li").live("click", function() {
var $myLi = $(this);
var $myUl = $(this).parent();
var listHeight = $myUl.innerHeight();
var elemHeight = $myLi.height();
var elemTop = $myLi.position().top;
var moveUp = listHeight - (listHeight - elemTop);
var moveDown = elemHeight;
var liId = $myLi.attr("id");
var enough = false;
var liHtml = $myLi.outerHTML();
$("li").each(function() {
if ($(this).attr("id") == liId) {
return false;
}
$(this).animate({
"top": '+=' + moveDown
}, 1000);
});
$myLi.animate({
"top": '-=' + moveUp
}, 1000, function() {
$myLi.remove();
var oldHtml = $myUl.html();
$myUl.html(liHtml + oldHtml);
$myUl.children("li").attr("style", "");
});
});
(function($) {
$.fn.outerHTML = function() {
return $(this).clone().wrap('<div></div>').parent().html();
}
})(jQuery);
答案 1 :(得分:4)
就个人而言,我会抓住jQuery UI Sortable功能并在ajax成功时触发事件。看看这个documentation并告诉我你是否喜欢这个想法。如果你的话,我会尝试在会议之间找一些时间编写一个例子。
答案 2 :(得分:0)
我真的不喜欢克隆元素的想法,我试图建立一个排行榜可视化,而不是真的想要改变DOM,所以我用不同的方式使用数据属性和一些基本数学。
html:
<ol id="leaderboard">
<li class="leaderboarditem" data-key="A" data-rank="0"><span class="tag">A</span><span class="tagvalue">0</span></li>
<li class="leaderboarditem" data-key="B" data-rank="1"><span class="tag">B</span><span class="tagvalue">0</span></li>
<li class="leaderboarditem" data-key="C" data-rank="2"><span class="tag">C</span><span class="tagvalue">0</span></li>
</ol>
式:
.tag, .tagvalue { display: inline-block; }
.tag { padding-left: 1em; width: 50%; font-weight: bold; background-color: rgb(235, 235, 235); }
.tagvalue { border-left: 10px solid rgb(235, 235, 235); border-right: 10px solid rgb(235, 235, 235); border-top: 50px solid white; border-bottom: 50px solid white; padding-left: 1em;padding-right: 1em; }
.leaderboarditem { display: block; width: 100%; font-size: 67pt; line-height: 119pt; font-weight: bold; position: relative; top: 0px; left: 0px; }
(风格中的关键是position:relative和display:block)
的javascript:
function (f, msg) {
var leaderboard, key_count, key, value, tag, tag_value, list_item;
console.log(JSON.stringify(msg));
leaderboard = {
element : $('#leaderboard'),
data : []
};
key_count = 0;
for (key in msg) {
++key_count;
value = msg[key];
list_item = $('.leaderboarditem[data-key=' + key.toUpperCase() + ']');
tag_value = list_item.find('.tagvalue').text(value);
leaderboard.data.push({ k: key.toUpperCase(), v: value, item: list_item });
}
leaderboard.data.sort(function (a, b) {
var a_value = a.v;
var b_value = b.v;
return b_value - a_value;
});
leaderboard.data.forEach(function(datum, rank) {
var old_rank, line_height, move_distance;
old_rank = datum.item.data('rank');
if (old_rank != rank) {
line_height = datum.item.height();
move_distance = (line_height * rank) - (line_height * old_rank);
datum.item.animate(
{'top' : '+=' + move_distance },
1e3,
function () {
datum.item.data({ 'rank' : rank });
}
);
}
});
}
}