jQuery .animate/.each цепочка
Я пытаюсь объединить соответствие что-то вроде:
$(".item").each(function(i) {
//animation here
});
со встроенной функциональностью jQuery, которая заставляет анимацию ждать завершения предыдущей анимации, например:
$(".item").each(function(i) {
$(this).animate({marginLeft:"0"}, 60);
});
А затем активируйте функцию.load после завершения анимации. По сути, я хочу вывести четыре элемента по порядку [один за другим, а не все сразу], а затем загрузить четыре новых элемента в один и тот же элемент div, заменив первые четыре.
Как я могу сделать это многоразовым / переменным способом?
4 ответа
$("#more:not(.disabled)").live("click", function(event) {
event.preventDefault();
var urlPieces = (event.target.href).split("/");
var nextURL = urlPieces[urlPieces.length - 2] + "/" + urlPieces[urlPieces.length - 1];
var items = $(".item");
var itemCount = items.length;
items.each(function(i) {
var passthru = this;
window.setTimeout(function() {
$(passthru).animate({opacity:"0"}, 60, function() {
if (i == itemCount - 1) {
$("#browse").load(nextURL + " .item, #controls", fadeInNew);
}
});
}, 60*i);
});
});
fadeInNew обрабатывает новое пошагово в другом месте, но это было то, что я искал более или менее с небольшим дополнительным кодом вокруг, чтобы, возможно, пролить некоторый свет на происходящее (есть следующая стрелка с URL-адресом в href, если javascript включен, мне нужен URL следующей страницы относительно текущей, если он выключен, отсюда следует, что URL-адрес как href и загружает новую страницу, которая имеет такое же содержимое на странице, за исключением новых элементов, которые будут были $.load-ed.
Как насчет проверки, является ли элемент последним, а затем добавление обратного вызова?
$(".item").each(function(i, elem) {
var callback = $(elem).is(':last') ? function() {
//dosomething
} : function(){};
$(this).animate({marginLeft:"0"}, {duration: 60, complete: callback);
});
Просто укажите обратный вызов для анимации и отследите, сколько элементов было исчезло. Затем, когда все будет готово, удалите их и добавьте новые.
var items = $('.item');
var parent = items.parent();
var itemCount = items.length;
items.each(function()
{
$(this).fadeOut('medium', function()
{
itemCount--;
if (itemCount == 0)
{
// Remove the items and add the new ones.
items.remove();
parent.append('...')
}
});
});
Просто задержка обновления, как это:
$(".item").each(function(i) {
$(this).delay(200*i).animate({marginLeft:"0"}, 60);
});
ul li.item {
margin-left: 50px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
<li class="item">List 1</li>
<li class="item">List 2</li>
<li class="item">List 3</li>
<li class="item">List 4</li>
<li class="item">List 5</li>
<li class="item">List 6</li>
</ul>
Мой вклад основан на алгоритме David:)
function pop_in(array_elem, index) {
$(array_elem[index]).animate({
width: 'toggle',
height: 'toggle'
}, 700)// callback will be a promise
.promise()
.then(() => {
$(array_elem[index]).css({visibility: 'hidden'}); //hide after reduce size
if(index > 0)
pop_in(array_elem, --index) //recursive call
else
console.log("Animation finished. Execute another function from here.");
});
}
const items_menu = $(".item");
pop_in(items_menu, items_menu.length-1); //start from last to first element
Обратите внимание на то, какие свойства ширины и высоты вы можете изменить для своих целей.