Created by AIImproved by people
Riqli · living documents · updated continuously
Where AI knowledge meets human practice.
Share with friends

Frontend development: HTML, CSS, JavaScript/TypeScript, and React/Angular/Vue. Hard skill. (HTML5. CSS3. JavaScript. TypeScript. React. Redux. Angular. Vue.js. SPA. SSR. Webpack. Babel. Self-study. Q&A. Tutorials. Documentation.)
Введение в CSS-анимации: цели и ценность
CSS-анимации служат двум ключевым целям: навигации и формированию бренда. Они направляют пользователя, визуально объясняя переходы между состояниями, и создают характерный стиль продукта, делая интерфейс живым и интуитивно понятным. Продуманные анимации повышают доверие к приложению, превращая его из набора статичных экранов в отзывчивую и запоминающуюся среду.
Анимационные примитивы: длительность, задержка и временная функция
Длительность анимации задает время одного цикла, а задержка — паузу перед стартом. Временная функция (easing), определяемая через cubic-bezier, управляет характером ускорения и замедления. Рекомендуемая длительность для входных анимаций — от 200 до 500 мс: этого достаточно для плавности, но недостаточно для ощущения заторможенности. Для выходных анимаций предпочтительны более короткие интервалы, чтобы не задерживать пользователя.
Производительность: какие свойства анимировать
Для достижения 60 кадров в секунду анимируйте только transform и opacity — они обрабатываются на GPU и не вызывают перекомпоновку макета. Анимация свойств вроде width, height, margin, padding, left/top заставляет браузер пересчитывать геометрию элементов (reflow), создавая рывки. При работе с CSS-переходами избегайте значения all для transition-property: указывайте конкретные свойства, чтобы случайно не затронуть дорогие для анимации параметры.
CSS-переходы: плавное переключение состояний
CSS-переходы — простейший способ анимировать изменение между двумя состояниями (например, :hover, :focus). Они требуют задания transition-property и transition-duration. В отличие от @keyframes, переходы не контролируют промежуточные этапы — они лишь создают плавный «мостик» между началом и концом. Это идеальный выбор для микро-взаимодействий: подсветка полей ввода, изменение фона кнопок, появление подсказок.
Можно задавать разные длительности для входа и выхода из состояния: например, медленное появление эффекта при наведении и быстрое исчезновение при уходе курсора. Это достигается переопределением transition-duration внутри псевдокласса :hover. Сокращенная запись transition: property duration delay easing позволяет указать все параметры в одной строке, но порядок важен: длительность всегда указывается перед задержкой.
Ключевые кадры (@keyframes): полный контроль над анимацией
Директива @keyframes позволяет создавать сложные многоэтапные анимации, определяя стили элемента в любой момент времени (в процентах от 0% до 100%). Это дает возможность не только двигать и масштабировать объекты, но и менять цвет, прозрачность, поворот, создавая уникальные визуальные эффекты. Ключевые кадры незаменимы для циклических анимаций (спиннеры, пульсация) и для сценариев, где нужно больше двух точек контроля над движением.
Для группировки одинаковых ключевых кадров используется запись 25%, 100% { transform: translateX(20vw); }. Свойство animation-fill-mode: forwards сохраняет конечное состояние анимации после ее завершения, backwards — применяет начальное состояние до старта, а both — комбинирует оба режима. Это решает проблему «скачков» в начале и конце анимации. Для бесконечных анимаций используется animation-iteration-count: infinite в сочетании с animation-direction: alternate для эффекта маятника.
Хореография: синхронизация анимаций через CSS-переменные
Хореография — это согласованная анимация нескольких элементов, создающая эффект «волны» или последовательного появления. В CSS она реализуется через CSS-переменные и функцию calc(). Каждый элемент получает задержку, зависящую от его индекса: animation-delay: calc(var(--duration) * var(--index)). Это позволяет динамически управлять общей длительностью и интервалами между элементами, изменяя всего одну переменную в родителе.
Использование CSS-переменных делает хореографию масштабируемой и удобной для поддержки. Например, для создания «лестницы» (stagger) вы можете задать базовую длительность и шаг задержки в родительском элементе, а дочерние элементы будут автоматически рассчитывать свои параметры. В React или Vue эта техника легко интегрируется через динамическое присвоение переменной --index при рендеринге списка.
Управление состояниями через data-атрибуты
Атрибуты data-* служат надежным мостом между JavaScript и CSS для управления состояниями приложения. В отличие от классов, data-атрибуты гарантируют, что элемент находится только в одном состоянии, исключая конфликты (например, data-state="loading" или data-state="success"). Селектор [data-state="loading"] позволяет применять специфические стили и анимации в зависимости от текущего состояния, делая логику прозрачной и предсказуемой.
Техника FLIP: плавная анимация макета
Техника FLIP (First, Last, Invert, Play) решает проблему анимации элементов, меняющих положение и размер в документе. Она включает четыре шага: запись начальных координат (First), применение изменения макета (Last), вычисление разницы и применение обратной трансформации (Invert), и, наконец, анимацию к исходным значениям (Play). Благодаря использованию только трансформаций, FLIP обеспечивает высокую производительность и плавность даже при сложных перестроениях сетки.
Реализация FLIP требует JavaScript для измерения координат с помощью getBoundingClientRect() и управления CSS-переменными. Ключевой момент — выполнение инверсии и запуска анимации в разных кадрах requestAnimationFrame, чтобы браузер успел применить изменения макета. Эта техника лежит в основе многих популярных библиотек (Framer Motion, React Spring), но ее понимание позволяет создавать собственные высокопроизводительные решения без внешних зависимостей.
Реактивные анимации: чтение непрерывного ввода
Реактивные анимации отличаются от предопределенных тем, что зависят от непрерывного внешнего сигнала — движения мыши, касания или изменения данных. Для их реализации JavaScript считывает позицию указателя через событие pointermove и передает координаты в CSS через переменные: element.style.setProperty('--x', clientX). Это позволяет создавать эффекты, где объекты буквально «следуют» за курсором, реагируя на каждое движение.
Важно передавать в CSS значения с единицами измерения, например, --x: 100px. Если использовать «голое» число, браузер не поймет, в каких единицах применять трансформацию. Для удобства можно определять дополнительные переменные-обертки: --x-px: calc(var(--x) * 1px). Это сохраняет гибкость, позволяя использовать значения в разных контекстах, например, для вращения через rotate: calc(var(--x) * 1deg).
Техника Lerp: плавное следование за целью
Техника Lerp (линейная интерполяция) создает эффект инерционного движения, когда объект не телепортируется к цели, а постепенно приближается к ней. Вместо прямого присвоения координат, вы каждый кадр перемещаете текущую позицию к целевой на определенную долю (например, 0.1). Это создает естественный «хвост»: объект ускоряется, когда цель далеко, и замедляется при приближении, имитируя физическую инерцию.
Lerp реализуется с помощью requestAnimationFrame и CSS-переменных: текущая позиция обновляется в каждом кадре, а значение передается в CSS для трансформации. Для оптимизации производительности рекомендуется добавлять условие остановки: если расстояние до цели меньше 1 пикселя, прекращать выполнение цикла. Это предотвращает бесконечные вычисления в субпиксельной области, экономя ресурсы браузера.
Доступность: prefers-reduced-motion
Медиа-запрос @media (prefers-reduced-motion: reduce) — важнейший инструмент для обеспечения доступности. Пользователи с вестибулярными расстройствами могут активировать эту настройку в системе, чтобы уменьшить количество анимаций. Вместо полного отключения анимаций рекомендуется адаптировать их: сократить длительность, уменьшить расстояние перемещения или заменить движение на изменение прозрачности, сохраняя смысл интерфейса без вреда для восприятия.
Практическое задание: анимация формы подписки
В упражнении с формой подписки вы примените все изученные техники: CSS-переходы для плавного изменения цвета рамки при фокусе, ключевые кадры для анимации появления (slide-up) и data-атрибуты для переключения между состояниями (subscribing, success, error). Форма будет появляться с эффектом подъема, а поле ввода и кнопка — с задержкой, создавая хореографию, управляемую через CSS-переменные.
Обработка ошибок: анимация встряхивания
Для состояния ошибки вы реализуете анимацию встряхивания (shake), которая создается через @keyframes с попеременным смещением по оси X. Важно активировать эту анимацию только при условии, что поле не находится в фокусе: [data-state="error"]:not(:focus) { animation: shake 0.3s; }. Это позволяет пользователю спокойно исправлять ошибку, не подвергаясь раздражающему эффекту во время ввода.
Сложные состояния: успех с анимацией прыжка
Для состояния success вы создадите «прыгающую» анимацию, используя transform: translateY() и scaleY для эффекта «сжатия-растяжения». Эта анимация демонстрирует, как через @keyframes можно комбинировать разные трансформации в одной последовательности, создавая «живые» и эмоционально окрашенные реакции интерфейса на успешные действия пользователя.
Условный рендеринг через data-атрибуты
Управление видимостью текстовых меток (Subscribe, Subscribing, Success, Error) реализовано через data-атрибуты show и active. JavaScript динамически добавляет атрибут data-active к элементу, соответствующему текущему состоянию, а CSS скрывает все неактивные элементы. Это избавляет от необходимости манипулировать DOM или использовать сложную логику условного рендеринга, упрощая код и делая его более производительным.
FLIP-анимация карточки с текстом
В продвинутом упражнении вы примените FLIP-технику к карточке, которая расширяется при клике, и к ее тексту. Вместо анимации родительского элемента (что приводит к искажению дочернего текста), вы анимируете псевдоэлемент ::before для фона и сам текст отдельно. Это требует вычисления разницы для двух элементов и координации их анимации через CSS-переменные, демонстрируя гибкость FLIP для сложных UI-компонентов.
Анимация в реальном приложении: Frontend Airlines
Финальная часть курса демонстрирует применение всех техник в полноценном приложении «Frontend Airlines». Вы увидите, как хореография используется для последовательного появления списка фильмов, как CSS-переменные управляют задержками элементов, и как data-атрибуты контролируют переходы между экранами. Это практический пример того, как системный подход к анимациям превращает «сырое» приложение в отточенный пользовательский опыт.
Заключительный творческий проект: анимация с Dribbble
Кульминация курса — создание анимации по макету с Dribbble «с нуля». Вы начнете с чистого HTML и CSS, проанализируете этапы анимации (вход, трансформация, выход) и реализуете их через комбинацию ключевых кадров, хореографии и clip-path. Задание демонстрирует творческую мощь CSS-анимаций и учит системному подходу: разбивать сложный визуал на изолированные, управляемые анимационные блоки.
Проект показывает, как CSS-анимации позволяют воспроизводить сложную дизайнерскую графику без JavaScript-библиотек. Вы научитесь работать с clip-path для «раскрытия» текста, синхронизировать несколько анимированных элементов через единую временную шкалу и применять нестандартные трансформации (scale, translate) для создания драматических эффектов. Этот опыт станет мостом между теоретическими знаниями и реальной практикой в профессиональной веб-разработке.
Questions and answers
Какие две ключевые цели преследуют CSS-анимации в интерфейсах?
Навигация и формирование бренда: они визуально направляют пользователя и создают запоминающийся стиль продукта.
Анимации выполняют две функции: объясняют переходы между состояниями, делая интерфейс интуитивным, и формируют характерный стиль, который повышает доверие и отзывчивость приложения.
Увеличение скорости загрузки и уменьшение размера кода.
Создание сложной 3D-графики и игровых механик.
Каковы основные параметры анимационных примитивов и рекомендуемая длительность для входных анимаций?