Подключение SVG‑иконок и перекраска CSS без потери качества
Чтобы добавить SVG-иконки и перекрашивать их без потери качества, используйте inline SVG или SVG-спрайт и задавайте цвет через fill/stroke: currentColor. Если иконка подключена как файл (<img> или background-image), перекраска ограничена — выручает mask-image.
Оглавление
Какой способ подключения выбрать
Для веба обычно хватает 3 рабочих сценариев: inline, спрайт, маска. Остальные — компромиссы.
Сравнение способов подключения SVG-иконок
| Способ | Перекраска CSS | Лучшее применение | Ограничения |
|---|---|---|---|
| Inline SVG в HTML | ✅ максимальная | hover/transition, разные части иконки | больше разметки |
SVG sprite (symbol + use) | ✅ хорошая | много иконок на сайте, единый набор | важна дисциплина в атрибутах внутри symbol |
<img src="icon.svg"> | ❌ почти нет | контентные картинки, простая вставка | CSS не видит внутренние path |
background-image: url(icon.svg) | ❌ почти нет | декоративные элементы | трудно управлять цветом/состояниями |
mask-image + background-color | ✅ (монохром) | быстро перекрасить внешний SVG | только “силуэт”, без многоцветности |
Если нужна стабильная перекраска “как у текста” — делайте иконки одноцветными и используйте fill="currentColor" или stroke="currentColor".
Как правильно перекрашивать: fill, stroke и currentColor
Есть две главные модели иконок:
- заливка (fill) — большинство “плоских” иконок;
- обводка (stroke) — линейные иконки.
Inline SVG: самый управляемый вариант
<button class="btn">
<svg class="icon" viewBox="0 0 24 24" aria-hidden="true">
<path d="M12 2l9 4.5-9 4.5L3 6.5 12 2z"></path>
</svg>
Уведомления
</button>
.btn { color: #111; }
.btn:hover { color: #0a66ff; }
.icon{
width: 20px;
height: 20px;
fill: currentColor; /* наследует цвет текста */
transition: transform .2s ease, fill .2s ease;
}
.btn:hover .icon{ transform: translateY(-1px); }
Для “stroke”-иконок
.icon-stroke{
width: 20px;
height: 20px;
stroke: currentColor;
fill: none;
stroke-width: 2;
stroke-linecap: round;
stroke-linejoin: round;
}
Частая причина “не красится”: в SVG внутри стоит жёсткий fill="#000" / stroke="#000". Такой атрибут часто перебивает CSS. Решение — удалить его или заменить на currentColor.
Когда SVG уже подключен файлом: img, background и маска
Почему <img> и background-image не перекрашиваются
<img src="icon.svg"> и background-image: url(icon.svg) подгружают SVG как внешний ресурс, поэтому ваш CSS не может обратиться к его внутренним элементам (<path>, <g>) и поменять fill/stroke.
Если вы не готовы переписывать разметку на inline/sprite, используйте маску.
Монохромная перекраска через mask-image
.icon-mask{
width: 20px;
height: 20px;
background-color: #111;
-webkit-mask: url("/icons/bell.svg") no-repeat center / contain;
mask: url("/icons/bell.svg") no-repeat center / contain;
}
.icon-mask.is-active{ background-color: #0a66ff; }
Маска сохраняет чёткость (это всё ещё вектор), но превращает иконку в “трафарет”: градиенты и несколько цветов не сохранятся.
Частые ошибки
- Пытаются красить
fillу<img>илиbackground-image— там это не работает. - Внутри SVG оставили
fill="#000"/stroke="#000"и ждут, чтоcurrentColorперебьёт. - Линейную иконку красят через
fill, хотя нужноstroke. - Нет
viewBox: иконка плохо масштабируется и “ломается” при смене размеров. - В спрайте разные иконки с разной логикой (часть через
fill, часть черезstroke) без общих правил — потом сложно поддерживать.
FAQ
Можно ли перекрашивать многоцветные SVG одной CSS-командой?
Полностью — редко. Проще делать inline и управлять частями по классам/селектором или иметь отдельные версии для тем.
Как сделать, чтобы иконка автоматически принимала цвет текста/ссылки?
Задайте элементам внутри SVG fill="currentColor" (или stroke="currentColor") и управляйте цветом через color у родителя.
Что выбрать для большого проекта с десятками иконок?
Обычно лучший баланс — SVG sprite (один набор иконок) + правило “все монохромные иконки используют currentColor”.
Оптимизация SVG ухудшит качество?
Нет, если это вектор. Оптимизация обычно убирает метаданные и лишние атрибуты, снижая вес без потери чёткости.