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

Введение
Анимации в 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 — тогда ваши интерфейсы будут одновременно красивыми и быстрыми.



Комментарии
0