Что это за инструмент?
cubic-bezier() — это функция времени CSS, которая определяет, как анимируемое или переходящее значение ускоряется и замедляется во времени, вместо равномерного движения. Она задаётся двумя контрольными точками — (x1, y1) и (x2, y2) — которые изгибают линию между фиксированной начальной точкой (0,0) и фиксированной конечной точкой (1,1). Значения x должны оставаться в диапазоне от 0 до 1, а значения y могут выходить за эти пределы, создавая эффекты перелёта или отскока.
Подбирать вручную четыре десятичных числа, чтобы получить ощущение, которое не будет ни резким, ни вялым, требует множества проб и ошибок. Этот инструмент заменяет угадывание прямым управлением: двигаете ползунок — видите, как изгибается кривая и соответственно движется шарик предпросмотра, — а когда движение ощущается правильно, копируете CSS.
Источник: CSS Easing Functions Level 1, W3C — спецификация, определяющая cubic-bezier() и пять именованных ключевых слов, на которых основаны пресеты этого инструмента.
Зачем его использовать?
- Живой SVG-график наглядно показывает, как ваша кривая изгибается между фиксированными начальной и конечной точками, обе контрольные точки и их рычаги отображены для ясности.
- Кнопка воспроизведения анимирует элемент предпросмотра вдоль дорожки, используя именно вашу кривую, — так вы почувствуете движение, а не просто увидите статичный график.
- Пресеты в один клик для пяти стандартных именованных функций плавности — ease, ease-in, ease-out, ease-in-out и linear — согласно спецификации CSS Easing Functions.
- Значения y могут быть меньше 0 или больше 1, что позволяет создавать эффекты перелёта/отскока, недоступные именованным ключевым словам.
- Генерирует готовый к вставке CSS для transition-timing-function — то же значение работает и для animation-timing-function.
- Полностью работает в вашем браузере — ничего из того, что вы настраиваете, никуда не загружается. Бесплатно, без регистрации.
Как использовать
- Перетащите ползунки x1/y1, чтобы задать первую контрольную точку, определяющую начало анимации.
- Перетащите ползунки x2/y2, чтобы задать вторую контрольную точку, определяющую конец анимации.
- Следите за чёрной кривой на графике — если она выгибается выше диагонали в начале, движение стартует быстро; если остаётся ниже — стартует медленно.
- Нажмите «Воспроизвести», чтобы увидеть, как элемент предпросмотра движется по дорожке, используя вашу кривую в качестве transition-timing-function.
- Попробуйте пресет (ease, ease-in, ease-out, ease-in-out, linear) как отправную точку, а затем подстройте ползунки.
- Скопируйте сгенерированный CSS и вставьте его в правило transition или animation.
Пример
Ввод
x1: 0.25, y1: 0.1, x2: 0.25, y2: 1Результат
transition-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1);Это стандартное ключевое слово CSS ease, записанное как явные контрольные точки — быстрый старт, а затем постепенное замедление к концу.
Почему значения y могут выходить за пределы 0–1
В отличие от оси x, которая представляет время и должна идти от 0 до 1, ось y представляет прогресс анимируемого значения и не имеет такого ограничения. Установка y1 ниже 0 или y2 выше 1 заставляет кривую опускаться ниже начального значения или проскакивать конечное значение перед тем, как устояться — это основа эффектов перелёта и «замаха», используемых при нажатии кнопок, появлении модальных окон и игривых микровзаимодействиях интерфейса. Ни одно из пяти именованных ключевых слов (ease, ease-in, ease-out, ease-in-out, linear) не может это создать — для этого нужен собственный cubic-bezier().
transition-timing-function против animation-timing-function
Значение cubic-bezier(), которое генерирует этот инструмент, работает одинаково в обоих свойствах. Используйте transition-timing-function, когда движение запускается изменением состояния (например, наведением или переключением класса), и animation-timing-function внутри правила анимации на основе @keyframes, когда нужно то же самое ощущение автоматически или в цикле.
Распространённые паттерны плавности
- Чёткая обратная связь интерфейса (кнопки, переключатели): держите контрольные точки близко к диагонали с лёгким смещением в сторону ease-out, например cubic-bezier(0.4, 0, 0.2, 1).
- Стандартная кривая Material Design: cubic-bezier(0.4, 0, 0.2, 1) — быстрый старт, мягкое завершение, широко используется для переходов панелей и карточек.
- Отскок/перелёт: поднимите y2 выше 1, например cubic-bezier(0.34, 1.56, 0.64, 1), для игривого эффекта появления.
- Замах перед движением: опустите y1 ниже 0, чтобы элемент слегка отодвинулся назад перед движением вперёд.
- Плавный ease-in-out для зацикленных анимаций: держите кривую почти симметричной относительно центра.
Сочетание с другими CSS-инструментами
Кривая плавности редко используется сама по себе — обычно она применяется к элементу, которому также нужны тени, скруглённые углы или градиенты. Сгенерируйте визуальное оформление другими CSS-инструментами ниже, а затем добавьте функцию времени из этого инструмента в то же правило или в объявление transition/animation.
Часто задаваемые вопросы
Что на самом деле означают четыре числа в cubic-bezier()?
Это координаты двух контрольных точек, (x1, y1) и (x2, y2), которые изгибают кривую Безье, идущую от фиксированной начальной точки (0,0) до фиксированной конечной точки (1,1). Ось x представляет прошедшее время (от 0 до 1), а ось y — насколько продвинулось анимируемое свойство, поэтому x1 и x2 должны оставаться в пределах 0–1, а y1 и y2 могут выходить за эти пределы.
В чём разница между ease, ease-in, ease-out и ease-in-out?
ease (значение по умолчанию в CSS) быстро стартует, а затем мягко замедляется. ease-in начинается медленно и ускоряется к концу — полезно для элементов, покидающих экран. ease-out начинается быстро и замедляется — полезно для элементов, появляющихся на экране. ease-in-out медленный на обоих концах и быстрее в середине, что даёт плавное симметричное ощущение.
Можно ли использовать одно и то же значение cubic-bezier() и для переходов, и для анимаций?
Да. transition-timing-function и animation-timing-function принимают абсолютно одинаковый синтаксис cubic-bezier() и дают одну и ту же кривую плавности — единственное отличие в том, к какой функции CSS (переходу или анимации на keyframes) привязана эта функция времени.
Почему моя кривая выглядит странно, когда y1 или y2 очень большие или отрицательные?
Это ожидаемо — сильный выход значений y далеко за пределы 0–1 создаёт заметный перелёт, при котором анимируемое значение значительно превышает цель перед тем, как устояться. Это допустимый и часто намеренный эффект, но если он нежелателен, верните y1 и y2 ближе к диапазону 0–1.
Своя кривая лучше, чем просто использовать именованные ключевые слова?
Не обязательно — пять ключевых слов (ease, ease-in, ease-out, ease-in-out, linear) покрывают большинство повседневных нужд и их легче читать в коде. Прибегайте к собственному cubic-bezier(), когда нужно конкретное ощущение, которое ключевые слова не дают — например, отскок, более резкий щелчок или соответствие спецификации движения конкретной дизайн-системы.