Transition-эффекты в Velocity.js строятся вокруг управляемого изменения CSS-свойств во времени с предсказуемой производительностью и контролем над очередями анимаций. В отличие от стандартных CSS transition, библиотека позволяет программно комбинировать свойства, управлять временными функциями, синхронизировать последовательности и строить сложные композиции анимаций без зависимости от внешних стилей.
Переход в Velocity.js представляет собой интерполяцию значений CSS-свойств от текущего состояния к заданному целевому значению. Основная идея заключается в том, что библиотека напрямую управляет вычислением промежуточных кадров, минуя ограничения CSS transition.
Типовой переход:
Velocity(element, {
opacity: 1,
translateY: "0px"
}, {
duration: 600,
easing: "ease-out"
});
В данном случае происходит одновременная анимация двух свойств:
opacity изменяется линейно или по заданной кривойtranslateY трансформирует положение элементаКлючевым моментом является использование
transform-свойств вместо изменения layout-параметров, что
обеспечивает более высокую производительность.
Наиболее эффективные переходы в Velocity.js строятся на основе CSS transform:
Пример комбинированного перехода:
Velocity(element, {
translateX: "200px",
scale: 1.2,
rotateZ: "15deg"
}, {
duration: 800,
easing: "ease-in-out"
});
Использование transform позволяет избежать перерасчёта layout, так как изменения происходят в compositor layer браузера.
Часто используемые эффекты появления и исчезновения строятся на
opacity и управлении свойством display.
Velocity(element, "fadeIn", {
duration: 300
});
или более явно:
Velocity(element, {
opacity: 1
}, {
duration: 300,
begin: function() {
element.style.display = "block";
}
});
При скрытии элемента важно учитывать момент удаления из потока документа:
Velocity(element, {
opacity: 0
}, {
duration: 300,
complete: function() {
element.style.display = "none";
}
});
Изменение геометрии элемента через width,
height, padding, margin возможно,
но требует осторожности из-за влияния на reflow.
Velocity(element, {
width: "300px",
height: "200px"
}, {
duration: 500
});
Для сложных интерфейсов предпочтительно заменять такие переходы трансформациями:
Velocity(element, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 400
});
Одной из ключевых особенностей является система очередей, позволяющая выстраивать последовательные переходы.
Velocity(element, { translateY: "-50px" }, { duration: 300 });
Velocity(element, { opacity: 0 }, { duration: 200 });
Velocity(element, { translateY: "0px", opacity: 1 }, { duration: 300 });
Каждая анимация добавляется в очередь и выполняется последовательно. Это позволяет формировать сценарии поведения UI без ручного управления таймингами.
Очередь можно отключить:
Velocity(element, { opacity: 1 }, { queue: false });
Параллельное выполнение достигается через группировку или отключение очереди:
Velocity(element, {
translateX: "100px",
opacity: 0.5
}, {
duration: 400,
queue: false
});
В этом случае свойства анимируются одновременно, а не последовательно.
Плавность переходов задаётся через easing-кривые:
Пример:
Velocity(element, {
translateY: "150px"
}, {
duration: 700,
easing: "ease-in-out"
});
Easing влияет на восприятие движения, создавая эффект инерции, ускорения или упругости.
Для списков элементов используется параметр stagger,
задающий задержку между запуском анимаций:
Velocity(elements, {
opacity: 1,
translateY: "0px"
}, {
duration: 300,
stagger: 100
});
Каждый следующий элемент начинает переход с задержкой, формируя каскадный эффект появления.
Velocity.js поддерживает инверсию анимации:
Velocity(element, "reverse");
Это позволяет вернуть элемент к предыдущему состоянию без повторного описания параметров. Механизм основан на хранении состояния последнего перехода.
Переходы поддерживают изменение цветовых свойств:
Velocity(element, {
backgroundColor: "#ff0000",
color: "#ffffff"
}, {
duration: 500
});
Интерполяция выполняется в RGB-пространстве, что позволяет плавно изменять оттенки.
Сложные сцены строятся через цепочки:
Velocity(element, { scale: 0.8 }, { duration: 200 })
.then(() => Velocity(element, { rotateZ: "180deg" }, { duration: 400 }))
.then(() => Velocity(element, { scale: 1 }, { duration: 200 }));
Такая структура позволяет моделировать состояния интерфейса как последовательность переходов.
Любая анимация может быть остановлена:
Velocity(element, "stop");
Также возможно завершение на конечном состоянии:
Velocity(element, "finish");
Это важно для интерфейсов, где пользователь может прерывать текущие анимации новым действием.
Оптимизация основана на нескольких принципах:
transform вместо layout-свойствПереходы, затрагивающие top, left,
width, height, должны использоваться
ограниченно, так как вызывают перерасчёт структуры страницы.
Типовая структура интерфейсного перехода включает три стадии:
Пример:
Velocity(element, {
opacity: 0,
translateY: "20px"
}, { duration: 0 });
Velocity(element, {
opacity: 1,
translateY: "0px"
}, {
duration: 400,
easing: "ease-out"
});
Такой подход позволяет избежать «скачков» при первом рендере анимации.
Переходы часто привязываются к событиям интерфейса:
button.addEventListener("click", () => {
Velocity(panel, {
height: "300px",
opacity: 1
}, {
duration: 500
});
});
Система анимаций становится реактивной, реагируя на действия пользователя и изменяя состояние интерфейса без прямого вмешательства в DOM-структуру.