Created by AIImproved by people

Riqli · living documents · updated continuously

Where AI knowledge meets human practice.

Share with friends
image

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.)

sections

Введение в CSS-анимации: цели и ценность

contents

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

sections

Анимационные примитивы: длительность, задержка и временная функция

contents

Длительность анимации задает время одного цикла, а задержка — паузу перед стартом. Временная функция (easing), определяемая через cubic-bezier, управляет характером ускорения и замедления. Рекомендуемая длительность для входных анимаций — от 200 до 500 мс: этого достаточно для плавности, но недостаточно для ощущения заторможенности. Для выходных анимаций предпочтительны более короткие интервалы, чтобы не задерживать пользователя.

sections

Производительность: какие свойства анимировать

contents

Для достижения 60 кадров в секунду анимируйте только transform и opacity — они обрабатываются на GPU и не вызывают перекомпоновку макета. Анимация свойств вроде width, height, margin, padding, left/top заставляет браузер пересчитывать геометрию элементов (reflow), создавая рывки. При работе с CSS-переходами избегайте значения all для transition-property: указывайте конкретные свойства, чтобы случайно не затронуть дорогие для анимации параметры.

sections

CSS-переходы: плавное переключение состояний

contents

CSS-переходы — простейший способ анимировать изменение между двумя состояниями (например, :hover, :focus). Они требуют задания transition-property и transition-duration. В отличие от @keyframes, переходы не контролируют промежуточные этапы — они лишь создают плавный «мостик» между началом и концом. Это идеальный выбор для микро-взаимодействий: подсветка полей ввода, изменение фона кнопок, появление подсказок.

contents

Можно задавать разные длительности для входа и выхода из состояния: например, медленное появление эффекта при наведении и быстрое исчезновение при уходе курсора. Это достигается переопределением transition-duration внутри псевдокласса :hover. Сокращенная запись transition: property duration delay easing позволяет указать все параметры в одной строке, но порядок важен: длительность всегда указывается перед задержкой.

sections

Ключевые кадры (@keyframes): полный контроль над анимацией

contents

Директива @keyframes позволяет создавать сложные многоэтапные анимации, определяя стили элемента в любой момент времени (в процентах от 0% до 100%). Это дает возможность не только двигать и масштабировать объекты, но и менять цвет, прозрачность, поворот, создавая уникальные визуальные эффекты. Ключевые кадры незаменимы для циклических анимаций (спиннеры, пульсация) и для сценариев, где нужно больше двух точек контроля над движением.

contents

Для группировки одинаковых ключевых кадров используется запись 25%, 100% { transform: translateX(20vw); }. Свойство animation-fill-mode: forwards сохраняет конечное состояние анимации после ее завершения, backwards — применяет начальное состояние до старта, а both — комбинирует оба режима. Это решает проблему «скачков» в начале и конце анимации. Для бесконечных анимаций используется animation-iteration-count: infinite в сочетании с animation-direction: alternate для эффекта маятника.

sections

Хореография: синхронизация анимаций через CSS-переменные

contents

Хореография — это согласованная анимация нескольких элементов, создающая эффект «волны» или последовательного появления. В CSS она реализуется через CSS-переменные и функцию calc(). Каждый элемент получает задержку, зависящую от его индекса: animation-delay: calc(var(--duration) * var(--index)). Это позволяет динамически управлять общей длительностью и интервалами между элементами, изменяя всего одну переменную в родителе.

contents

Использование CSS-переменных делает хореографию масштабируемой и удобной для поддержки. Например, для создания «лестницы» (stagger) вы можете задать базовую длительность и шаг задержки в родительском элементе, а дочерние элементы будут автоматически рассчитывать свои параметры. В React или Vue эта техника легко интегрируется через динамическое присвоение переменной --index при рендеринге списка.

sections

Управление состояниями через data-атрибуты

contents

Атрибуты data-* служат надежным мостом между JavaScript и CSS для управления состояниями приложения. В отличие от классов, data-атрибуты гарантируют, что элемент находится только в одном состоянии, исключая конфликты (например, data-state="loading" или data-state="success"). Селектор [data-state="loading"] позволяет применять специфические стили и анимации в зависимости от текущего состояния, делая логику прозрачной и предсказуемой.

sections

Техника FLIP: плавная анимация макета

contents

Техника FLIP (First, Last, Invert, Play) решает проблему анимации элементов, меняющих положение и размер в документе. Она включает четыре шага: запись начальных координат (First), применение изменения макета (Last), вычисление разницы и применение обратной трансформации (Invert), и, наконец, анимацию к исходным значениям (Play). Благодаря использованию только трансформаций, FLIP обеспечивает высокую производительность и плавность даже при сложных перестроениях сетки.

contents

Реализация FLIP требует JavaScript для измерения координат с помощью getBoundingClientRect() и управления CSS-переменными. Ключевой момент — выполнение инверсии и запуска анимации в разных кадрах requestAnimationFrame, чтобы браузер успел применить изменения макета. Эта техника лежит в основе многих популярных библиотек (Framer Motion, React Spring), но ее понимание позволяет создавать собственные высокопроизводительные решения без внешних зависимостей.

sections

Реактивные анимации: чтение непрерывного ввода

contents

Реактивные анимации отличаются от предопределенных тем, что зависят от непрерывного внешнего сигнала — движения мыши, касания или изменения данных. Для их реализации JavaScript считывает позицию указателя через событие pointermove и передает координаты в CSS через переменные: element.style.setProperty('--x', clientX). Это позволяет создавать эффекты, где объекты буквально «следуют» за курсором, реагируя на каждое движение.

contents

