Гид по технологиям

Анимация в CSS с @keyframes — практическое руководство

6 min read Front-end Обновлено 31 Dec 2025
Анимация в CSS с @keyframes — руководство
Анимация в CSS с @keyframes — руководство

Пример анимированной кнопки: превращение прямоугольной зелёной кнопки в синюю круглую

Источник изображения: Josh Riemer / Unsplash

Что такое анимация в CSS и зачем она нужна

Анимация в CSS позволяет оживить интерфейс без JavaScript: плавные переходы, визуальная обратная связь и микроанимации повышают понятность и эстетичность страницы. Ключевой механизм — правило @keyframes, которое описывает, как изменяются CSS-свойства во времени.

Определение термина: @keyframes — правило CSS, задающее набор «ключевых кадров» (состояний) элемента и его внешний вид в эти моменты времени.

Короткая памятка: анимируются свойства, которые браузер может композитить (как transform и opacity) — это быстрее и дешевле по ресурсам. Свойства вроде width/height или top/left вызывают перерасчёт макета и могут приводить к тормозам.

Какие свойства обычно анимируют

  • width
  • height
  • position (top/left/right/bottom)
  • color, background-color
  • opacity
  • transform (translate, scale, rotate)

Важно: предпочтительно анимировать transform и opacity для производительности. Если нужно изменить форму, чаще используйте border-radius и transform, а не перерасчёт layout.

Структура @keyframes — пример и объяснение

@keyframes описывает состояние элемента в ключевые моменты. Существует два простых варианта записи: специальные ключевые слова from/to или проценты (0%–100%).

Пример структуры:

@keyframes identifier {
  from {
    /* откуда начинается анимация */
  }
  to {
    /* куда приходит анимация */
  }
}

Или эквивалент с процентами:

@keyframes identifier {
  0% {
    /* начальное состояние */
  }
  50% {
    /* промежуточное состояние */
  }
  100% {
    /* конечное состояние */
  }
}

Практическая подсказка: используйте промежуточные ключевые кадры для сложных эффектов (удар, подпрыгивание, «bounce»), а для простых преобразований хватит from/to.

Пример: анимация кнопки — шаг за шагом

Задача: сделать зелёную прямоугольную кнопку, которая превращается в синюю круглую.

HTML + CSS пример (локализованные комментарии):






Animation






Пояснение: свойство animation связывает набор ключевых кадров (clickButton) с элементом и задаёт, как именно и когда будет происходить переход.

Пять основных подсвойств animation

На практике достаточно знать пять подсвойств, чтобы управлять поведением анимации:

  • animation-name — имя @keyframes
  • animation-duration — длительность (например, 2s, 500ms)
  • animation-timing-function — функция ускорения (ease, linear, ease-in, ease-out и пр.)
  • animation-delay — задержка до старта
  • animation-iteration-count — число повторов (число или infinite)

animation-name

Обязательное логическое связующее: без имени анимации браузеру некуда «подключить» @keyframes, и всё остальное не сработает.

animation-duration

Определяет, сколько времени займёт переход от начального состояния к конечному.

Пример: 5s — анимация займёт 5 секунд.

animation-delay

Добавляет паузу перед началом анимации. Это полезно, если страница может загружаться долго, и вы хотите подождать.

Пример: 4s — анимация начнётся через 4 секунды после загрузки/вставки элемента.

animation-iteration-count

Сколько раз повторять анимацию. Можно задать число (1, 2, 3…) или infinite.

Пример: infinite — цикл будет повторяться постоянно.

animation-timing-function

Функция, описывающая скорость анимации во времени. Часто используемые значения:

  • ease-in — замедление в начале (ускорение)
  • ease-out — замедление в конце
  • ease-in-out — медленнее в начале и в конце
  • linear — равномерная скорость

Совет: для более контролируемых эффектов используйте cubic-bezier() или steps() при необходимости.

Сокращённая запись animation

Вместо явного перечисления всех подсвойств можно использовать краткую запись:

.btn{
  animation: clickButton 5s ease-in-out 4s infinite;
}

Порядок в сокращённой записи обычно: name duration timing-function delay iteration-count direction fill-mode play-state. Необязательные параметры можно опускать, браузер подставит значения по умолчанию.

Практические рекомендации и лучшие практики

  • Анимируйте transform и opacity, а не width/height или position, если нужна производительность.
  • Для сложных последовательностей используйте ключевые кадры с промежуточными шагами (например, 0%, 30%, 60%, 100%).
  • Добавляйте prefers-reduced-motion для пользователей с ограниченной переносимостью анимаций.
  • Используйте will-change с осторожностью — оно подготавливает элемент к изменению, но может повышать потребление памяти.
  • Тестируйте на мобильных устройствах: длительные анимации могут негативно влиять на батарею.

Пример prefers-reduced-motion:

@media (prefers-reduced-motion: reduce) {
  .btn {
    animation: none;
  }
}

