Кадровая анимация
Оригинальное название: keyframe animation
Коротко
Анимация, которая описывается набором ключевых состояний — кадров с заданными значениями свойств, — а промежуточные значения между ними браузер вычисляет сам.
Что такое «Кадровая анимация»
Плавные эффекты в интерфейсе строятся двумя способами. CSS-переход анимирует смену одного состояния другим и запускается этой сменой — наведением, добавлением класса. Кадровая анимация самостоятельна: она может стартовать сразу при загрузке, повторяться бесконечно, проходить через несколько промежуточных точек. В CSS её задают правилом @keyframes и свойством animation.
Пример: пульсирующая кнопка
@keyframes pulse {
0%, 100% { transform: scale(1); box-shadow: 0 0 0 0 rgb(220 50 50 / .5); }
50% { transform: scale(1.05); box-shadow: 0 0 0 10px rgb(220 50 50 / 0); }
}
.cta {
animation: pulse 2s ease-in-out infinite;
}
@media (prefers-reduced-motion: reduce) {
.cta { animation: none; }
}
Каждая точка в процентах — ключевой кадр; слова from и to — синонимы 0% и 100%. Между кадрами браузер рассчитывает значения по функции плавности.
Параметры animation
animation-durationиanimation-delay— длительность и задержка;animation-iteration-count— число повторов илиinfinite;animation-direction— значениеalternateпроигрывает анимацию туда и обратно;animation-fill-mode—forwardsоставляет элемент в состоянии последнего кадра, иначе после окончания он вернётся к исходным стилям;animation-play-state— пауза, например при наведении.
Как избежать рывков
Плавнее всего анимируются transform и opacity: браузер может обработать их на этапе композитинга, не пересчитывая раскладку. Анимация width, top или margin заставляет пересчитывать геометрию на каждом кадре и на слабых телефонах дёргается. Людям, которым движение на экране доставляет дискомфорт, система позволяет включить уменьшение движения, — медиазапрос prefers-reduced-motion в примере отключает пульсацию для них. Из JavaScript похожую анимацию запускают методом element.animate(), передав массив кадров и параметры, — это Web Animations API.