Важно передавать в CSS значения с единицами измерения, например, --x: 100px. Если использовать «голое» число, браузер не поймет, в каких единицах применять трансформацию. Для удобства можно определять дополнительные переменные-обертки: --x-px: calc(var(--x) * 1px). Это сохраняет гибкость, позволяя использовать значения в разных контекстах, например, для вращения через rotate: calc(var(--x) * 1deg).

sections

Техника Lerp: плавное следование за целью

contents

Техника Lerp (линейная интерполяция) создает эффект инерционного движения, когда объект не телепортируется к цели, а постепенно приближается к ней. Вместо прямого присвоения координат, вы каждый кадр перемещаете текущую позицию к целевой на определенную долю (например, 0.1). Это создает естественный «хвост»: объект ускоряется, когда цель далеко, и замедляется при приближении, имитируя физическую инерцию.

contents

Lerp реализуется с помощью requestAnimationFrame и CSS-переменных: текущая позиция обновляется в каждом кадре, а значение передается в CSS для трансформации. Для оптимизации производительности рекомендуется добавлять условие остановки: если расстояние до цели меньше 1 пикселя, прекращать выполнение цикла. Это предотвращает бесконечные вычисления в субпиксельной области, экономя ресурсы браузера.

sections

Доступность: prefers-reduced-motion

contents

Медиа-запрос @media (prefers-reduced-motion: reduce) — важнейший инструмент для обеспечения доступности. Пользователи с вестибулярными расстройствами могут активировать эту настройку в системе, чтобы уменьшить количество анимаций. Вместо полного отключения анимаций рекомендуется адаптировать их: сократить длительность, уменьшить расстояние перемещения или заменить движение на изменение прозрачности, сохраняя смысл интерфейса без вреда для восприятия.

sections

Практическое задание: анимация формы подписки

contents

В упражнении с формой подписки вы примените все изученные техники: CSS-переходы для плавного изменения цвета рамки при фокусе, ключевые кадры для анимации появления (slide-up) и data-атрибуты для переключения между состояниями (subscribing, success, error). Форма будет появляться с эффектом подъема, а поле ввода и кнопка — с задержкой, создавая хореографию, управляемую через CSS-переменные.

sections

Обработка ошибок: анимация встряхивания

contents

Для состояния ошибки вы реализуете анимацию встряхивания (shake), которая создается через @keyframes с попеременным смещением по оси X. Важно активировать эту анимацию только при условии, что поле не находится в фокусе: [data-state="error"]:not(:focus) { animation: shake 0.3s; }. Это позволяет пользователю спокойно исправлять ошибку, не подвергаясь раздражающему эффекту во время ввода.

sections

Сложные состояния: успех с анимацией прыжка

contents

Для состояния success вы создадите «прыгающую» анимацию, используя transform: translateY() и scaleY для эффекта «сжатия-растяжения». Эта анимация демонстрирует, как через @keyframes можно комбинировать разные трансформации в одной последовательности, создавая «живые» и эмоционально окрашенные реакции интерфейса на успешные действия пользователя.

sections

Условный рендеринг через data-атрибуты

contents

Управление видимостью текстовых меток (Subscribe, Subscribing, Success, Error) реализовано через data-атрибуты show и active. JavaScript динамически добавляет атрибут data-active к элементу, соответствующему текущему состоянию, а CSS скрывает все неактивные элементы. Это избавляет от необходимости манипулировать DOM или использовать сложную логику условного рендеринга, упрощая код и делая его более производительным.

sections

FLIP-анимация карточки с текстом

contents

В продвинутом упражнении вы примените FLIP-технику к карточке, которая расширяется при клике, и к ее тексту. Вместо анимации родительского элемента (что приводит к искажению дочернего текста), вы анимируете псевдоэлемент ::before для фона и сам текст отдельно. Это требует вычисления разницы для двух элементов и координации их анимации через CSS-переменные, демонстрируя гибкость FLIP для сложных UI-компонентов.

sections

Анимация в реальном приложении: Frontend Airlines

contents

Финальная часть курса демонстрирует применение всех техник в полноценном приложении «Frontend Airlines». Вы увидите, как хореография используется для последовательного появления списка фильмов, как CSS-переменные управляют задержками элементов, и как data-атрибуты контролируют переходы между экранами. Это практический пример того, как системный подход к анимациям превращает «сырое» приложение в отточенный пользовательский опыт.

sections

Заключительный творческий проект: анимация с Dribbble

contents

Кульминация курса — создание анимации по макету с Dribbble «с нуля». Вы начнете с чистого HTML и CSS, проанализируете этапы анимации (вход, трансформация, выход) и реализуете их через комбинацию ключевых кадров, хореографии и clip-path. Задание демонстрирует творческую мощь CSS-анимаций и учит системному подходу: разбивать сложный визуал на изолированные, управляемые анимационные блоки.

contents

Проект показывает, как CSS-анимации позволяют воспроизводить сложную дизайнерскую графику без JavaScript-библиотек. Вы научитесь работать с clip-path для «раскрытия» текста, синхронизировать несколько анимированных элементов через единую временную шкалу и применять нестандартные трансформации (scale, translate) для создания драматических эффектов. Этот опыт станет мостом между теоретическими знаниями и реальной практикой в профессиональной веб-разработке.

sections

Questions and answers


questions

Какие две ключевые цели преследуют CSS-анимации в интерфейсах?

answersCorrect

Навигация и формирование бренда: они визуально направляют пользователя и создают запоминающийся стиль продукта.

explanations

Анимации выполняют две функции: объясняют переходы между состояниями, делая интерфейс интуитивным, и формируют характерный стиль, который повышает доверие и отзывчивость приложения.

answersWrong

Увеличение скорости загрузки и уменьшение размера кода.

answersWrong

Создание сложной 3D-графики и игровых механик.


questions

Каковы основные параметры анимационных примитивов и рекомендуемая длительность для входных анимаций?