SVG — это не просто статичные картинки. Это целые миры, готовые ожить при помощи нескольких строк CSS. Анимация SVG открывает двери в мир плавных, бесшовных и невероятно лёгких визуальных эффектов, которые украшают современный веб. Давайте разберёмся, как превратить векторную графику в динамичное искусство, понятно даже для новичков.
Почему именно SVG + CSS?
SVG (Scalable Vector Graphics) — это формат векторной графики на основе XML. Его ключевые преимущества для анимации: бесконечная масштабируемость без потери качества, лёгкий вес файлов и, самое главное, полный доступ к каждому элементу (пути, фигурам, группам) через CSS и JavaScript. В отличие от растровых форматов, вы анимируете не пиксели, а математические описания форм.
Важно: Для анимации SVG через CSS сам файл SVG должен быть встроён непосредственно в HTML-код страницы (inline SVG), а не подключён через тег <img>. Только так браузер предоставит доступ к его внутренним элементам.
Основные техники анимации
CSS предлагает два мощных инструмента для работы с анимацией SVG: Transitions (переходы) и Keyframes (ключевые кадры).
1. Простые переходы (transition)
Идеально для реакций на наведение (:hover) или клик. Вы меняете CSS-свойство, а браузер плавно интерполирует изменение.
.circle {
fill: #3498db;
transition: fill 0.5s ease, transform 0.7s;
}
.circle:hover {
fill: #e74c3c;
transform: scale(1.1);
}
2. Сложные последовательности (@keyframes)
Позволяют создавать сложные, циклические или последовательные анимации.
@keyframes dash {
to {
stroke-dashoffset: 0;
}
}
.path {
stroke-dasharray: 1000;
stroke-dashoffset: 1000;
animation: dash 3s ease-in-out forwards;
}
Что можно анимировать?
- Стилизация: `fill`, `stroke`, `opacity`, `stroke-width`.
- Трансформации: `transform` (translate, rotate, scale, skew). Важно: используйте `transform-box: fill-box;` для корректного вращения вокруг центра SVG-элемента.
- Специфичные свойства SVG: `stroke-dasharray` и `stroke-dashoffset` для знаменитого эффекта «рисующейся линии». `path` (сам путь) через CSS анимировать нельзя, но это можно сделать через SMIL или JS.
Практические примеры «из коробки»
Пример 1: Пульсирующая кнопка
Создаём SVG-круг и заставляем его ритмично пульсировать, меняя прозрачность и размер.
@keyframes pulse {
0%, 100% { transform: scale(1); opacity: 0.8; }
50% { transform: scale(1.05); opacity: 1; }
}
#pulse-button {
animation: pulse 2s infinite;
}
Пример 2: Эффект загрузки (loader)
Анимация вращения ирисок (stroke-dasharray) — классика жанра.
@keyframes rotate {
100% { transform: rotate(360deg); }
}
@keyframes dash {
0% { stroke-dasharray: 1, 150; stroke-dashoffset: 0; }
50% { stroke-dasharray: 90, 150; stroke-dashoffset: -35; }
100% { stroke-dasharray: 90, 150; stroke-dashoffset: -124; }
}
.loader-circle {
animation: rotate 2s linear infinite;
stroke-linecap: round;
}
.loader-path {
animation: dash 1.5s ease-in-out infinite;
}
Пример 3: Интерактивная иконка меню (гамбургер)
Три линии SVG, которые превращаются в крестик при наведении.
.line {
transition: transform 0.3s, opacity 0.3s;
}
.menu:hover .line-top {
transform: translateY(8px) rotate(45deg);
}
.menu:hover .line-middle {
opacity: 0;
}
.menu:hover .line-bottom {
transform: translateY(-8px) rotate(-45deg);
}
Производительность: Анимация свойств `transform` и `opacity` — самая эффективная с точки зрения производительности, так как она задействует аппаратное ускорение браузера. Старайтесь избегать анимации свойств, вызывающих перерасчёт макета (например, `width`, `height`, `top`, `left`).
Оптимизация и доступность
- Используйте `will-change: transform;` для сложных анимаций, чтобы предупредить браузер.
- Всегда предусматривайте возможность отключения анимации для пользователей с вестибулярными расстройствами с помощью медиа-запроса `@media (prefers-reduced-motion: reduce)`.
- Тестируйте на разных устройствах. Иногда стоит добавить `transform: translateZ(0);` для принудительного запуска GPU.
FAQ: Часто задаваемые вопросы
Можно ли анимировать сложные пути (path) в CSS?
Нет, CSS не позволяет напрямую анимировать атрибут `d` у тега <path>. Для морфинга форм (когда одна фигура плавно превращается в другую) потребуется JavaScript-библиотека (например, GSAP) или устаревшая технология SMIL.
Почему моя анимация не работает в некоторых браузерах?
Проверьте поддержку свойств на caniuse.com. Убедитесь, что SVG встроен инлайново. Для старых браузеров могут понадобиться вендорные префиксы (`-webkit-`, `-moz-`).
Что лучше для анимации SVG: CSS или JavaScript?
CSS отлично подходит для простых, декларативных анимаций, связанных с интерфейсом (наведение, появление). JavaScript (например, через библиотеку GSAP) необходим для сложных последовательностей, интерактивных анимаций, зависящих от скролла, или морфинга путей.
Как анимировать несколько элементов с задержкой?
Используйте свойство `animation-delay` для каждого элемента или задавайте разные ключевые кадры. Можно управлять этим через CSS-переменные или `nth-child`.
Анимация SVG с помощью CSS — это мощный и доступный инструмент в арсенале фронтенд-разработчика. Начните с простых переходов, экспериментируйте с `stroke-dashoffset`, и вы быстро сможете создавать живой, привлекательный и современный интерфейс.