В Motion One наиболее эффективно анимируются свойства, влияющие на
композиционный слой браузера. Главную роль здесь играет
transform, поскольку он не вызывает перерасчёт layout и не
приводит к дорогостоящим reflow-операциям.
Ключевые функции transform:
translateX, translateY,
translateZscale, scaleX, scaleYrotate, rotateZ, rotateX,
rotateYskewX, skewYПример логики работы в Motion One:
animate(element, {
transform: "translateX(200px) rotate(45deg) scale(1.2)"
})
Внутри Motion One эти значения разбиваются на отдельные трансформации, что позволяет библиотеке интерполировать каждую компоненту независимо. Это обеспечивает плавность даже при сложных комбинированных анимациях.
Особое значение имеет порядок трансформаций. В CSS он критичен, и Motion One сохраняет предсказуемость вычислений, следуя спецификации: сначала масштабирование, затем поворот, затем перемещение.
Свойство opacity относится к числу самых дешёвых для
анимации. Оно обрабатывается на уровне композитора, что позволяет
избежать перерасчёта геометрии элементов.
Motion One интерполирует значение от 0 до 1:
animate(element, {
opacity: [0, 1]
})
Переходы через промежуточные значения не требуют дополнительных вычислений layout или paint, поэтому opacity часто используется в комбинации с transform для построения сложных сцен появления и исчезновения элементов.
Важно учитывать, что изменение opacity затрагивает весь элемент целиком, включая дочерние узлы. Это делает его удобным для общих эффектов, но непригодным для частичной прозрачности отдельных слоёв без структурного разделения DOM.
Анимация размеров относится к более затратным операциям. Свойства
width и height вызывают перерасчёт layout, что
может снижать производительность при большом количестве элементов.
Тем не менее Motion One поддерживает их анимацию напрямую:
animate(element, {
width: ["100px", "300px"],
height: ["50px", "200px"]
})
Такие анимации следует рассматривать как layout-driven. Каждый кадр требует пересчёта геометрии, что особенно заметно при сложной DOM-структуре.
Альтернативный подход — замена геометрических свойств на transform:
animate(element, {
scaleX: [1, 2],
scaleY: [1, 2]
})
Этот вариант не изменяет поток документа и остаётся производительным.
Motion One поддерживает интерполяцию цветовых значений в различных форматах:
Наиболее часто анимируются:
background-colorcolorborder-colorfill и stroke (для SVG)Пример:
animate(element, {
backgroundColor: ["#000000", "#ff6600"],
color: ["rgb(0,0,0)", "rgb(255,255,255)"]
})
Интерполяция выполняется через преобразование цветов в линейное пространство, что позволяет получать равномерные переходы без резких скачков яркости.
SVG-свойства fill и stroke ведут себя
аналогично, но дополнительно учитывают особенности векторной графики,
где каждый контур может иметь независимую стилизацию.
Свойство filter открывает доступ к ряду графических
эффектов:
Motion One позволяет анимировать составные фильтры:
animate(element, {
filter: [
"blur(0px) brightness(1)",
"blur(6px) brightness(1.5)"
]
})
Особенность filter заключается в том, что он может быть вычислительно дорогим. Особенно это касается blur, который требует значительных ресурсов GPU или CPU в зависимости от реализации браузера.
Комбинирование нескольких фильтров усиливает нагрузку, поэтому интерполяция сложных значений требует осторожного проектирования сцен.
box-shadow позволяет создавать иллюзию глубины и
освещения. Motion One поддерживает анимацию всех компонентов тени:
Пример:
animate(element, {
boxShadow: [
"0px 0px 0px rgba(0,0,0,0)",
"0px 10px 30px rgba(0,0,0,0.3)"
]
})
Интерполяция тени включает одновременное изменение нескольких параметров, что требует аккуратного расчёта промежуточных состояний. Особенно важно учитывать альфа-канал, так как он влияет на восприятие глубины.
Свойство clip-path используется для создания сложных
переходов формы элементов. Motion One поддерживает базовые
геометрические функции:
Пример:
animate(element, {
clipPath: [
"circle(0% at 50% 50%)",
"circle(100% at 50% 50%)"
]
})
Анимация clip-path требует пересчёта геометрии отрисовки, что делает её более затратной по сравнению с transform и opacity. Однако она остаётся ключевым инструментом для сцен, где требуется изменение формы, а не только положения.
Motion One активно используется для SVG-анимаций, особенно для эффекта прорисовки линий.
Основные свойства:
stroke-dashoffsetstroke-dasharraypathLength (в некоторых сценариях)Пример:
animate(path, {
strokeDashoffset: [1, 0]
})
Такой подход создаёт эффект постепенного рисования контура. SVG-анимации обладают высокой точностью, поскольку работают напрямую с векторной моделью.
Motion One поддерживает привязку анимаций к прокрутке, где значения CSS-свойств могут изменяться в зависимости от прогресса scroll-сцены.
Чаще всего используются:
Пример логики:
animate(element, {
opacity: [0, 1],
transform: ["translateY(50px)", "translateY(0px)"]
}, {
timeline: scroll(element)
})
Такие анимации позволяют связывать визуальные изменения с физическим движением страницы, сохраняя синхронизацию между состоянием интерфейса и прокруткой.
Не все CSS-свойства одинаково подходят для анимации. Некоторые из них неизбежно вызывают reflow:
Motion One позволяет задавать такие анимации, но их использование требует понимания последствий.
Наиболее критичные моменты:
CSS custom properties (--variables) открывают
дополнительный слой гибкости. Motion One может интерполировать их как
числовые или цветовые значения:
animate(element, {
"--progress": [0, 1]
})
Далее переменная может использоваться внутри CSS:
.element {
transform: scale(var(--progress));
}
Такой подход позволяет разделять вычислительную и визуальную части анимации, снижая нагрузку на JavaScript и повышая переиспользуемость стилей.
Все CSS-свойства, используемые в Motion One, условно делятся на три группы:
1. Композиционные (наиболее быстрые) transform, opacity
2. Визуальные (средняя нагрузка) color, background, filter, box-shadow, clip-path
3. Layout-driven (наиболее дорогие) width, height, margin, padding, position
Понимание принадлежности свойства к одной из групп определяет поведение анимации, её плавность и влияние на производительность интерфейса.