Красивая SVG-анимация — это отлично. Но если она грузит процессор на 30%, вызывает лаги при скролле и сажает батарею телефона, пользователь просто закроет вкладку.
Лови технический гайд по **оптимизации SVG-анимации**: от экономии байтов до стабильных 60 FPS.
⚡ **Оптимизация SVG-анимации: от байтов до 60 FPS**
🔹 Уровень 1: Оптимизация файла (Payload)
Меньше код → быстрее парсинг DOM → быстрее старт анимации.
• SVGO (v3+): прогоняй всё через него. Обязательные плагины: `removeMetadata`, `cleanupAttrs`, `convertShapeToPath` (для единообразия), `mergePaths`.
• Упрощение путей: в Figma/Illustrator используй "Simplify Path". Меньше узлов в кривых Безье = короче строка `d` и меньше работы для браузера при морфинге.
• Инстансинг: если элемент повторяется (например, частицы), используй `<defs>` и `<use>`. Браузер рендерит геометрию один раз, экономя память.
🔹 Уровень 2: Оптимизация рендера (Compositing)**
Главный враг производительности — перерисовка (Paint) и пересчет макета (Layout).
• Золотое правило: анимируй только `transform` (scale, rotate, translate) и `opacity`. Эти свойства обрабатываются на GPU (Compositor Thread) без участия главного потока.
• Табу: никогда не анимируй `width`, `height`, `top`, `left`, `x`, `y` или `stroke-width` через CSS keyframes. Это гарантированный Layout Thrashing.
• Морфинг (`d`): анимация атрибута `d` — это тяжелая операция Paint. Если она необходима, убедись, что у начального и конечного пути одинаковое количество точек. Используй GSAP MorphSVG или CSS Houdini (где поддерживается), но применяй это точечно.
• `transform-box: fill-box`**: добавляй это свойство к анимируемым элементам. Оно заставляет `transform-origin` отсчитываться от границ самого элемента, а не всего SVG-холста. Это дешевле для браузера, чем вычислять проценты от `viewBox`.
🔹 **Уровень 3: Управление ресурсами (JS & DOM)**
• **Дисциплина `will-change`**: не вешай `will-change: transform` на всё подряд в CSS. Это резервирует слой в VRAM. Добавляй его через JS за кадр до начала анимации и удаляй по событию `animationend` или `transitionend`.
• **Intersection Observer**: не крути анимацию, если её не видно. Используй IO, чтобы ставить `animation-play-state: paused`, когда SVG уходит из viewport, и `running`, когда возвращается.
• **Web Animations API (WAAPI)**: для сложных JS-анимаций выбирай WAAPI (`element.animate()`) или GSAP. Они работают эффективнее, чем самописные циклы на `requestAnimationFrame`, и лучше интегрируются с движком браузера.
🔹 **Уровень 4: Доступность и батарея (A11y & Power)**
• **`@media (prefers-reduced-motion: reduce)`**: обязательно предоставляй фоллбек. Заменяй сложные движения на мгновенное появление (`opacity: 0` → `1`) или статичный кадр. Это не только про этику, но и про WCAG.
• Отключение при низком заряде: в PWA или сложных приложениях можно проверять `navigator.getBattery()` и отключать тя
Лови технический гайд по **оптимизации SVG-анимации**: от экономии байтов до стабильных 60 FPS.
⚡ **Оптимизация SVG-анимации: от байтов до 60 FPS**
🔹 Уровень 1: Оптимизация файла (Payload)
Меньше код → быстрее парсинг DOM → быстрее старт анимации.
• SVGO (v3+): прогоняй всё через него. Обязательные плагины: `removeMetadata`, `cleanupAttrs`, `convertShapeToPath` (для единообразия), `mergePaths`.
• Упрощение путей: в Figma/Illustrator используй "Simplify Path". Меньше узлов в кривых Безье = короче строка `d` и меньше работы для браузера при морфинге.
• Инстансинг: если элемент повторяется (например, частицы), используй `<defs>` и `<use>`. Браузер рендерит геометрию один раз, экономя память.
🔹 Уровень 2: Оптимизация рендера (Compositing)**
Главный враг производительности — перерисовка (Paint) и пересчет макета (Layout).
• Золотое правило: анимируй только `transform` (scale, rotate, translate) и `opacity`. Эти свойства обрабатываются на GPU (Compositor Thread) без участия главного потока.
• Табу: никогда не анимируй `width`, `height`, `top`, `left`, `x`, `y` или `stroke-width` через CSS keyframes. Это гарантированный Layout Thrashing.
• Морфинг (`d`): анимация атрибута `d` — это тяжелая операция Paint. Если она необходима, убедись, что у начального и конечного пути одинаковое количество точек. Используй GSAP MorphSVG или CSS Houdini (где поддерживается), но применяй это точечно.
• `transform-box: fill-box`**: добавляй это свойство к анимируемым элементам. Оно заставляет `transform-origin` отсчитываться от границ самого элемента, а не всего SVG-холста. Это дешевле для браузера, чем вычислять проценты от `viewBox`.
🔹 **Уровень 3: Управление ресурсами (JS & DOM)**
• **Дисциплина `will-change`**: не вешай `will-change: transform` на всё подряд в CSS. Это резервирует слой в VRAM. Добавляй его через JS за кадр до начала анимации и удаляй по событию `animationend` или `transitionend`.
• **Intersection Observer**: не крути анимацию, если её не видно. Используй IO, чтобы ставить `animation-play-state: paused`, когда SVG уходит из viewport, и `running`, когда возвращается.
• **Web Animations API (WAAPI)**: для сложных JS-анимаций выбирай WAAPI (`element.animate()`) или GSAP. Они работают эффективнее, чем самописные циклы на `requestAnimationFrame`, и лучше интегрируются с движком браузера.
🔹 **Уровень 4: Доступность и батарея (A11y & Power)**
• **`@media (prefers-reduced-motion: reduce)`**: обязательно предоставляй фоллбек. Заменяй сложные движения на мгновенное появление (`opacity: 0` → `1`) или статичный кадр. Это не только про этику, но и про WCAG.
• Отключение при низком заряде: в PWA или сложных приложениях можно проверять `navigator.getBattery()` и отключать тя