Umbrella JS предоставляет лёгкий и лаконичный способ работы с анимациями в DOM. Одним из ключевых инструментов для управления поведением элементов после анимации являются колбэки, которые позволяют выполнять функции после завершения визуальных эффектов, сохраняя код чистым и управляемым.
Umbrella JS реализует анимации через метод .animate().
Этот метод принимает два основных параметра:
duration) и функцию колбэка (complete).Пример базовой анимации с колбэком:
u('.box').animate(
{ opacity: 0, left: '100px' },
{
duration: 500,
complete: function() {
console.log('Анимация завершена');
}
}
);
В этом примере после завершения изменения прозрачности и сдвига
элемента на 100 пикселей будет выполнена функция внутри
complete.
Колбэк, передаваемый через параметр complete, вызывается
один раз после завершения анимации каждого выбранного
элемента. Если селектор охватывает несколько элементов, функция будет
вызвана для каждого из них отдельно, сохраняя контекст
this, указывающий на текущий элемент DOM:
u('.item').animate(
{ height: '200px' },
{
duration: 300,
complete: function() {
this.style.backgroundColor = 'yellow';
}
}
);
В этом случае каждый элемент с классом .item после
анимации увеличения высоты получит желтый фон.
Колбэки могут быть анонимными или именованными. Именованные функции удобны, если требуется использовать один и тот же обработчик для нескольких анимаций:
function highlight(element) {
element.style.border = '2px solid red';
}
u('.card').animate(
{ opacity: 0.5 },
{ duration: 400, complete: highlight }
);
При использовании именованной функции complete Umbrella
JS передает в неё DOM-элемент как аргумент, что
позволяет работать напрямую с элементом без необходимости использовать
this.
Колбэки особенно полезны для создания цепочек анимаций, где каждая последующая анимация начинается только после завершения предыдущей:
u('.circle').animate(
{ left: '200px' },
{
duration: 500,
complete: function() {
u(this).animate({ top: '100px' }, { duration: 300 });
}
}
);
В этом примере сначала выполняется сдвиг по оси X, а после его завершения элемент поднимается по оси Y. Такая последовательность позволяет избегать конфликтов и наложений анимаций.
Колбэки сохраняют надежность независимо от количества анимируемых свойств:
u('.panel').animate(
{ width: '300px', opacity: 1, marginTop: '20px' },
{
duration: 600,
complete: function() {
console.log('Все свойства анимированы');
}
}
);
Метод .animate() гарантирует, что complete
сработает только после завершения всех изменений.
Колбэки могут содержать условные конструкции и логические проверки для динамического поведения:
u('.alert').animate(
{ opacity: 0 },
{
duration: 400,
complete: function() {
if (this.classList.contains('important')) {
alert('Важное уведомление скрыто');
}
}
}
);
Такая практика позволяет объединять анимации с интерактивной логикой интерфейса без добавления лишних событий или таймеров.
При анимации коллекции элементов необходимо учитывать, что
complete вызывается для каждого элемента
отдельно, а не один раз для всей коллекции. Для запуска функции
один раз после завершения всех анимаций можно использовать
дополнительный счетчик:
const items = u('.list-item');
let completed = 0;
items.animate({ opacity: 0 }, {
duration: 500,
complete: function() {
completed++;
if (completed === items.length) {
console.log('Все элементы анимированы');
}
}
});
Umbrella JS не использует нативные промисы для
.animate(), но можно обернуть колбэк в
промис для интеграции с асинхронным кодом:
function animatePromise(element, props, duration) {
return new Promise(resolve => {
u(element).animate(props, { duration: duration, complete: resolve });
});
}
animatePromise('.box', { left: '150px' }, 400)
.then(() => animatePromise('.box', { opacity: 0.5 }, 300));
Такой подход позволяет создавать чистые цепочки анимаций без вложенности колбэков.
complete вызывается после завершения
анимации каждого элемента.this внутри колбэка указывает на
DOM-элемент, подвергшийся анимации.Этот механизм делает Umbrella JS удобным инструментом для создания контролируемых, последовательных и управляемых анимаций, где каждая визуальная трансформация может быть связана с динамическим поведением интерфейса.