В библиотеке anime.js единицы измерения играют ключевую роль при анимации свойств, связанных с размерами, позиционированием и трансформациями. Поддержка различных единиц позволяет гибко управлять поведением элементов без необходимости ручных пересчётов.
anime.js автоматически интерпретирует значения и, при необходимости, выполняет преобразование между единицами. Это особенно важно при анимации CSS-свойств, где разные значения могут быть заданы в различных системах измерения.
anime.js работает с большинством стандартных CSS-единиц:
Абсолютные единицы:
px — пиксели (наиболее часто используемая единица)pt, cm, mm, in —
используются редко, но поддерживаютсяОтносительные единицы:
% — проценты относительно родительского элементаem — относительно размера шрифта текущего элементаrem — относительно корневого размера шрифтаУглы:
deg — градусыrad — радианыturn — оборотыВременные значения (в контексте CSS):
s, ms — используются в параметрах времени
анимации, но не как анимируемые свойстваПри указании значений anime.js автоматически определяет единицу измерения:
anime({
targets: '.box',
translateX: 250 // интерпретируется как 250px
});
Если единица не указана, по умолчанию используется px
для свойств, связанных с размерами и позиционированием.
Для избежания неоднозначностей рекомендуется явно указывать единицы:
anime({
targets: '.box',
width: '50%',
translateX: '10rem',
rotate: '1turn'
});
Это особенно важно при работе с адаптивными интерфейсами.
anime.js умеет плавно интерполировать значения между разными состояниями:
anime({
targets: '.box',
width: ['100px', '50%']
});
Внутри библиотеки происходит преобразование значений к единой системе перед вычислением промежуточных кадров. Однако такие операции могут быть менее предсказуемыми, поэтому рекомендуется использовать одинаковые единицы для начального и конечного значений.
Свойства трансформации (translate, rotate,
scale) имеют свои особенности:
translate (смещение):
anime({
targets: '.box',
translateX: '100px',
translateY: '50%'
});
rotate (вращение):
anime({
targets: '.box',
rotate: '360deg'
});
scale (масштаб):
anime({
targets: '.box',
scale: 2 // без единицы, это множитель
});
Важно учитывать, что scale не использует единицы
измерения — это относительное значение.
anime.js поддерживает относительные изменения через операторы:
+= — увеличение-= — уменьшение*= — умножениеПримеры:
anime({
targets: '.box',
translateX: '+=100px',
width: '*=1.5'
});
Относительные значения особенно полезны при создании последовательных анимаций.
Смешивание разных единиц в одной анимации возможно, но требует осторожности:
anime({
targets: '.box',
translateX: ['100px', '10%']
});
В таких случаях:
Это может привести к неожиданным результатам при изменении размеров контейнера во время анимации.
При работе с трансформациями важно учитывать
transform-origin:
anime({
targets: '.box',
rotate: '180deg',
transformOrigin: '50% 50%'
});
Здесь используются проценты, определяющие точку вращения относительно элемента.
Хотя цвета не являются единицами измерения в классическом смысле, anime.js обрабатывает их аналогично:
anime({
targets: '.box',
backgroundColor: ['#ff0000', 'rgb(0, 0, 255)']
});
Поддерживаются форматы:
Внутри происходит преобразование в единое представление для интерполяции.
Некоторые свойства не требуют единиц:
anime({
targets: '.box',
opacity: 0.5,
scale: 1.2,
zIndex: 10
});
Такие значения интерпретируются как абстрактные числа.
Единицы можно комбинировать с функциями:
anime({
targets: '.box',
translateX: (el, i) => `${i * 20}px`
});
Функция должна возвращать строку с корректной единицей.
anime.js умеет извлекать текущие значения элементов:
anime({
targets: '.box',
translateX: ['0px', '100px']
});
Если начальное значение не указано, оно будет считано из computed styles.
Проценты (%) зависят от контекста:
width, height — относительно
родителяtranslate — относительно самого элементаanime({
targets: '.box',
translateX: '100%' // сдвиг на ширину самого элемента
});
Это поведение соответствует CSS-спецификации.
Для оптимальной производительности рекомендуется:
transform вместо
top/leftpx или %em,
rem) в динамических анимацияхПример оптимального подхода:
anime({
targets: '.box',
translateX: '200px'
});
Внутренний механизм работы:
Этот процесс скрыт от разработчика, но понимание его важно для предсказуемого поведения анимаций.
Несовместимые единицы:
anime({
targets: '.box',
width: ['100px', 'auto'] // ошибка
});
Отсутствие единицы:
anime({
targets: '.box',
width: 100 // может работать не всегда корректно
});
Смешивание контекстов:
anime({
targets: '.box',
translateX: ['50%', '100px']
});
auto в анимацияхtransform-свойстваanime({
targets: '.card',
translateX: ['0%', '100%'],
rotate: ['0deg', '1turn'],
scale: [1, 1.5],
duration: 2000,
easing: 'easeInOutQuad'
});
Здесь одновременно используются:
anime.js корректно объединяет их в одну анимацию, обеспечивая плавность переходов.