В системе анимаций Velocity.js предусмотрен набор callback-функций, позволяющих подключаться к различным этапам жизненного цикла анимации. Эти функции называются hook-функциями и дают возможность точно контролировать момент старта, обновления и завершения анимации, а также отслеживать её прогресс в реальном времени.
Hook-функции передаются в объекте параметров при вызове
Velocity() и выполняются синхронно относительно внутреннего
цикла анимации.
Velocity.js предоставляет несколько ключевых hook-функций:
Каждая из этих функций решает свою задачу и позволяет строить как простую, так и сложную логику управления анимацией.
Hook begin срабатывает в момент, когда анимация только
начинает выполняться, но до того, как изменения стилей будут
применены.
Velocity(element, { opacity: 1, translateY: 100 }, {
duration: 800,
begin: function(elements) {
console.log("Анимация стартовала");
}
});
Особенности поведения:
Типичный сценарий использования — фиксация состояния интерфейса перед изменениями.
Hook complete срабатывает после того, как анимация
полностью завершена и все стили применены.
Velocity(element, { opacity: 0 }, {
duration: 500,
complete: function(elements) {
console.log("Анимация завершена");
}
});
Особенности:
complete является ключевым инструментом для построения
последовательных сценариев интерфейса.
Hook progress — один из наиболее мощных инструментов
Velocity.js. Он вызывается на каждом кадре анимации и предоставляет
информацию о текущем прогрессе выполнения.
Velocity(element, { width: "100%" }, {
duration: 2000,
progress: function(elements, percentComplete, remaining, tweenValue) {
console.log(percentComplete);
}
});
Параметры progress:
Основные применения:
Важно учитывать, что progress может вызываться десятки
раз в секунду, поэтому внутри него не следует выполнять тяжёлые
вычисления.
Hook step используется для более низкоуровневого
контроля анимации. Он вызывается при каждом шаге изменения значения
анимируемых свойств.
Velocity(element, {
left: "500px"
}, {
duration: 1000,
step: function(now, tween) {
console.log(now);
}
});
Особенности step:
now)В отличие от progress, step работает на
уровне конкретного свойства, а не всей анимации.
При запуске анимации последовательность вызовов выглядит следующим образом:
begin — перед стартомstep — многократно во время интерполяции свойствprogress — параллельно с шагами, на уровне
анимацииcomplete — после завершенияЭта последовательность позволяет выстраивать точный контроль над каждым этапом анимации.
Все hook-функции получают доступ к массиву элементов, участвующих в анимации. Это позволяет работать как с одиночными DOM-узлами, так и с группами элементов.
Velocity(".box", { opacity: 0.5 }, {
begin: function(elements) {
elements.forEach(el => {
el.classList.add("animating");
});
}
});
Особенности:
elements всегда массив, даже если выбран один
элементHook-функции часто применяются для построения последовательных
анимаций без необходимости использовать сложные цепочки
Velocity(...).then(...).
Velocity(element, { translateX: 200 }, {
duration: 500,
complete: function() {
Velocity(element, { opacity: 0 }, {
duration: 300
});
}
});
Такой подход позволяет:
Несмотря на схожесть, progress и step
решают разные задачи:
progress — высокий уровень, управление всей
анимациейstep — низкий уровень, контроль конкретного
свойстваprogress подходит для UI-индикаторов и логики
интерфейса, тогда как step — для математически точных
анимаций и кастомных эффектов.
Hook-функции выполняются внутри анимационного цикла, поэтому их влияние на производительность критично.
Рекомендуемые практики:
progress и
stepНарушение этих правил приводит к падению FPS и дерганной анимации.
Velocity.js позволяет использовать несколько hook-функций одновременно в одном вызове:
Velocity(element, { opacity: 1, translateY: 0 }, {
duration: 1000,
begin: function() {
console.log("start");
},
progress: function(elements, percent) {
console.log(percent);
},
complete: function() {
console.log("done");
}
});
Такая комбинация позволяет построить полный контроль над жизненным циклом анимации без внешних зависимостей.