CSS animation: полное руководство с примерами и свойствами
Оглавление
- Когда использовать CSS анимацию, а когда — переход (transition)
- Сердце анимации: создание сценария с помощью @keyframes
- Настройка воспроизведения: основные свойства CSS animation
- Контроль потока: timing-function, delay, iteration-count и direction
- Что происходит до и после: свойство animation-fill-mode
- Интерактивность: управление анимацией с помощью animation-play-state
- Сокращенная запись: свойство animation (shorthand)
- Практический пример: создание 3D-лоадера
- Заключение и лучшие практики
В современном веб-дизайне статичные страницы остались в прошлом. Динамика, плавность и осмысленное движение — вот что захватывает внимание пользователя, направляет его взгляд и делает взаимодействие с интерфейсом запоминающимся. И один из самых мощных инструментов для создания этой магии — CSS анимации (animation css).
В отличие от простых переходов (css transition), анимации на CSS позволяют создавать многозвенные, сложные и циклические сцены прямо в браузере, без использования JavaScript или тяжеловесных библиотек. В этой статье мы подробно разберем все свойства CSS animation, изучим волшебство правила @keyframes и научимся создавать профессиональные, интерактивные эффекты, которые выделят ваш бренд.
Когда использовать CSS анимацию, а когда — переход (transition)
Первый и самый важный вопрос, который должен задать себе разработчик: "Какой инструмент мне нужен для этой задачи?". Часто новички путают transition и animation.
1. Используйте transition, когда вам нужно анимировать изменение между двумя состояниями элемента. Классический пример — изменение цвета кнопки при наведении (:hover). Неважно, сколько свойств вы меняете (цвет, тень, размер), если изменение происходит в один шаг: "было так — стало так". Transition реагирует на изменение состояния.
2. Используйте animation, когда ваша сцена требует:
- Последовательности из более чем двух шагов. Например, элемент должен подпрыгнуть, изменить цвет, а затем повернуться.
- Автономного, непрерывного воспроизведения. Анимация, которая запускается сама при загрузке страницы (например, логотип или индикатор загрузки).
- Повторения (циклов). Бесконечная или многократная анимация.
- Контроля над каждым промежуточным кадром. Этого можно достичь только с помощью css
@keyframes.
Если провести аналогию с видео, transition — это плавный монтажный переход между двумя кадрами, а animation — это готовый видеоролик со своим сценарием, который можно запускать, ставить на паузу и перематывать.
Сердце анимации: создание сценария с помощью @keyframes
Перед тем как назначить анимацию элементу, нужно создать ее сценарий. Для этого в CSS существует специальное правило @keyframes. Это фундамент любой CSS анимации.
Вы сами придумываете имя для своей анимации, например, spin, fadeIn или bounce. Внутри блока @keyframes вы описываете, как должен выглядеть элемент в ключевые моменты времени.
Время обозначается в процентах:
- 0% (или синоним
from) — начало анимации. - 100% (или синоним
to) — конец анимации. - Любое значение между (25%, 50%, 75%) — промежуточный этап.
Давайте создадим простую анимацию вращения и превращения квадрата в круг.
/* Создаем сценарий анимации с именем "spin-to-circle" */
@keyframes spin-to-circle {
0% {
transform: rotate(0deg);
border-radius: 0;
}
50% {
transform: rotate(180deg);
border-radius: 25%;
}
100% {
transform: rotate(360deg);
border-radius: 50%; /* Полный круг */
}
}
В этом примере элемент начинает вращаться и постепенно скругляет углы. К середине анимации (50%) он поворачивается на 180 градусов и становится чуть круглее, а к концу завершает полный оборот и превращается в идеальный круг.
Важное правило: если вы хотите, чтобы изменение свойства (например, border-radius: 50%) сохранилось до конца анимации, его нужно явно указать на последнем ключевом кадре (100%). В противном случае после завершения кадра, где это свойство задано, анимация «забудет» о нем и начнет плавно возвращаться к исходному значению.
Настройка воспроизведения: основные свойства CSS animation
Итак, сценарий готов. Теперь нужно назначить его элементу и настроить, как именно он будет воспроизводиться. Для этого используется группа свойств css animation.
animation-nameуказывает, какой сценарий (@keyframes) использовать.animation-durationопределяет, сколько времени займет один цикл анимации (например,2s,500ms).
Применим нашу анимацию к простому div:
<div class="animated-box"></div>
.animated-box {
width: 100px;
height: 100px;
background-color: #4f46e5; /* Индиго */
/* Назначаем анимацию */
animation-name: spin-to-circle;
animation-duration: 3s;
}
Теперь при загрузке страницы квадрат один раз выполнит нашу анимацию за 3 секунды и… резко вернется в исходное состояние. Чтобы сделать поведение более контролируемым и интересным, нам понадобятся другие свойства.
Контроль потока: timing-function, delay, iteration-count и direction
Эти свойства превращают простую анимацию в профессиональную, добавляя ей характер и динамику.
animation-timing-function (функция временного интервала) — это, пожалуй, самое важное свойство для ощущения «естественности» движения. Оно определяет кривую скорости анимации.
ease(по умолчанию): Медленный старт, быстро в середине, медленный конец.linear: Постоянная скорость от начала до конца.ease-in: Медленный старт, быстрый конец.ease-out: Быстрый старт, медленный конец.ease-in-out: Медленный старт и конец, скорость в середине.cubic-bezier(n,n,n,n): Позволяет создать свою уникальную кривую на сайте cubic-bezier.com.
animation-delay — задержка перед началом воспроизведения. Полезно для создания каскадных эффектов, когда элементы начинают двигаться друг за другом.
animation-iteration-count — количество повторений. Можно указать число (2, 5) или ключевое слово infinite для бесконечного цикла.
animation-direction — направление воспроизведения.
normal(по умолчанию): вперед, от 0% к 100%.reverse: наоборот, от 100% к 0%.alternate: чередование (вперед-назад). Особенно полезно в паре сinfiniteили четнымiteration-count.alternate-reverse: чередование, начиная с обратного направления.
Добавим нашему блоку более живое поведение:
.animated-box {
/* ... предыдущие стили ... */
animation-name: spin-to-circle;
animation-duration: 2s;
animation-timing-function: ease-in-out; /* Плавнее */
animation-delay: 0.5s; /* Небольшая задержка */
animation-iteration-count: infinite; /* Бесконечный цикл */
animation-direction: alternate; /* Туда-сюда */
}
Теперь наш квадрат плавно превращается в круг и обратно в бесконечном цикле с небольшой задержкой перед первым стартом.
Что происходит до и после: свойство animation-fill-mode
Помните проблему, когда анимация завершается и элемент резко «прыгает» к исходным стилям? За это отвечает свойство animation-fill-mode. Оно определяет, какие стили применяются к элементу до начала и после завершения анимации.
none(по умолчанию): стили анимации применяются только во время ее выполнения. До и после — действуют обычные стили элемента.forwards: после завершения анимации элемент сохраняет стили последнего ключевого кадра (100% или to). Еслиiteration-countбольше 1, то стили сохраняются после окончания последней итерации.backwards: до начала анимации (учитываяanimation-delay!) элемент сразу принимает стили первого ключевого кадра (0% или from).both: применяются правила иforwards, иbackwards.
На практике forwards используется очень часто, когда нужно, чтобы анимация оставляла постоянный визуальный эффект.
.animated-box-single {
animation-name: spin-to-circle;
animation-duration: 2s;
animation-fill-mode: forwards; /* Останется кругом после анимации */
}
Интерактивность: управление анимацией с помощью animation-play-state
Одно из самых крутых свойств css animation — это animation-play-state. Оно позволяет ставить анимацию на паузу и возобновлять ее. Это открывает двери для создания интерактивных интерфейсов.
Свойство принимает два значения:
running: анимация воспроизводится.paused: анимация приостановлена на текущем кадре.
Чаще всего его меняют с помощью CSS-псевдоклассов или JavaScript.
Пример №1 с наведением (hover):
.pulsing-button {
animation: pulse 1.5s ease-in-out infinite;
}
.pulsing-button:hover {
animation-play-state: paused; /* Пауза при наведении */
}
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.1); }
100% { transform: scale(1); }
}
Пример №2 с JavaScript (добавление кнопок управления):
<button id="playBtn">▶ Воспроизвести</button>
<button id="pauseBtn">⏸ Пауза</button>
<div class="animated-box"></div>
const box = document.querySelector('.animated-box');
const playBtn = document.getElementById('playBtn');
const pauseBtn = document.getElementById('pauseBtn');
playBtn.addEventListener('click', () => {
box.style.animationPlayState = 'running';
});
pauseBtn.addEventListener('click', () => {
box.style.animationPlayState = 'paused';
});
Такая связка CSS @keyframes и простого JS-кода дает мощный инструмент для управления сложными визуальными процессами на странице.
Сокращенная запись: свойство animation (shorthand)
Чтобы не перечислять все свойства по отдельности, можно использовать универсальное и краткое свойство animation. Важно помнить порядок значений:
animation: [name] [duration] [timing-function] [delay] [iteration-count] [direction] [fill-mode] [play-state];
Не обязательно указывать все. Браузер использует значения по умолчанию для пропущенных. Главное — сохранять порядок.
Наш предыдущий сложный пример можно записать одной строкой:
.animated-box {
/* animation: name duration timing-function delay iteration-count direction fill-mode play-state; */
animation: spin-to-circle 2s ease-in-out 0.5s infinite alternate both;
}
Практический пример: создание 3D-лоадера
Давайте закрепим все знания, создав популярный анимированный индикатор загрузки (loader), который вращается в трехмерном пространстве.
HTML:
<div class="loader"></div>
CSS:
.loader {
width: 60px;
height: 60px;
border: 6px solid rgba(79, 70, 229, 0.3); /* Полупрозрачная обводка */
border-top-color: #4f46e5; /* Цветной "бегунок" */
border-radius: 50%;
box-shadow: 0 0 20px rgba(79, 70, 229, 0.5); /* Свечение */
/* Применяем анимацию */
animation: loading 2s ease-in-out infinite;
}
/* Создаем сложный 3D-поворот */
@keyframes loading {
0% {
transform: rotateX(0) rotateY(0) rotateZ(0);
}
33% {
transform: rotateX(180deg) rotateY(0) rotateZ(0);
}
67% {
transform: rotateX(180deg) rotateY(180deg) rotateZ(0);
}
100% {
transform: rotateX(180deg) rotateY(180deg) rotateZ(180deg);
}
}
Что мы сделали:
- Создали круглый элемент с цветной границей только сверху (
border-top-color). - Добавили свечение через
box-shadow. - Назначили анимацию
loadingдлительностью 2 секунды с плавным ускорением и замедлением (ease-in-out), которая повторяется бесконечно. - В
@keyframesанимации мы поэтапно вращаем элемент по осям X, Y и Z. Поскольку поворот на 180 градусов по любой оси делает элемент симметричным самому себе, переход от 100% обратно к 0% происходит незаметно, что создает идеально плавный бесконечный цикл.
Заключение и лучшие практики
CSS анимации — это невероятно мощный инструмент в арсенале frontend-разработчика и дизайнера. Освоив свойства animation css и принципы работы @keyframes, вы сможете оживить интерфейсы, улучшить пользовательский опыт и создать уникальную атмосферу на сайте.
Напоследок, несколько важных советов:
- Умеренность — ключ к успеху. Анимации должны помогать, а не раздражать. Избегайте излишней «суеты» на странице.
- Производительность. Анимируйте свойства, которые браузер может эффективно обрабатывать:
transform (translate, rotate, scale)иopacity. Избегайте анимацииwidth,height,marginилиtop/left, так как они вызывают дорогостоящие перерасчеты макета (layout). - Доступность (A11y). Уважайте настройки пользователя. Используйте медиа-запрос
@media (prefers-reduced-motion: reduce)для отключения или упрощения анимаций для тех, кто страдает от морской болезни или просто предпочитает меньше движений. - Тестируйте на реальных устройствах. Анимация на мощном компьютере и на среднем смартфоне может ощущаться по-разному.
Не бойтесь экспериментировать. Начните с простых преобразований, изучите готовые библиотеки (как Animate.style) для вдохновения, а затем создавайте свои уникальные css keyframes animation. Со временем вы разовьете чувство времени и динамики, которое позволит вам создавать по-настоящему впечатляющие и функциональные цифровые продукты.
Готовы оживить ваш бренд в цифровом пространстве? Анимации и динамичные интерфейсы, созданные нашей командой экспертов, превратят ваш сайт в мощный инструмент вовлечения и продаж. Закажите профессиональную разработку — и ваше онлайн-представительство начнет говорить с клиентами на современном визуальном языке.