Функция *easing* в CSS управляет ускорением и замедлением анимации по ходу её длительности. Ключевые слова ease, ease-in, ease-out и ease-in-out - это сокращения для четырёх конкретных кривых. Всё остальное задаёт функция cubic-bezier() - четыре числа и собственная кривая.
Эти четыре числа - координаты двух контрольных точек (x1, y1, x2, y2). Писать их вручную неудобно: маленькие изменения дают большие визуальные эффекты, а небольшой перебор приводит к *пружинистому* движению, которое в числах не считывается. Визуальный редактор позволяет перетаскивать маркеры и сразу видеть отклик - это намного быстрее, чем подбирать десятые.
Редактор Coddy рисует кривую в реальном времени, анимирует тестовый шарик с вашим easing и предлагает пресеты под самые ходовые сценарии: CSS-ключевые слова, *Material standard*, упругий bouncy-out, anticipate с овершутом. Скопируйте строку cubic-bezier() и вставьте в CSS - всё работает в браузере.
Что важно знать про cubic-bezier-easing
На графике откладывается *прогресс* против *времени*. Время слева направо (0 → 1); прогресс снизу вверх (0 → 1). Прямая диагональ - это linear, равный прогресс на единицу времени.
Координаты X обоих маркеров ограничены 0..1. Y может уйти ниже 0 или выше 1 - так получаются упругие, anticipate и overshoot-кривые (анимация уходит за цель или сперва идёт в обратную сторону).
*Ease-out*-кривые (большая часть прогресса - в начале) ощущаются как быстрые и отзывчивые - подходят для появлений и реакций кнопок. *Ease-in* (прогресс в конце) ощущается вяло - обычно плохо в UI, годится для скрытий.
Как спроектировать cubic-bezier
1
Начните с пресета
Выберите пресет, близкий к нужному ощущению. *Material standard* и *Bouncy out* - хорошие точки старта для UI; *ease-out* - безопасный дефолт для появлений.
2
Тяните два маркера
Цветные кружки - контрольные точки. Тяните первый, чтобы тонко настроить *старт* анимации, второй - её *финал*. Перетаскивание маркера выше верхнего края даёт overshoot.
3
Выберите длительность и повторите
Подберите реалистичную длительность для реальной анимации. UI-переходы обычно 150–300 мс, акцентные движения 400–600 мс. Нажмите *Replay*, чтобы перезапустить превью.
4
Доведите числами
Для точных значений вводите X1/Y1/X2/Y2. Y может выходить за 0..1, X всегда остаётся в 0..1.
5
Скопируйте CSS
Нажмите *Скопировать*, чтобы получить полную правило transition. Перенесите в свою таблицу стилей и замените transform на нужное свойство.
Шпаргалка по cubic-bezier
Самые ходовые easings и их cubic-bezier-значения. Четыре ключевых слова - это псевдонимы конкретных кривых.
Easing
Значения cubic-bezier
Когда использовать
ease
(0.25, 0.1, 0.25, 1)
Дефолт transition - мягко, но универсально
linear
(0, 0, 1, 1)
Равномерная скорость - обычно плохо в UI, хорошо для лоадеров
ease-in
(0.42, 0, 1, 1)
Медленный старт, быстрый финал - лучше для скрытий
ease-out
(0, 0, 0.58, 1)
Быстрый старт, медленный финал - лучше для появлений и реакций
ease-in-out
(0.42, 0, 0.58, 1)
Симметричный - хорош для переключений вперёд-назад
Отрицательный Y1 ненадолго уводит анимацию в *противоположную* сторону, прежде чем она пойдёт к цели. Приём из классической анимации - лёгкая антиципация делает основное движение более осмысленным.
Типичные ошибки easing
Использовать ease-in для появлений. Он медленно стартует и быстро заканчивает - противоположность отзывчивости. Для появлений берите ease-out.
Выбирать linear для UI как «нейтральный». Равномерное движение выглядит механически; уместно для прогрессбаров и лоадеров, не для всего остального.
Перебарщивать с overshoot везде. Упругие easings - это акцент, а не дефолт; если они повсюду, движение воспринимается хаотично.
Часто задаваемые вопросы про cubic-bezier
Что означают четыре числа в cubic-bezier()?
Это координаты x и y двух контрольных точек: cubic-bezier(x1, y1, x2, y2). Первая точка формирует *начало*, вторая - *конец*. X всегда в диапазоне 0..1 (время); Y может выходить за 0..1 для эффектов overshoot/anticipate (прогресс).
Какой easing выбрать для UI-анимаций?
Для появлений и реакций (hover, focus) - *ease-out* или стандартная кривая Material cubic-bezier(0.4, 0, 0.2, 1). Для скрытий уместен *ease-in*. Избегайте *linear*, если только не рисуете прогресс.
В чём разница между ease и ease-out?
Оба замедляются к концу, но ease мягко стартует. ease-out сразу разгоняется и тормозит - это *немедленное* движение и ощущается отзывчивее, чем ease.
Как сделать упругую анимацию на CSS?
Тяните второй маркер выше верха канваса (Y2 > 1). Например, cubic-bezier(0.18, 0.89, 0.32, 1.28) перелетает цель примерно на 28 % и оседает. Для нескольких отскоков нужны @keyframes или библиотека spring-физики - cubic-bezier даёт только один overshoot.
Можно ли использовать cubic-bezier с @keyframes?
Да. В виде animation-timing-function, в шортхенде animation или на каждом keyframe отдельно. Для сложных многоэтапных движений можно задавать разный easing между каждой парой ключевых кадров.