В системе анимаций Velocity.js управление жизненным циклом эффекта
строится вокруг набора коллбэков, которые позволяют встраивать
пользовательскую логику в ключевые моменты выполнения анимации. Среди
них особое значение имеют функции begin и
complete, отвечающие за начало и завершение анимационного
цикла.
Коллбэк begin вызывается строго один раз для каждого
элемента в момент старта анимации, до того как начнут изменяться
CSS-свойства. Это делает его удобным инструментом для подготовки
интерфейса к изменению состояния.
Основные особенности:
thisТипичная сигнатура:
Velocity(element, { opacity: 0 }, {
duration: 1000,
begin: function(elements) {
// логика перед стартом анимации
}
});
Контекст this внутри begin указывает на
текущий DOM-элемент, что позволяет выполнять локальные операции без
дополнительного поиска в DOM.
Коллбэк используется в сценариях, где требуется синхронизировать состояние интерфейса до старта визуального перехода:
Пример управления состоянием:
Velocity(element, {
width: "300px"
}, {
duration: 600,
begin: function() {
this.classList.add("animating");
}
});
При работе с группой элементов begin вызывается для
каждого элемента, поэтому состояние может быть установлено
индивидуально.
Коллбэк complete срабатывает после полного завершения
анимации, включая все промежуточные кадры и завершение очереди анимаций
для конкретного элемента. Он является финальной точкой жизненного цикла
tween-а.
Ключевые характеристики:
thisСигнатура:
Velocity(element, { opacity: 1 }, {
duration: 1000,
complete: function(elements) {
// финальная логика
}
});
Коллбэк завершения часто применяется для построения последовательностей и управления состояниями интерфейса после анимации.
Распространённые сценарии:
Пример:
Velocity(element, {
translateX: "200px"
}, {
duration: 800,
complete: function() {
this.classList.remove("animating");
this.classList.add("done");
}
});
Velocity.js использует систему очередей (queue), и поведение коллбэков зависит от их положения в цепочке анимаций.
begin срабатывает до старта конкретного шага
очередиcomplete вызывается после завершения шага, включая
ожидание очередиПример цепочки:
Velocity(element, { opacity: 0 }, {
duration: 500,
begin: function() {
this.dataset.state = "fade-out";
},
complete: function() {
this.dataset.state = "faded";
}
}).velocity({ opacity: 1 }, {
duration: 500,
begin: function() {
this.dataset.state = "fade-in";
},
complete: function() {
this.dataset.state = "visible";
}
});
При работе с коллекцией DOM-элементов Velocity вызывает
begin и complete для каждого элемента
отдельно. Это важно учитывать при управлении глобальными
состояниями.
Особенности:
Для синхронизации используют внешние счётчики:
let counter = 0;
Velocity(items, {
opacity: 1
}, {
duration: 700,
begin: function() {
counter++;
},
complete: function() {
counter--;
if (counter === 0) {
console.log("Все анимации завершены");
}
}
});
В обоих коллбэках this указывает на DOM-элемент, что
позволяет изменять его напрямую без дополнительных выборок. Однако важно
учитывать, что внутри строгих режимов или при использовании стрелочных
функций контекст теряется.
Корректный вариант:
Velocity(element, {
scale: 1.2
}, {
begin: function() {
this.style.willChange = "transform";
},
complete: function() {
this.style.willChange = "auto";
}
});
Некорректный вариант:
begin: () => {
this.classList.add("active"); // контекст потерян
}
complete часто используется как механизм ручного
управления последовательностями, когда требуется строгий контроль над
порядком анимаций без использования встроенных цепочек.
Velocity(box, { height: "200px" }, {
duration: 400,
complete: function() {
Velocity(this, { width: "200px" }, {
duration: 400
});
}
});
Такой подход позволяет строить сложные сценарии интерфейсных переходов, где каждый этап зависит от завершения предыдущего.
Если анимация прерывается вызовом нового Velocity на тот же элемент, поведение коллбэков меняется:
begin нового tween-а будет вызван немедленноcomplete предыдущего может не выполниться, если
анимация была остановлена без завершенияqueue: false логика становится
параллельной, что влияет на порядок вызововЭто важно учитывать при создании интерактивных интерфейсов с частыми обновлениями состояния.
На практике оба коллбэка часто используются совместно для полного контроля жизненного цикла анимации:
Velocity(panel, {
opacity: 0
}, {
duration: 500,
begin: function() {
this.classList.add("transitioning");
},
complete: function() {
this.classList.remove("transitioning");
this.classList.add("hidden");
}
});
Такая структура обеспечивает чёткое разделение:
begin отвечает за подготовкуcomplete отвечает за фиксацию итогового состояния