Библиотека Zepto предоставляет лёгкий и компактный способ работы с DOM, включая поддержку анимаций. Одной из ключевых особенностей управления анимацией является очередь анимации, которая позволяет последовательно выполнять эффекты, избегая конфликтов между ними и обеспечивая плавность визуальных изменений.
Каждый элемент в Zepto имеет собственную внутреннюю очередь анимаций.
При вызове метода .animate() без дополнительных параметров
новая анимация автоматически добавляется в очередь текущего элемента.
Zepto гарантирует, что следующая анимация не начнётся до завершения
предыдущей.
Очередь реализуется как массив функций, каждая из которых выполняет определённый анимационный шаг. После завершения текущей функции вызывается следующая.
Пример последовательной анимации:
$('#box')
.animate({ width: '200px' }, 500)
.animate({ height: '200px' }, 500)
.animate({ opacity: 0.5 }, 500);
В этом примере #box сначала изменяет ширину, затем
высоту, и только после этого — прозрачность. Каждое действие добавляется
в очередь и выполняется последовательно.
Zepto предоставляет несколько методов для работы с очередью анимаций:
queue([queueName,] function) —
добавляет новую функцию в очередь элемента.
queueName — необязательный параметр, позволяет
создавать несколько независимых очередей.function — функция, которая будет выполнена при
достижении своей позиции в очереди. Для продолжения выполнения следующей
функции необходимо вызвать next().Пример пользовательской очереди:
$('#box').queue(function(next){
$(this).css('background-color', 'red');
setTimeout(next, 300);
}).queue(function(next){
$(this).css('background-color', 'blue');
setTimeout(next, 300);
});
dequeue([queueName]) — запускает
выполнение следующей функции в указанной очереди. Если
queueName не указан, используется очередь по
умолчанию.$('#box').dequeue();
clearQueue([queueName]) — очищает
очередь, удаляя все оставшиеся функции. Эффективно для отмены
запланированных анимаций.$('#box').clearQueue();
.animate() и их влияние на очередьМетод .animate() принимает три ключевых аргумента:
{width: '200px', opacity: 0.5}.'fast', 'slow'.Пример с колбэком:
$('#box').animate({ left: '100px' }, 400, function(){
console.log('Анимация завершена');
});
Если нужно добавить анимацию в начало очереди,
используется метод .queue('fx', func) с последующим вызовом
.dequeue().
Zepto позволяет создавать собственные очереди, не связанные с визуальными эффектами. Это удобно для выполнения последовательных задач:
$('#box').queue('custom', function(next){
console.log('Первый шаг');
next();
}).queue('custom', function(next){
console.log('Второй шаг');
next();
});
$('#box').dequeue('custom');
Все функции в очереди выполняются последовательно, пока очередь не опустеет.
По умолчанию все вызовы .animate() используют очередь
'fx'. Если несколько анимаций запускаются одновременно без
очереди, они могут конфликтовать. Добавление их в очередь обеспечивает
синхронность и предсказуемость.
Для временного запуска анимации без очереди можно использовать
параметр { queue: false }:
$('#box').animate({ width: '300px' }, { duration: 500, queue: false });
В этом случае анимация выполняется сразу, независимо от текущей очереди.
delay() для управления временемМетод .delay(ms) позволяет приостанавливать выполнение
очереди на указанное время:
$('#box')
.animate({ width: '200px' }, 500)
.delay(300)
.animate({ height: '200px' }, 500);
Здесь между изменением ширины и высоты будет пауза в 300 мс.
delay() фактически добавляет специальную функцию в очередь,
которая вызывает next() после заданной задержки.
next() в пользовательских
очередях, иначе выполнение остановится..stop() и .finish() позволяют
управлять текущей анимацией и всей очередью, прерывая или завершив все
запланированные действия.Пример остановки и очистки очереди:
$('#box').stop(true); // Прерывает текущую анимацию и очищает очередь
.animate()..queue(), .dequeue()..stop()
и .clearQueue()..delay().Эти инструменты делают Zepto гибким и компактным решением для создания сложных, последовательных анимационных эффектов с контролем над порядком и временем их выполнения.