Функция плавности

Оригинальное название: easing

Коротко

Кривая, которая задаёт, как значение меняется во времени во время CSS-перехода или анимации: равномерно, с разгоном, с торможением или ступеньками.

Что такое «Функция плавности»

Анимация длится, допустим, 300 миллисекунд. Функция плавности решает, какая часть пути будет пройдена к каждому моменту. При линейной функции элемент движется с постоянной скоростью и выглядит механически. Реальные предметы так не двигаются: они разгоняются и тормозят. Поэтому по умолчанию и у CSS-переходов, и у анимаций стоит функция ease — быстрый старт и мягкая остановка.

Задаётся она свойствами transition-timing-function и animation-timing-function или последним параметром в сокращённых записях. В Web Animations API то же самое передаётся опцией easing метода element.animate().

Какие бывают значения

  • linear — равномерно. Подходит для вращения индикатора загрузки и смены цвета.
  • ease-out — быстро начинается и плавно останавливается. Хорош для появления элементов: меню, всплывающей подсказки.
  • ease-in — разгон к концу. Уместен для исчезновения: элемент «уходит» со сцены.
  • ease-in-out — плавно с обеих сторон, для перемещений внутри экрана.
  • cubic-bezier(x1, y1, x2, y2) — своя кривая по двум опорным точкам. Координаты X должны лежать от 0 до 1, а Y может выходить за пределы — тогда элемент немного «перелетает» цель и возвращается.
  • steps(n) — скачками, без промежуточных значений: для покадровой анимации из спрайта или эффекта печатной машинки.
  • linear(…) — кусочно-линейная функция по списку точек; появилась в браузерах сравнительно недавно и позволяет описать пружину или отскок.

Пример

.menu {
  transform: translateY(-8px);
  opacity: 0;
  transition: transform .25s cubic-bezier(.2, .8, .2, 1),
              opacity .2s ease-out;
}
.menu.is-open { transform: none; opacity: 1; }

.loader { animation: spin 1s steps(8) infinite; }

@media (prefers-reduced-motion: reduce) {
  .menu { transition: none; }
}

Тонкости

В анимациях с ключевыми кадрами функция плавности применяется не ко всей анимации, а к каждому отрезку между соседними кадрами. Анимация из пяти кадров с ease будет пять раз разгоняться и тормозить — часто это и есть причина «дёрганого» движения. Если нужна одна кривая на весь путь, функцию задают в самих кадрах или сокращают их число.

Подбирать кривую удобнее визуально: в инструментах разработчика Chrome и Firefox рядом с cubic-bezier есть редактор, где точки можно тянуть мышью и сразу видеть результат. И не забывайте про пользователей, которые отключили анимации в системе: медиафункция prefers-reduced-motion позволяет убрать движение для них.

Обновлено:

Все термины раздела «Frontend»

Что будем искать? Например,Продвижение