Функции плавности определяют, как изменяется скорость анимации во времени. Вместо линейного движения от начального значения к конечному используется математическая кривая, которая управляет ускорением и замедлением. Это ключевой механизм, который делает интерфейсы визуально естественными и физически правдоподобными.
Любая анимация описывается изменением значения параметра ( x ) во времени ( t ). Без функции плавности зависимость линейна:
x(t) = t
При использовании easing вводится функция:
x(t) = f(t)
где ( f(t) ) — кривая ускорения. Она преобразует равномерный прогресс в нелинейный.
Функции плавности влияют на восприятие скорости и веса объектов:
В Motion One easing является стандартным параметром всех анимационных
вызовов и интегрирован в систему animate.
Самый простой вариант:
linear(t) = t
Движение происходит с постоянной скоростью без ускорения и замедления.
Используется в случаях:
easeIn(t)
Движение начинается медленно и ускоряется к концу. Математически это часто степенная функция:
t^2, t^3, t^4
Характеристики:
easeOut(t)
Противоположность ease-in:
Используется для:
Комбинация двух режимов:
easeInOut(t)
Эта кривая наиболее универсальна и часто используется по умолчанию.
Большинство easing-функций в Motion One основаны на кубических кривых Безье:
f(t) = cubic-bezier(p0, p1, p2, p3)
Где:
Пример:
import { animate } from "motion";
animate(
".box",
{ x: 300 },
{ ease: "cubic-bezier(0.42, 0, 0.58, 1)" }
);
Особенности:
В Motion One поддерживаются предустановленные значения:
lineareaseease-inease-outease-in-outПример использования:
animate(
".box",
{ opacity: 1, y: 0 },
{ duration: 0.6, ease: "ease-out" }
);
Каждое значение соответствует заранее определённой кривой.
Отдельный класс функций основан на физике пружины. Вместо математической кривой используется модель:
F = -kx - cv
где:
В Motion One это реализовано через type: "spring".
animate(
".box",
{ x: 400 },
{
type: "spring",
stiffness: 120,
damping: 20
}
);
Характер движения:
Spring-анимации применяются в интерфейсах, ориентированных на естественное поведение объектов.
| Тип | Характер движения | Использование |
|---|---|---|
| linear | равномерное | прогресс-индикаторы |
| ease | сбалансированное | универсальные UI |
| cubic-bezier | настраиваемое | кастомные эффекты |
| spring | физическое | интерактивные элементы |
Motion One позволяет передавать собственные функции:
animate(
".box",
{ scale: 1.2 },
{
ease: (t) => Math.pow(t, 3)
}
);
Здесь t — нормализованное время от 0 до 1.
Особенности кастомных функций:
Пример синусоидальной плавности:
ease: (t) => Math.sin((t * Math.PI) / 2)
Функции плавности применяются не только к простым переходам, но и к сложным анимациям:
animate(
".box",
{
x: [0, 200, 100],
opacity: [0, 1, 0.5]
},
{
duration: 1,
ease: "ease-in-out"
}
);
В этом случае easing управляет распределением времени между ключевыми кадрами.
Функция плавности всегда работает в связке с временем:
Пример:
animate(".box", { x: 300 }, { duration: 0.2, ease: "ease-out" });
animate(".box", { x: 300 }, { duration: 1.2, ease: "ease-out" });
Одинаковая кривая воспринимается по-разному из-за масштаба времени.
Типовые соответствия:
При выполнении animate происходит нормализация
времени:
Этот процесс повторяется на каждом кадре через
requestAnimationFrame, обеспечивая синхронное обновление
UI.