Механизм очередей в Velocity.js определяет порядок выполнения анимаций на одном и том же DOM-элементе. Каждая анимация не выполняется мгновенно (если не отключено явно), а помещается в очередь, которая последовательно обрабатывается движком.
По умолчанию используется стандартная очередь fx,
унаследованная из концепции jQuery-анимаций. Это означает, что любые
анимации, выполненные через Velocity без дополнительных настроек,
выстраиваются в строгую последовательность.
fxКаждый элемент имеет собственную очередь fx, в которую
попадают анимации по умолчанию.
Velocity(element, { opacity: 0.5 });
Velocity(element, { translateX: 200 });
Velocity(element, { rotateZ: 45 });
Все три анимации выполняются строго последовательно:
Каждая следующая анимация запускается только после завершения предыдущей.
Поведение очереди можно отключить, передав параметр
queue: false. В этом случае анимация запускается
немедленно, параллельно с другими.
Velocity(element, { opacity: 0.2 }, { queue: false });
Velocity(element, { translateX: 300 }, { queue: false });
Обе анимации выполняются одновременно, без ожидания завершения друг друга.
Такой режим используется для создания составных эффектов, где свойства изменяются синхронно.
Velocity.js поддерживает создание нескольких независимых очередей для одного и того же элемента. Каждая очередь идентифицируется строковым именем.
Именованная очередь позволяет изолировать группы анимаций, чтобы они не влияли друг на друга.
Velocity(element, { translateX: 100 }, { queue: "effects" });
Velocity(element, { opacity: 0.3 }, { queue: "effects" });
В данном случае обе анимации попадут в очередь effects и
будут выполняться последовательно внутри неё.
Параллельно можно использовать другую очередь:
Velocity(element, { rotateZ: 90 }, { queue: "transform" });
Velocity(element, { scale: 1.5 }, { queue: "transform" });
Очереди effects и transform выполняются
независимо друг от друга.
Каждая именованная очередь функционирует как отдельный стек задач. Это означает:
Пример:
Velocity(element, { opacity: 0 }, { queue: "fade" });
Velocity(element, { translateY: 100 }, { queue: "move" });
Velocity(element, { rotateZ: 180 }, { queue: "move" });
Velocity(element, { scale: 0.5 }, { queue: "fade" });
Результат:
fade обрабатывает opacity → scalemove обрабатывает translateY → rotateZКаждая очередь завершается, когда полностью отрабатывают все её анимации. Это важно при построении сложных сценариев интерфейса, где разные типы трансформаций должны быть логически разделены.
Например, визуальные эффекты могут быть отделены от геометрических преобразований:
Velocity(element, { backgroundColor: "#000" }, { queue: "style" });
Velocity(element, { translateX: 200 }, { queue: "geometry" });
begin и completeПри работе с именованными очередями колбэки остаются привязанными к конкретной анимации, а не к очереди в целом.
Velocity(element, {
opacity: 0
}, {
queue: "effects",
begin: function() {
// запуск конкретной анимации
},
complete: function() {
// завершение конкретной анимации
}
});
При этом очередь продолжает выполнение следующих задач независимо от колбэков отдельных шагов.
queue в цепочках анимацийVelocity поддерживает цепочки вызовов, где очереди позволяют контролировать порядок выполнения внутри цепочки.
Velocity(element, { translateX: 100 }, { queue: "fx" })
.then(() => Velocity(element, { rotateZ: 45 }, { queue: "fx" }))
.then(() => Velocity(element, { opacity: 0 }, { queue: "fx" }));
Каждый шаг добавляется в одну и ту же очередь, формируя предсказуемую последовательность.
Очереди можно принудительно останавливать. При этом поведение зависит от имени очереди.
Velocity(element, "stop", "effects");
Останавливается только очередь effects, в то время как
другие очереди продолжают выполнение.
Это позволяет управлять анимациями независимо:
Velocity не задаёт глобального приоритета между именованными очередями. Приоритет определяется исключительно архитектурой приложения.
Однако внутри одной очереди гарантируется строгий FIFO-порядок (first in, first out):
Velocity(element, { x: 10 }, { queue: "a" });
Velocity(element, { x: 20 }, { queue: "a" });
Velocity(element, { x: 30 }, { queue: "a" });
Результат всегда линейный: 10 → 20 → 30.
Именованные очереди часто применяются для разделения типов анимаций в интерфейсах:
effects — визуальные эффекты (fade, glow, blur)move — перемещения элементовui — интерфейсные переходыstate — изменение состояния компонентовVelocity(element, { opacity: 1 }, { queue: "effects" });
Velocity(element, { translateX: 300 }, { queue: "move" });
Velocity(element, { scale: 1.2 }, { queue: "ui" });
Такое разделение снижает конфликтность анимаций и повышает предсказуемость поведения.
Каждый DOM-элемент хранит собственные очереди. Это означает:
Velocity(elementA, { opacity: 0 }, { queue: "fx" });
Velocity(elementB, { opacity: 1 }, { queue: "fx" });
Обе операции выполняются независимо.
При первом обращении к имени очереди, которой не существовало, она создаётся автоматически. Очередь не требует предварительной инициализации.
Velocity(element, { rotateZ: 360 }, { queue: "spin" });
Очередь spin создаётся на лету и начинает обработку
первой добавленной задачи.
queue: false и именованных очередейКомбинирование отключения очереди и именованных очередей позволяет создавать гибридные эффекты:
Velocity(element, { opacity: 0.5 }, { queue: false });
Velocity(element, { translateX: 100 }, { queue: "motion" });
Velocity(element, { rotateZ: 45 }, { queue: "motion" });
Результат:
motion выполняется последовательноПри использовании именованных очередей часто возникают следующие проблемы:
Каждая очередь функционирует как изолированный исполнительный поток, и логика синхронизации должна строиться отдельно.