SVG и CSS — это идеальный дуэт для создания лёгкой, масштабируемой и невероятно красивой анимации прямо в браузере. В отличие от растровых форматов, SVG-графика остаётся чёткой на любых экранах, а CSS даёт вам контроль над каждым её элементом. От плавных переходов до сложных последовательностей — давайте погрузимся в мир, где код оживляет векторные формы.
Почему именно SVG + CSS?
Анимация SVG через CSS — это не просто модно, это практично. Такой подход обеспечивает высокую производительность (браузер оптимизирует рендеринг), отличную доступность для скринридеров и полную интеграцию с современным веб-стеком. Вы управляете анимацией через знакомые свойства, такие как transform, opacity, stroke-dasharray и fill.
Ключевое преимущество — независимость от разрешения. Ваша анимация будет выглядеть безупречно как на старом мониторе, так и на дисплее Retina.
Основные техники анимации
Существует несколько фундаментальных подходов к оживлению SVG.
1. Анимация через transition
Идеально для простых интерактивных эффектов при наведении или клике. Например, плавное изменение цвета заливки или поворот элемента.
.my-svg-circle {
fill: #3498db;
transition: fill 0.5s ease, transform 0.7s ease;
}
.my-svg-circle:hover {
fill: #e74c3c;
transform: scale(1.1);
}
2. Ключевые кадры с @keyframes
Для более сложных, многоэтапных анимаций. Позволяет создать последовательность изменений.
@keyframes draw {
to {
stroke-dashoffset: 0;
}
}
.path {
stroke-dasharray: 1000;
stroke-dashoffset: 1000;
animation: draw 3s ease-in-out forwards;
}
3. Анимация обводки (Stroke Drawing)
Один из самых эффектных приёмов — анимация «прорисовки» контура. Достигается манипуляцией свойствами stroke-dasharray и stroke-dashoffset.
Практические примеры «код-в-код»
Пример 1: Пульсирующая кнопка-иконка
Создадим простую иконку сердца, которая пульсирует при наведении.
<svg width=\"50\" height=\"50\" viewBox=\"0 0 24 24\">
<path class=\"heart\" d=\"M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z\"/>
</svg>
.heart {
fill: #ccc;
transition: all 0.3s ease;
}
.heart:hover {
fill: #ff4757;
animation: pulse 0.8s infinite alternate;
}
@keyframes pulse {
from { transform: scale(1); }
to { transform: scale(1.15); }
}
Пример 2: Загрузочный спиннер
Анимируем круговой прогресс-индикатор, используя ту же технику прорисовки обводки.
<svg width=\"60\" height=\"60\">
<circle class=\"spinner\" cx=\"30\" cy=\"30\" r=\"25\" stroke-width=\"4\" fill=\"none\"/>
</svg>
.spinner {
stroke: #4a6cf7;
stroke-linecap: round;
stroke-dasharray: 100;
stroke-dashoffset: 100;
animation: rotate 2s linear infinite, draw 1.5s ease-in-out infinite alternate;
}
@keyframes rotate {
100% { transform: rotate(360deg); }
}
@keyframes draw {
0% { stroke-dashoffset: 100; }
100% { stroke-dashoffset: 10; }
}
Всегда оптимизируйте SVG-файлы перед использованием! Удаляйте лишние метаданные и группируйте элементы с помощью инструментов вроде SVGO. Это уменьшит вес файла и упростит работу с кодом.
Продвинутые возможности
- Анимация по пути: Элемент можно заставить двигаться вдоль заданного SVG-пути с помощью
offset-pathиoffset-distance. - Морфинг форм: Хотя полноценный морфинг сложен на чистом CSS, плавные переходы между простыми формами (круг ↔ квадрат) возможны через анимацию
dдля path (требует одинакового количества точек). - Контроль времени: Используйте
animation-delayиanimation-fill-modeдля создания сложных каскадных анимаций отдельных частей иконки или иллюстрации.
FAQ: Часто задаваемые вопросы
Можно ли анимировать любые свойства SVG через CSS?
Не все. Наиболее совместимы и безопасны для анимации: трансформации (transform), прозрачность (opacity), свойства обводки (stroke-*) и заливки (fill, stroke). Анимация атрибутов, специфичных для SVG (например, d для path), имеет ограниченную поддержку.
Что лучше для сложной анимации: CSS или JavaScript (GSAP)?
CSS отлично подходит для перформанс-критичных, относительно простых анимаций и переходов. Для очень сложных сценариев, интерактивных анимаций, зависящих от скролла, или морфинга сложных форм лучше выбрать специализированные JS-библиотеки, такие как GSAP.
Почему моя анимация SVG тормозит на мобильных устройствах?
Частая причина — анимация свойств, вызывающих перерасчёт макета (layout), например, width/height у контейнера. Старайтесь анимировать только transform и opacity, так как они используют аппаратное ускорение (GPU).
Как сделать анимацию SVG адаптивной?
Используйте относительные единицы (%, vh, vw) или max-width для контейнера SVG. Внутри самого SVG задавайте атрибуту viewBox, но не width и height в HTML. Тогда SVG будет масштабироваться, сохраняя пропорции, а анимация будет работать корректно при любом размере.