PurpleSchool — курсы программирования онлайн
  • Пути
    • Frontend React разработчик
    • Frontend Vue разработчик
    • Backend разработчик Node.js
    • Fullstack разработчик React / Node.js
    • Mobile разработчик React Native
    • Backend разработчик Golang
    • Devops инженер
    • Backend разработчик Python
  • AI для кодаНовое
  • О нас
    • Отзывы
    • Реферальная программа
    • О компании
    • Контакты
  • Иконка открытия меню
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
PurpleSchool — платформа бесплатных roadmap и курсов для разработчиков
ютуб иконка
Telegram иконка
VK иконка
VK иконка
Курсы
ГлавнаяКаталог курсовFrontendBackendFullstack
Практика
КарьераПроектыPurpleПлюс
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

PurpleSchool © 2020 -2026 Все права защищены

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развитияВопросы для собеседований
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • PurpleSchool — курсы программирования онлайн
    • AI для кодаНовое
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    Анимации в CSS: transition, @keyframes и View Transitions API

    Анимации в CSS: transition, @keyframes и View Transitions API

    Аватар автора Анимации в CSS: transition, @keyframes и View Transitions API

    Антон Ларичев

    Иконка календаря24 марта 2026
    csshtmljavascriptmiddleИконка уровня middle
    Картинка поста Анимации в CSS: transition, @keyframes и View Transitions API

    Введение

    Анимации в CSS давно стали неотъемлемой частью современной веб-разработки. Они позволяют создавать плавные переходы между состояниями элементов, сложные многоэтапные эффекты и даже анимировать переходы между страницами — всё это без единой строчки JavaScript.

    В арсенале CSS-разработчика сегодня три основных инструмента: свойство transition для простых плавных переходов, директива @keyframes в сочетании со свойством animation для сложных многошаговых анимаций, и новый View Transitions API для анимации смены контента на странице. В этой статье разберём каждый из них с практическими примерами и выясним, когда какой подход выбрать.

    CSS transition: плавные переходы между состояниями

    Свойство transition — самый простой способ добавить анимации в CSS. Оно описывает плавный переход элемента из одного состояния в другое, например при наведении курсора.

    .button {
      background-color: #6c3fc5;
      color: white;
      padding: 12px 24px;
      border-radius: 8px;
      /* Плавный переход для фона и трансформации */
      transition: background-color 0.3s ease, transform 0.2s ease;
    }
    
    .button:hover {
      background-color: #8b5cf6;
      transform: translateY(-2px);
    }
    

    Свойство transition принимает четыре параметра: анимируемое свойство, длительность (duration), функцию плавности (timing-function) и задержку. Можно использовать сокращённую запись или указать каждый параметр отдельно.

    Какие свойства анимировать через transition

    Не все CSS-свойства одинаково хорошо анимируются. Для максимальной производительности анимируйте только transform и opacity — браузер обрабатывает их на GPU, без перерасчёта layout.

    /* Хорошо: анимация transform и opacity */
    .card {
      transition: transform 0.3s ease, opacity 0.3s ease;
    }
    .card:hover {
      transform: scale(1.05);
      opacity: 0.9;
    }
    
    /* Плохо: анимация width вызывает reflow */
    .card-bad {
      transition: width 0.3s ease;
    }
    .card-bad:hover {
      width: 300px;
    }
    

    Анимация таких свойств как width, height, margin или padding через transition заставляет браузер пересчитывать layout на каждом кадре, что снижает производительность.

    CSS @keyframes и animation: многошаговые анимации

    Когда нужно создать анимацию с несколькими промежуточными состояниями, transition уже недостаточно. Здесь на помощь приходит директива @keyframes вместе со свойством animation.

    В отличие от transition, который работает только между двумя состояниями (A и B), @keyframes позволяет задать произвольное количество ключевых кадров:

    /* Определяем ключевые кадры анимации */
    @keyframes pulse {
      0% {
        transform: scale(1);
        box-shadow: 0 0 0 0 rgba(108, 63, 197, 0.7);
      }
      50% {
        transform: scale(1.05);
        box-shadow: 0 0 0 10px rgba(108, 63, 197, 0);
      }
      100% {
        transform: scale(1);
        box-shadow: 0 0 0 0 rgba(108, 63, 197, 0);
      }
    }
    
    .notification-badge {
      /* Подключаем анимацию */
      animation: pulse 2s ease infinite;
    }
    

    Как создать анимацию на CSS с помощью @keyframes

    Свойство animation — это сокращённая запись для нескольких параметров:

    .element {
      /* animation: имя | длительность | timing-function | задержка | количество | направление | fill-mode */
      animation: slideIn 0.5s ease-out 0s 1 normal forwards;
    }
    
    @keyframes slideIn {
      from {
        transform: translateX(-100%);
        opacity: 0;
      }
      to {
        transform: translateX(0);
        opacity: 1;
      }
    }
    

    Ключевые параметры animation:

    • animation-duration — длительность одного цикла
    • animation-timing-function — функция плавности (ease, linear, cubic-bezier())
    • animation-iteration-count — количество повторений (infinite для бесконечной)
    • animation-direction — направление (normal, reverse, alternate)
    • animation-fill-mode — состояние до/после анимации (forwards, backwards, both)

    Пример: анимация загрузки на чистом CSS

    @keyframes spinner {
      0% {
        transform: rotate(0deg);
      }
      100% {
        transform: rotate(360deg);
      }
    }
    
    .loader {
      width: 40px;
      height: 40px;
      border: 3px solid #e2e8f0;
      border-top-color: #6c3fc5;
      border-radius: 50%;
      animation: spinner 0.8s linear infinite;
    }
    

    Этот спиннер использует только transform: rotate(), что обеспечивает плавную работу даже на слабых устройствах.

    Разница между transition и animation в CSS

    Выбор между transition и animation зависит от задачи:

    Критерий transition animation + @keyframes
    Триггер Требует события (hover, focus, класс) Может запускаться автоматически
    Состояния Только два (начало и конец) Любое количество ключевых кадров
    Повторение Однократный переход Поддерживает циклы и infinite
    Управление из JS Проще интегрировать Сложнее контролировать
    Сложность Минимальный код Больше кода, больше контроля

    Практическое правило: если анимация — это реакция на действие пользователя (наведение, клик, фокус) и переход между двумя состояниями, используйте transition. Для всего остального — @keyframes.

    View Transitions API: анимация смены контента

    View Transitions API — это новый инструмент для создания плавных анимированных переходов при смене содержимого страницы. Он работает как в SPA, так и в MPA, делая снимки старого и нового состояний и анимируя переход между ними.

    Как использовать View Transitions API в SPA

    Для SPA-приложений API вызывается через JavaScript:

    // Запускаем анимацию перехода при обновлении DOM
    document.startViewTransition(() => {
      // Обновляем содержимое страницы
      updateContent();
    });
    

    Браузер автоматически создаёт кроссфейд между старым и новым состояниями. Но настоящая сила API раскрывается в сочетании с CSS:

    /* Настраиваем анимацию для старого состояния */
    ::view-transition-old(root) {
      animation: fadeOut 0.3s ease forwards;
    }
    
    /* Настраиваем анимацию для нового состояния */
    ::view-transition-new(root) {
      animation: fadeIn 0.3s ease forwards;
    }
    
    @keyframes fadeOut {
      to { opacity: 0; transform: scale(0.95); }
    }
    
    @keyframes fadeIn {
      from { opacity: 0; transform: scale(1.05); }
    }
    

    Именованные переходы для отдельных элементов

    Можно анимировать конкретные элементы, присвоив им view-transition-name:

    /* Карточка товара на странице каталога */
    .product-card {
      view-transition-name: product-hero;
    }
    
    /* Изображение на странице товара */
    .product-detail-image {
      view-transition-name: product-hero;
    }
    

    Теперь при переходе между страницами каталога и товара браузер плавно анимирует перемещение изображения из карточки в детальный вид — включая изменение размера и позиции.

    View Transitions для MPA-приложений

    Для многостраничных приложений достаточно добавить CSS-правило на обеих страницах:

    @view-transition {
      navigation: auto;
    }
    

    Это включает автоматический кроссфейд при навигации между страницами одного origin. Дополнительный JavaScript не нужен.

    Частые ошибки при работе с анимациями в CSS

    Анимация свойств, вызывающих reflow. Анимирование width, height, top, left через transition или @keyframes приводит к пересчёту layout. Используйте transform: translate(), scale() и opacity.

    Отсутствие will-change. Для сложных анимаций подсказка will-change: transform помогает браузеру оптимизировать рендеринг. Но не ставьте will-change на все элементы — это увеличивает расход памяти.

    /* Используйте will-change точечно */
    .animated-element {
      will-change: transform, opacity;
    }
    

    Забытый prefers-reduced-motion. Часть пользователей включает режим уменьшения анимаций в системных настройках. Уважайте их выбор:

    @media (prefers-reduced-motion: reduce) {
      *, *::before, *::after {
        animation-duration: 0.01ms !important;
        transition-duration: 0.01ms !important;
      }
    }
    

    Неправильное использование animation-fill-mode. Без forwards элемент после завершения анимации вернётся в исходное состояние. Если нужно сохранить финальный кадр, указывайте animation-fill-mode: forwards.

    Заключение

    Анимации в CSS прошли путь от простых transition-переходов до полноценного View Transitions API. Для плавных реакций на действия пользователя используйте transition, для сложных многошаговых эффектов — @keyframes и animation, а для анимации смены контента и страниц — View Transitions API. Комбинируйте эти инструменты, следите за производительностью через transform и opacity, и не забывайте про prefers-reduced-motion — тогда ваши интерфейсы будут одновременно красивыми и быстрыми.

    Иконка глаза431

    Комментарии

    0

    Постройте личный план изучения Основы React, React Router и Redux Toolkit до уровня Middle — бесплатно!

    Основы React, React Router и Redux Toolkit — часть карты развития Frontend, Mobile

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    Zustand

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Next.js - с нуля

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.7
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Feature-Sliced Design

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.5
    3 999 ₽ 6 990 ₽
    Подробнее

    Похожие статьи

    Картинка поста Git rebase vs merge: когда и как правильно выбирать
    Иконка аватараАнтон
    Иконка календаря23 июня 2026
    gitrebasemerge+ 2middleИконка уровня middle

    Git rebase vs merge: когда и как правильно выбирать

    Git rebase и merge решают одну задачу, но по-разному. Разбираем отличия, сценарии применения и типичные ошибки при работе с ветками.

    Иконка чипа0
    Иконка глаза4
    Иконка комментариев0
    Картинка поста Что такое REST API и как его правильно проектировать
    Иконка аватараАнтон
    Иконка календаря22 июня 2026
    REST APIHTTPbackend+ 2juniorИконка уровня junior

    Что такое REST API и как его правильно проектировать

    REST API — архитектурный стиль для взаимодействия клиента и сервера. Разбираем принципы REST, HTTP-методы, проектирование маршрутов и типичные ошибки.

    Иконка чипа0
    Иконка глаза41
    Иконка комментариев0
    Картинка поста Основы Docker для разработчика: контейнеры, образы и тома
    Иконка аватараАнтон
    Иконка календаря20 июня 2026
    DockerDevOpsКонтейнеризация+ 1juniorИконка уровня junior

    Основы Docker для разработчика: контейнеры, образы и тома

    Основы Docker для разработчика: разбираем, что такое контейнеры, образы и тома, как их создавать и использовать в реальных проектах.

    Иконка чипа0
    Иконка глаза95
    Иконка комментариев0
    Иконка чипа0