Velocity.State — внутренний объект библиотеки
Velocity.js, предназначенный для хранения глобального состояния
анимационного движка. Он не является частью публичного API в строгом
смысле, но активно используется внутри библиотеки для оптимизации
производительности, управления очередями анимаций и отслеживания
текущего состояния DOM-элементов.
Понимание структуры и принципов работы Velocity.State
позволяет глубже разобраться в механике Velocity.js, особенно при
разработке сложных интерфейсов или отладке нестандартного поведения
анимаций.
Velocity.StateVelocity.State представляет собой единый объект,
содержащий несколько ключевых свойств:
Velocity.State = {
isMobile: false,
isAndroid: false,
isGingerbread: false,
isChrome: true,
isFirefox: false,
prefixElement: document.createElement("div"),
prefixMatches: {},
scrollAnchor: window,
scrollPropertyLeft: "pageXOffset",
scrollPropertyTop: "pageYOffset",
isTicking: false,
calls: []
};
Каждое поле играет определённую роль.
Velocity автоматически определяет платформу и браузер, чтобы адаптировать поведение анимаций.
Основные флаги:
isMobile — указывает на мобильное устройствоisAndroid — определяет AndroidisGingerbread — устаревшая версия Android (важна для
совместимости)isChrome, isFirefox — определяют
браузерЭто необходимо для:
prefixElement: document.createElement("div"),
prefixMatches: {}
Назначение:
prefixElement используется для тестирования поддержки
CSS-свойствprefixMatches кеширует найденные префиксыVelocity проверяет, какие CSS-свойства поддерживаются, и
автоматически подставляет нужные префиксы (-webkit-,
-moz- и т.д.).
Пример внутренней логики:
if (property in element.style) {
return property;
}
Если свойство не найдено — перебираются префиксированные варианты.
scrollAnchor: window,
scrollPropertyLeft: "pageXOffset",
scrollPropertyTop: "pageYOffset"
Velocity поддерживает анимацию прокрутки (scroll).
Особенности:
scrollAnchor может быть window или
DOM-элементомscrollPropertyLeft и
scrollPropertyTop адаптируются под браузерЭто позволяет корректно работать с:
window.scrollToisTicking: false,
calls: []
Это центральная часть Velocity.State.
calls — очередь
анимацийКаждый элемент массива calls содержит:
Структура одного вызова:
[
tweensContainer,
elements,
options,
timeStart,
resolver
]
isTickingФлаг, указывающий, запущен ли цикл обновления анимаций.
Velocity использует requestAnimationFrame для обновления
анимаций.
Упрощённая схема:
function tick(timestamp) {
for (var i = 0; i < Velocity.State.calls.length; i++) {
// обработка каждой анимации
}
if (Velocity.State.calls.length > 0) {
requestAnimationFrame(tick);
} else {
Velocity.State.isTicking = false;
}
}
Поведение:
isTicking становится
truetickПри вызове:
Velocity(element, { opacity: 0.5 }, { duration: 1000 });
происходит:
callsisTickingtick, если он не активенПосле завершения анимации:
callsЭто предотвращает:
Velocity.State играет ключевую роль в оптимизации:
1. Батчинг операций
Все анимации обрабатываются в одном цикле tick, что:
2. Кеширование
prefixMatches3. Минимизация layout thrashing
Velocity старается:
queue)Velocity поддерживает очереди анимаций (fx,
пользовательские).
Velocity.State.calls хранит активные
анимации, а очереди управляют порядком их запуска.
Связь:
State.calls — где она исполняетсяКаждый вызов анимации может возвращать Promise:
Velocity(element, { opacity: 0 }).then(() => {
console.log("Готово");
});
Внутри State.calls хранится resolver,
который:
Если один элемент участвует в нескольких анимациях:
calls1. Зависшие анимации
Если calls не очищается:
isTicking остаётся trueПричины:
2. Утечки памяти
Если ссылки на элементы не удаляются:
3. Конфликты с ручными изменениями DOM
Если свойства элемента изменяются вне Velocity:
Velocity.StateХотя это не рекомендуется, возможен доступ:
console.log(Velocity.State.calls);
Используется для:
Плагины Velocity могут использовать Velocity.State
для:
requestAnimationFrameVelocity использует нативный requestAnimationFrame, но
при его отсутствии:
setTimeoutState.isTicking гарантирует:
callsisTickingtickcalls| Свойство | Назначение |
|---|---|
calls |
Хранение активных анимаций |
isTicking |
Флаг работы цикла |
prefixMatches |
Кеш CSS-префиксов |
scrollAnchor |
Контекст прокрутки |
isMobile и др. |
Определение среды |
Глубокое понимание Velocity.State позволяет эффективно
управлять анимациями, оптимизировать производительность и разрабатывать
расширения, интегрирующиеся на уровне ядра Velocity.js.