В Motion One анимация строится вокруг изменения отдельных CSS-свойств во времени. Основная идея заключается в том, что вместо сложных конфигураций и громоздких API разработчик задаёт минимальный набор параметров: элемент, свойство и конечное значение. Библиотека берёт на себя вычисление промежуточных кадров, интерполяцию значений и управление временем.
Анимация одного свойства — это фундаментальная операция, на которой строятся более сложные эффекты. Именно она позволяет понять поведение Motion One на базовом уровне: как изменяются стили, как работает синхронизация времени и каким образом формируются переходы.
Основной инструмент работы — функция animate.
Структура вызова:
import { animate } from "motion";
animate(
элемент,
{ свойство: конечноеЗначение },
параметрыАнимации
);
Минимальный вариант:
animate(
".box",
{ opacity: 1 }
);
В этом случае:
.box — целевой элементopacity: 1 — конечное значение свойстваЕсли элемент уже имеет другое значение opacity,
библиотека автоматически определяет стартовое состояние и выполняет
плавный переход.
Одним из самых простых и часто используемых примеров является управление прозрачностью.
animate(
".box",
{ opacity: 0 }
);
Поведение:
opacity считывается из computed
styles0Анимация может быть инвертирована:
animate(
".box",
{ opacity: 1 }
);
Motion One поддерживает свойства с единицами измерения. Например,
px, %, em.
animate(
".box",
{ width: "300px" }
);
Переход может происходить от любого исходного значения:
animate(
".box",
{ width: "50%" }
);
При анимации размеров происходит:
Таким образом:
100px → 300px
становится последовательностью промежуточных значений:
100px → 140px → 190px → 240px → 300px
Motion One поддерживает анимацию цвета в различных форматах:
#ff0000)rgb(255, 0, 0))rgba(255, 0, 0, 1))Пример:
animate(
".box",
{ backgroundColor: "#ff0000" }
);
Библиотека:
Пример перехода:
rgb(0, 0, 0) → rgb(255, 0, 0)
Результирующая интерполяция:
Одним из наиболее производительных способов анимации является
использование transform. В отличие от layout-свойств,
transform не вызывает перерасчёт макета страницы.
animate(
".box",
{ x: 200 }
);
В Motion One свойство x является сокращением для:
transform: translateX(...)
animate(
".box",
{ y: 150 }
);
Основной механизм Motion One основан на числовой интерполяции.
Формула:
value = start + (end - start) * progress
Где:
start — начальное значениеend — конечное значениеprogress — прогресс анимации (0 → 1)Пример:
start = 0
end = 100
progress = 0.5
value = 0 + (100 - 0) * 0.5 = 50
Параметр duration задаёт время выполнения анимации в
миллисекундах.
animate(
".box",
{ opacity: 0 },
{ duration: 1000 }
);
Easing определяет кривую изменения прогресса анимации.
Пример:
animate(
".box",
{ x: 300 },
{ easing: "ease-in-out" }
);
Без easing (линейная интерполяция):
progress = t
С easing:
progress = f(t)
Где f(t) — функция кривой, изменяющая скорость
движения.
Motion One автоматически определяет стартовое значение свойства.
animate(
".box",
{ opacity: 0 }
);
Если элемент уже имеет:
opacity: 0.8;
то интерполяция будет:
0.8 → 0
При этом разработчик не обязан явно указывать начальное значение.
При повторном вызове animate для одного и того же
свойства происходит:
Пример:
animate(".box", { x: 100 });
animate(".box", { x: 300 });
Фактически первая анимация прерывается и заменяется новой.
Motion One поддерживает относительные изменения:
animate(
".box",
{ x: "+=100" }
);
Если текущее x = 200, то:
200 + 100 = 300
Анимация может двигаться в обратном направлении:
animate(
".box",
{ x: -200 }
);
Также возможны переходы через ноль:
150 → -150
Интерполяция при этом остаётся линейной по числовой оси.
Motion One способен интерполировать значения с одинаковыми единицами:
animate(
".box",
{ width: "50vw" }
);
Если стартовое значение также в vw, происходит прямое
числовое сравнение.
При несовпадении единиц:
При всей универсальности существуют ограничения:
Анимация одного свойства является наиболее дешёвым сценарием для браузера при правильном выборе свойства.
Наиболее оптимальные:
Менее оптимальные:
Причина:
Если свойство не задано в CSS, Motion One:
Пример:
animate(".box", { opacity: 1 });
Если opacity не задан:
opacity = 1 (default)
Во время анимации Motion One:
Это обеспечивает предсказуемость результата независимо от внешних стилей.
Несколько анимаций одного свойства на разных элементах выполняются независимо:
animate(".box1", { x: 100 });
animate(".box2", { x: 200 });
Каждый элемент получает собственный timeline и интерполяцию.
Если во время анимации меняется DOM или стиль: