☰
ELEMENTOR / PRACTICE

SVG-иконки в Elementor через currentColor: единый стиль для всех состояний

SVG-иконки в Elementor через currentColor: единый стиль для всех состояний

Для обычного, hover- и активного состояния иконок в Elementor не обязательно создавать отдельные SVG-файлы. Если иконка использует значение currentColor, её цвет наследуется от CSS-свойства color родительского элемента.

Это позволяет управлять цветом иконки с помощью классов, глобальных стилей Elementor, псевдоклассов и media-запросов. Сам SVG при этом остаётся неизменным. Такой подход особенно удобен для кнопок, меню, карточек, списков преимуществ и декоративных иконок интерфейса.

Что такое currentColor в SVG

currentColor — это специальное CSS-значение, равное текущему значению свойства color. В обычном тексте оно позволяет использовать цвет текста для рамки, иконки или другого элемента. В SVG этот принцип работает с атрибутами fill и stroke.

Если в контуре иконки указано fill="currentColor", заливка получает цвет из CSS. Если используется stroke="currentColor", по тому же принципу окрашивается обводка.

Например, SVG с фиксированным fill="#2563eb" всегда будет синим, пока не изменить сам файл или не переопределить стиль. SVG с fill="currentColor" может стать оранжевым при наведении, белым на тёмном фоне или получить другой цвет в мобильной версии.

  • fill отвечает за заливку фигур.
  • stroke отвечает за линии и контуры.
  • color задаётся через CSS для элемента или его родительского контейнера.
  • currentColor не создаёт новый цвет, а использует уже заданный через color.
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
  <path d="..." fill="currentColor"/>
</svg>

Как подготовить SVG-файл к изменению цвета

Перед загрузкой иконки откройте SVG в текстовом редакторе или редакторе векторной графики, который позволяет просматривать код. Найдите фиксированные значения цветов в тегах svg, path, circle, rect, line и других элементах.

Замените конкретные цвета на currentColor. Это могут быть названия цветов, HEX-значения, rgb(), rgba() или hsl(). Если иконка состоит из нескольких контуров одного цвета, проверьте каждый из них, а не только внешний тег svg.

Не нужно заменять fill="none". Это значение означает отсутствие заливки, и его замена на currentColor может изменить внешний вид иконки. Также не изменяйте stroke-width, stroke-linecap и stroke-linejoin: они отвечают не за цвет, а за геометрию и способ отображения линий.

  • Замените fill="#000000" или fill="black" на fill="currentColor".
  • Замените stroke="#000000" на stroke="currentColor".
  • Проверьте inline-стили вроде style="fill:#2563eb" — они также могут фиксировать цвет.
  • Убедитесь, что в SVG нет нескольких слоёв с разными цветами, если нужна монохромная иконка.
  • После редактирования протестируйте файл отдельно: он должен корректно отображаться и не содержать лишних скриптов или опасного кода.
<!-- Было -->
<path d="..." fill="#2563eb"/>

<!-- Стало -->
<path d="..." fill="currentColor"/>

Как подключить SVG-иконку в Elementor

Чтобы currentColor работал, SVG должен быть частью HTML-документа или использоваться в контексте, где CSS может влиять на его содержимое. На практике подойдёт виджет Icon с собственной SVG-иконкой, если текущая конфигурация Elementor позволяет загрузить и отобразить её как SVG, либо вставка SVG inline через соответствующий HTML-элемент.

Добавьте иконку на страницу, а в разделе Advanced → CSS Classes назначьте внешнему элементу класс, например icon-accent. Если SVG вставляется вручную, убедитесь, что это именно inline-код в разметке, а не ссылка на файл через img.

После этого CSS-класс можно использовать как точку управления цветом. Elementor не изменяет сам SVG-файл, а только передаёт элементу нужное значение color.

  • Используйте Icon Widget или inline SVG.
  • Добавьте класс виджету или контейнеру, который содержит иконку.
  • Проверьте, что в коде SVG есть currentColor.
  • Очистите кеш после изменения файла, если браузер продолжает показывать старую версию.
.icon-accent {
  color: #2563eb;
}

.icon-accent:hover {
  color: #f97316;
}

.icon-accent svg {
  width: 24px;
  height: 24px;
}

Настройка обычного, hover- и активного состояния

Классический сценарий — синяя иконка в обычном состоянии и оранжевая при наведении. Поскольку SVG использует currentColor, достаточно изменить color у внешнего элемента. Все контуры, в которых указано currentColor, автоматически изменят оттенок.

Для активного пункта меню или выбранной карточки можно использовать дополнительный класс. Способ добавления класса зависит от структуры страницы: это может быть класс элемента, контейнера или состояние, которое формирует навигация.

Если иконка должна соответствовать цвету активного текста, удобно наследовать color вместо дублирования HEX-значений. Например, иконка внутри кнопки может автоматически оставаться белой во всех состояниях кнопки.

  • Обычное состояние: .icon-accent { color: #2563eb; }.
  • Hover: .icon-accent:hover { color: #f97316; }.
  • Фокус с клавиатуры: при необходимости добавьте .icon-accent:focus-visible.
  • Активное состояние: используйте класс вроде .is-active или селектор, соответствующий структуре компонента.
  • Для тёмной темы изменяйте color в media-запросе или через глобальный класс темы.
.icon-accent {
  color: #2563eb;
  transition: color 180ms ease;
}

.icon-accent:hover,
.icon-accent:focus-visible,
.icon-accent.is-active {
  color: #f97316;
}

@media (max-width: 767px) {
  .icon-accent {
    color: #1d4ed8;
  }
}

Почему SVG через Image Widget не реагирует на currentColor

Когда SVG добавляется как обычное изображение через Image Widget, браузер загружает его как внешний ресурс внутри элемента img. CSS-цвет родительского элемента не проникает внутрь такого SVG-документа, поэтому currentColor не получает ожидаемое значение.

В результате класс может изменить цвет самого img или контейнера, но не заливку контуров внутри файла. Это не ошибка currentColor, а ограничение способа подключения SVG.

Если нужно менять цвет внешнего SVG-файла, можно подготовить отдельные файлы, использовать CSS-маску для простых монохромных форм или подключить иконку inline. Для сценария с несколькими состояниями обычно удобнее всего использовать inline SVG или виджет, который вставляет SVG в DOM.

  • img src="icon.svg" — SVG остаётся внешним ресурсом.
  • Inline <svg>...</svg> — CSS может влиять на его fill и stroke.
  • Не путайте изменение opacity или filter у img с изменением fill внутри SVG.
  • Если Elementor очищает или не принимает inline-код, проверьте разрешённый способ добавления SVG в вашей конфигурации.

Типичные ошибки и проверка результата

Чаще всего currentColor не работает из-за того, что в одном из path остался жёстко заданный цвет. Другая распространённая причина — CSS-класс добавлен не тому элементу или стиль Elementor имеет более высокую специфичность.

Проверить проблему можно с помощью инструментов разработчика браузера. Наведите курсор на SVG во вкладке Elements, найдите path и посмотрите, какое фактическое значение fill или stroke применяется. Если там остался HEX-код, файл или стиль нужно исправить.

Отдельно проверьте hover, фокус с клавиатуры и мобильную ширину. На сенсорных устройствах hover не является полноценной заменой активного или focus-состояния, поэтому для важных интерактивных элементов стоит предусмотреть доступное состояние фокуса.

  • Фиксированный fill у path переопределяет ожидаемое изменение цвета.
  • style="fill:..." внутри SVG может иметь приоритет над простым CSS.
  • Для иконок с несколькими цветами currentColor превращает все соответствующие части в один цвет.
  • Не используйте цвет как единственный способ передать информацию о состоянии: добавьте текст, форму, подчёркивание или другой заметный сигнал.
  • Проверьте контраст иконки на фоне в каждом состоянии.
.icon-accent svg,
.icon-accent svg path {
  /* Используйте этот вариант только если базовый стиль не применяется */
  fill: currentColor;
}

.icon-accent svg path[fill="none"] {
  fill: none;
}

Частые вопросы

Можно ли использовать currentColor для stroke-иконки?

Да. В контурах, которые рисуются линией, замените фиксированное значение на stroke="currentColor". При необходимости оставьте fill="none", чтобы внутренняя область не закрашивалась.

Нужно ли создавать отдельный SVG для hover?

Нет, если форма иконки не меняется. Для изменения только цвета достаточно одного SVG с currentColor и CSS-правила для :hover, :focus-visible или активного класса.

Почему класс меняет цвет текста, но не иконки?

Проверьте, вставлен ли SVG inline или через виджет, который позволяет стилизовать его в DOM. Если иконка подключена через img, currentColor от родительского элемента не передаётся внутрь внешнего SVG.

Подходит ли currentColor для многоцветных SVG?

В основном нет, если нужно сохранить несколько разных цветов. Все части с currentColor унаследуют один цвет. Для многоцветной иконки используйте отдельные CSS-переменные, фиксированные цвета или другую структуру SVG.

Где лучше задавать размер SVG-иконки?

Размер можно задать через width и height для элемента svg или средствами самого виджета. Также важно проверить viewBox: без корректного viewBox масштабирование может работать неправильно.

Вывод

currentColor позволяет отделить внешний вид SVG от его цвета. Один подготовленный файл можно использовать в разных компонентах Elementor, меняя только CSS-свойство color.

Для корректной работы замените фиксированные значения fill и stroke на currentColor, подключайте иконку inline или через соответствующий Icon Widget и проверьте, не остались ли жёстко заданные стили внутри path. Так hover, активное состояние, тёмная тема и адаптивные изменения настраиваются без дублирования SVG-файлов.

← Все материалы Elementor