Easing-функции определяют характер изменения значения во времени. Вместо линейного движения от начального к конечному значению используется математическая кривая, задающая ускорение, замедление или комбинированное поведение.
Базовая модель анимации опирается на нормализованное время:
t = 0 — начало анимацииt = 1 — завершениеeasing(t) → преобразованное значение прогрессаКлючевая идея: easing изменяет не саму анимацию, а распределение прогресса.
Линейная функция не искажает прогресс:
linear: t => t
Особенности:
Группа степенных функций увеличивает степень кривой:
Поведение:
Типовые формы:
quadIn: t => t * t
quadOut: t => t * (2 - t)
Обобщённая логика:
Основана на синусоиде:
sineIn: t => 1 - Math.cos((t * Math.PI) / 2)
sineOut: t => Math.sin((t * Math.PI) / 2)
Характеристики:
Функция окружности:
circIn: t => 1 - Math.sqrt(1 - t * t)
circOut: t => Math.sqrt(1 - (t - 1) * (t - 1))
Особенности:
Экспоненциальное изменение скорости:
expoIn: t => Math.pow(2, 10 * (t - 1))
expoOut: t => 1 - Math.pow(2, -10 * t)
Поведение:
Имитация пружины:
elasticOut: t =>
Math.sin((-13 * (Math.PI / 2)) * (t + 1)) *
Math.pow(2, -10 * t) + 1
Свойства:
Функция «оттягивания»:
backOut: t => {
const s = 1.70158
return (t - 1) * (t - 1) * ((s + 1) * (t - 1) + s) + 1
}
Особенности:
Модель отскока:
bounceOut: t => {
if (t < 1 / 2.75) {
return 7.5625 * t * t
} else if (t < 2 / 2.75) {
return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75
} else if (t < 2.5 / 2.75) {
return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375
} else {
return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375
}
}
Поведение:
Практически каждая базовая функция имеет три вариации:
Пример для cubic:
cubicIn: t => t * t * t
cubicOut: t => 1 + (--t) * t * t
cubicInOut: t =>
t < 0.5
? 4 * t * t * t
: 1 + (--t) * (2 * t) * (2 * t)
Логика InOut:
Дискретная анимация:
steps: (steps, direction = 'end') => t => {
const scaled = steps * t
return direction === 'end'
? Math.floor(scaled) / steps
: Math.ceil(scaled) / steps
}
Характеристики:
Все встроенные функции можно привести к общей модели:
f: [0, 1] → [0, 1]
Свойства:
Исключения:
Для перемещения по координате:
animate({
from: 0,
to: 300,
ease: cubicOut
})
Результат:
animate({
from: 0.5,
to: 1,
ease: backOut
})
Особенности:
animate({
from: 0,
to: 1,
ease: sineInOut
})
Поведение:
Easing часто используется совместно с:
Пример гибридной модели:
Базовая система позволяет создавать пользовательские функции:
const customEase = t =>
t < 0.5
? 2 * t * t
: -1 + (4 - 2 * t) * t
Принцип: