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

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

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • PurpleSchool — курсы программирования онлайн
    • Сообщество
    • PurpleПлюс
    • 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 — тогда ваши интерфейсы будут одновременно красивыми и быстрыми.

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

    Комментарии

    0

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

    Основы разработки — часть карты развития Frontend, Backend, Mobile

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

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

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

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

    Основы Git

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

    HTML и CSS

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

    Neovim

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

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

    Картинка поста Как внедрить тесты в проект, где их никогда не было: пошаговая стратегия
    Иконка аватараАнтон
    Иконка календаря14 апреля 2026
    testingjavascripttypescriptmiddleИконка уровня middle

    Как внедрить тесты в проект, где их никогда не было: пошаговая стратегия

    Пошаговая стратегия внедрения тестов в существующий проект: с чего начать тестирование legacy-кода, какие тесты писать первыми и как настроить Vitest для JavaScript и TypeScript.

    Иконка чипа0
    Иконка глаза62
    Иконка комментариев0
    Картинка поста Оптимизация LCP: как я довёл Web Vitals до 1.5 секунд на реальном проекте
    Иконка аватараАнтон
    Иконка календаря27 марта 2026
    performancehtmlmiddleИконка уровня middle

    Оптимизация LCP: как я довёл Web Vitals до 1.5 секунд на реальном проекте

    Пошаговое руководство по оптимизации Largest Contentful Paint (LCP): от 4.8 до 1.5 секунд на реальном проекте. Изображения, шрифты, CSS, серверная оптимизация и конкретные примеры кода.

    Иконка чипа0
    Иконка глаза251
    Иконка комментариев0
    Картинка поста Nuxt 3 vs Next.js 15: что выбрать для нового проекта в 2026
    Иконка аватараАнтон
    Иконка календаря26 марта 2026
    nuxtnext.jsjavascriptmiddleИконка уровня middle

    Nuxt 3 vs Next.js 15: что выбрать для нового проекта в 2026

    Сравнение Nuxt 3 и Next.js 15 по производительности, серверному рендерингу, DX и экосистеме. Разбираем RSC, Nitro, Turbopack и помогаем выбрать фреймворк для нового проекта в 2026 году.

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