CSS-трансформации в Velocity.js строятся вокруг свойства
transform, которое агрегирует несколько операций в одну
матрицу преобразования. При комбинировании translate,
scale, rotate и других функций ключевым
становится порядок применения, поскольку каждая последующая операция
модифицирует уже преобразованную систему координат.
В контексте Velocity.js трансформации не записываются как независимые CSS-правила. Они компилируются в итоговую матрицу, где:
transform-стринг.Это означает, что комбинация свойств фактически превращается в последовательное умножение матриц.
Velocity.js позволяет одновременно анимировать несколько трансформаций в одном вызове:
Velocity(element, {
translateX: 200,
translateY: 100,
rotateZ: 45,
scale: 1.2
}, 800);
Каждое свойство добавляется в общую трансформационную матрицу. Итоговое значение не хранится как набор CSS-правил, а пересчитывается на каждом кадре анимации.
Особенность подхода заключается в том, что отсутствует конфликт между свойствами — они не перезаписывают друг друга, а объединяются.
При комбинации трансформаций порядок интерпретации имеет решающее значение:
rotate влияет на направление последующего
translatescale изменяет амплитуду смещенияtranslate в связке с rotation может визуально менять
траекторию движенияХотя в объектной записи порядок свойств не гарантирует математический порядок применения, Velocity.js внутренне нормализует их в матричное представление. Это означает, что визуальный результат стабилен, но зависит от общей композиции трансформаций.
Velocity.js поддерживает последовательное применение анимаций, где каждая следующая операция строится поверх предыдущей трансформации:
Velocity(element, { translateX: 100 }, 400);
Velocity(element, { rotateZ: 90 }, 400);
Velocity(element, { scale: 1.5 }, 400);
В этом случае трансформации не объединяются в один кадр, а накапливаются во времени. Каждый следующий вызов использует текущее состояние элемента как базовое.
Это поведение важно при построении сложных анимационных цепочек, где требуется постепенное наращивание эффектов.
Механизм очереди позволяет формировать управляемые последовательности трансформаций:
Velocity(element, { translateX: 150 }, { duration: 400, queue: "fx" });
Velocity(element, { rotateZ: 180 }, { duration: 400, queue: "fx" });
Velocity(element, { scale: 0.8 }, { duration: 400, queue: "fx" });
Очередь fx обеспечивает строго последовательное
выполнение трансформаций без пересечения кадров. Каждая следующая
анимация стартует только после завершения предыдущей.
В этом режиме комбинирование происходит не на уровне свойств, а на уровне временной последовательности.
Наиболее эффективная форма комбинирования трансформаций — единый объект анимации:
Velocity(element, {
translateX: 300,
translateY: 50,
rotateZ: 360,
scale: 0.5
}, {
duration: 1000,
easing: "easeInOut"
});
Здесь формируется единый вектор изменений, который интерполируется в течение времени. Такой подход обеспечивает:
Velocity.js поддерживает относительные трансформации, позволяющие накапливать изменения:
Velocity(element, {
translateX: "+=100",
rotateZ: "+=45"
}, 600);
Относительные значения усиливают эффект комбинирования, так как каждое новое состояние зависит от предыдущего. Это особенно важно при построении интерактивных интерфейсов, где анимации вызываются многократно.
Масштабирование оказывает влияние на визуальную интерпретацию других
трансформаций. При увеличении scale смещения в
translate воспринимаются как более значительные, хотя
математически остаются неизменными.
Комбинация:
Velocity(element, {
scale: 2,
translateX: 100
}, 500);
Фактически приводит к тому, что движение по оси X визуально удваивается при восприятии пользователем, несмотря на линейность вычислений.
При добавлении вращения эффект усиливается:
Velocity(element, {
scale: 1.5,
rotateZ: 30,
translateX: 150
}, 700);
Здесь возникает сложная траектория движения, обусловленная матричным преобразованием координат.
Velocity.js поддерживает работу с 3D-плоскостью через
translateZ, rotateX, rotateY,
rotateZ.
Velocity(element, {
translateZ: -200,
rotateY: 180,
translateX: 100
}, 900);
При комбинировании 2D и 3D трансформаций происходит переход к полноценной матрице 4x4, где каждая операция влияет на перспективу.
Особенности сочетания:
translateZ влияет на перспективное масштабированиеrotateY изменяет глубину восприятия объектаКомбинирование может строиться не только через объектные литералы, но и через цепочки вызовов:
Velocity(element, { translateX: 200 }, 400, function () {
Velocity(this, { rotateZ: 90 }, 400, function () {
Velocity(this, { scale: 0.7 }, 400);
});
});
Такая структура формирует вложенную последовательность трансформаций, где каждый этап зависит от завершения предыдущего.
При одновременной анимации opacity, width,
height и трансформаций важно учитывать, что transform
обрабатывается отдельным слоем компоновки.
Velocity(element, {
opacity: 0.5,
translateX: 120,
rotateZ: 45,
width: "300px"
}, 600);
Transform-комбинации остаются GPU-ускоряемыми, в то время как layout-свойства могут вызывать перерасчёт потока документа.
При повторных вызовах без сброса состояния происходит накопление матрицы трансформации:
Velocity(element, { translateX: 50 }, 200);
Velocity(element, { translateX: 50 }, 200);
Velocity(element, { translateX: 50 }, 200);
Результирующее смещение не является простой суммой кадров, а зависит от интерполяции между состояниями.
Для контролируемого комбинирования используется явное управление состоянием:
Velocity(element, "stop", true);
Velocity(element, { translateX: 0 }, 0);
Velocity(element, { translateX: 150 }, 600);
Velocity.js позволяет задавать анимации в виде массивов, что удобно для группировки трансформаций:
Velocity(element, [
{ translateX: 100, rotateZ: 45 },
{ translateY: 100, scale: 1.2 }
], 800);
Каждый элемент массива интерпретируется как отдельный шаг, где трансформации комбинируются внутри шага и затем переходят в следующий.
Функция сглаживания влияет на все трансформации одновременно. При комбинировании нескольких параметров easing применяется к общей интерполяции матрицы, а не к отдельным свойствам.
Velocity(element, {
translateX: 300,
rotateZ: 180,
scale: 0.5
}, {
duration: 1000,
easing: "easeInOutQuad"
});
Это создаёт синхронную кривую изменения всех параметров, формируя единый визуальный ритм движения.
При смешивании явных CSS transform и Velocity-анимаций
происходит приоритет последнего вычисления. Если элемент уже имеет
установленный transform, Velocity.js считывает его, декомпозирует и
затем добавляет новые компоненты.
Это позволяет безопасно комбинировать анимации даже при внешнем вмешательстве стилей:
element.style.transform = "translateX(50px) rotate(10deg)";
Velocity(element, {
translateY: 100,
rotateZ: 45
}, 600);
Комбинирование трансформаций в Velocity.js строится на трёх уровнях:
Каждый уровень влияет на итоговое поведение трансформаций, формируя единый механизм визуальных преобразований без необходимости ручного управления промежуточными состояниями.