Важно: уважайте настройки пользователя — если в системе включено «сократить движение», остановите или упростите анимации.

Когда анимация на @keyframes не подойдёт (контр-примеры)

  • Когда нужно анимировать только при наведении или однократном действии — подойдёт CSS transition.
  • Для сложной временной синхронизации или управления во время выполнения (пауза/перезапуск) лучше использовать Web Animations API или JavaScript.
  • Если анимация затрагивает layout и ведёт к багам на старых устройствах — рассмотрите анимацию с position: absolute и transform.

Альтернативные подходы

  • CSS transition — проще и подходит для «от/до» при взаимодействии.
  • Web Animations API — даёт программный контроль (пауза, обратный проигрыш, синхронизация нескольких анимаций).
  • JS-библиотеки (например, GSAP) — дополнительные возможности для комплексных сцен и кроссбраузерной поддержки; но это внешние зависимости.

Ментальные модели и эвристики

  • Разделяй и властвуй: отделяйте визуальные эффекты (transform, opacity) от изменений структуры (width/height).
  • Простое правило 80/20: 80% эффектов решаем transform и opacity, остальные 20% требуют манипуляций с layout.
  • Думайте в кадрах: сначала набросайте ключевые кадры (0%, 50%, 100%), затем доводите timing-function и задержки.

Таблица сравнения: transition vs animation vs Web Animations API

  • Transition: простая «от–до» реакция на изменение состояния (hover, class). Легко, но ограничено.
  • Animation (@keyframes): независимая анимация с собственным временем жизни, повторениями и сложной синхронизацией.
  • Web Animations API: программный контроль, пауза/перезапуск, точная синхронизация, но требует JS.

Чек-листы по ролям

Для разработчика:

  • Проверил производительность (chrome devtools — вкладка Performance).
  • Использовал transform/opacity где возможно.
  • Добавил prefers-reduced-motion.

Для дизайнера:

  • Определил ключевые кадры и длительности.
  • Убедился, что анимация не мешает читаемости.

Для QA:

  • Проверил поведение при разных скоростях сети и на мобильных.
  • Проверил взаимодействие с клавиатурой и screen-reader.

Набор полезных сниппетов / cheat sheet

  • Короткая запись animation: animation: ;
  • Остановка анимации: animation-play-state: paused;
  • Задание fill-mode (сохранение конечного состояния): animation-fill-mode: forwards;

Совместимость и миграция

Современные браузеры поддерживают @keyframes и animation без префиксов. Ранее использовались -webkit- префиксы для старых версий Safari/Chrome. Если вам нужна поддержка очень старых браузеров, добавьте префиксы:

@-webkit-keyframes example { /* ... */ }
@keyframes example { /* ... */ }

Однако для современного кодового пула префиксы обычно не требуются.

Примеры тест-кейсов (acceptance)

  • Кнопка должна начать анимацию через заданную задержку.
  • При infinite анимация повторяется как минимум три раза за наблюдаемый период.
  • При prefers-reduced-motion анимация отключена.

Мини-методология для введения анимаций в проект (SOP)

  1. Определите цель анимации (внимание, обратная связь, украшение).
  2. Нарисуйте ключевые кадры и выберите длительность.
  3. Реализуйте @keyframes и привяжите animation к элементам.
  4. Тестируйте производительность и доступность.
  5. Итеративно улучшайте, опираясь на метрики UX и фидбек.

FAQ

В: Что делать, если анимация тормозит на мобильных?

О: Уменьшите количество одновременно анимируемых элементов, используйте transform/opacity и уберите лишние repaint’ы; профильте с DevTools.

В: Как паузить/возобновлять анимацию?

О: Используйте animation-play-state: paused/ running или управляйте через JavaScript (элемент.style.animationPlayState).

В: Как вернуть элемент в финальное состояние после анимации?

О: Примените animation-fill-mode: forwards, тогда элемент сохранит стили из последнего ключевого кадра.

JSON-LD (FAQ)

Секция FAQ ниже представлена в формате разметки JSON-LD в метаданных страницы.

Краткое резюме

  • @keyframes задаёт набор ключевых состояний; animation связывает их с элементом.
  • Предпочитайте transform и opacity для производительности.
  • Используйте сокращённую запись animation для компактности и воспринимайте prefers-reduced-motion ради доступности.

Источник изображения: Josh Riemer / Unsplash

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Резервное копирование Secure Folder на Samsung
Android.

Резервное копирование Secure Folder на Samsung

Secure note в Bitwarden — как безопасно хранить данные
Безопасность

Secure note в Bitwarden — как безопасно хранить данные

Установка сторонних приложений на Android TV
Гайд

Установка сторонних приложений на Android TV

Настройка диетических предпочтений в Alexa
Рецепты

Настройка диетических предпочтений в Alexa

Храните рецепты в Google Sheets
Кулинария

Храните рецепты в Google Sheets

ChatGPT для здоровых рецептов и кулинарии
Кулинария

ChatGPT для здоровых рецептов и кулинарии