Раскрашивание SVG в фоновых изображениях CSS

Раскрашивание SVG в фоновых изображениях CSS
Раскрашивание SVG в фоновых изображениях CSS

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

Автор статьи Ноа Блон - веб-разработчик.

Мне нравится использовать SVG в качестве фоновых изображений в CSS, но плохо то, что вы не можете легко изменить fill цвет в CSS. Вот несколько способов обойти эту проблему.

SVG в фоновых изображениях CSS

Использование SVG в качестве фона в CSS позволяет использовать мощные свойства CSS для определения размера и положения фона. Это значительно упрощает определение размера SVG, поскольку изображение легко масштабируется до размера вашего элемента. Кроме того, SVG не загромождает разметку.

У встроенного SVG есть и другие преимущества. SVG в фоновом изображении можно кэшировать. Использование спрайтов изображений и встраивание SVG в виде URI данных также может повысить производительность.

CSS-маски

Это мой любимый метод, но ваш браузер должен поддерживать его. С помощью свойства mask вы создаёте маску, которая применяется к элементу. Там, где маска непрозрачна или сплошна, базовое изображение видно. Там, где она прозрачна, базовое изображение маскируется или скрывается. Синтаксис CSS mask-image похож на background-image.

.icon {
    background-color: red;
    -webkit-mask-image: url(icon.svg);
    mask-image: url(icon.svg);
}

Здесь я устанавливаю SVG в качестве маски.fill значка в SVG не имеет значения, потому что он маскирует фоновый слой красного цвета. Поэтому в результате получается красный значок. Для webkit я использую префикс.

Вашим фоном может быть цвет, изображение, градиент - что угодно.

Существует множество свойств, связанных с маской, таких как mask-position, mask-repeat, и mask-size, которые соответствуют свойствам CSS background: Вы можете использовать сокращение mask так же, как сокращение background:

.icon {
    background-color: red;
    -webkit-mask:  url(icon.svg) no-repeat 50% 50%;
    mask: url(icon.svg) no-repeat 50% 50%;
}

Маски поддерживаются в большинстве браузеров. Команда разработчиков IE рассматривает возможность поддержки CSS-масок. Firefox в настоящее время не поддерживает внешние SVG-маски.

CSS-фильтры

Вы можете применять к элементам DOM эффекты, подобные Photoshop, с помощью CSS-фильтров. Фильтры можно объединять в цепочки, и каждый фильтр будет воздействовать на результат предыдущего.

<svg
    xmlns="http://www.w3.org/2000/svg"
    width="24"
    height="24"
    viewbox="0 0 24 24">
    <path fill="red" d="M12 21.35l-1.45-1.32c-5.15-4.67-8.55-7.75-8.55-11.53 0-3.08 2.42-5.5 5.5-5.5 1.74 0 3.41.81 4.5 2.09 1.09-1.28 2.76-2.09 4.5-2.09 3.08 0 5.5 2.42 5.5 5.5 0 3.78-3.4 6.86-8.55 11.54l-1.45 1.31z"/>
</svg>
.icon-blue {
    -webkit-filter: hue-rotate(220deg) saturate(5);
    filter: hue-rotate(220deg) saturate(5);
}

В этом примере значок имеет чисто красный fill цвет в SVG. Фильтр hue-rotate поворачивает оттенок на 220 градусов вокруг цветового круга RGB. В результате значок становится синим. Алгоритм поворота оттенка не очень точный, поэтому, хотя результат должен быть чисто синим, он немного отличается. Один из способов исправить это и повысить насыщенность цвета — добавить saturation фильтр. В этом примере я добавил в цепочку произвольно большое значение пять, что увеличивает насыщенность на 500%.

Объединив фильтры в цепочку, вы можете создать множество цветных иконок на основе одной цветной иконки. С помощью различных комбинаций фильтров hue-rotateinvert, brightness и saturation я создал радужный спектр ROYGBIV и некоторые другие базовые цвета, такие как голубой и пурпурный.

Создать набор фильтров в оттенках серого довольно просто. Вы добавляете grayscale фильтр и настраиваете brightness фильтр в соответствии с нужным количеством оттенков серого.

Эта техника не очень интуитивно понятна. Возможно, вам придётся методом проб и ошибок найти нужные цвета, особенно учитывая, что алгоритмы неидеальны. В будущем было бы здорово, если бы фильтры CSS также работали в пространстве HSL, так как это было бы гораздо понятнее.

Фильтры CSS хорошо поддерживаются в большинстве браузеров. В IE они указаны как «в разработке», что означает, что они активно разрабатываются и скоро будут добавлены в IE.

URI данных

При правильном форматировании вы можете добавить SVG XML прямо в свой CSS. Используя этот метод и немного магии Sass, я создал несколько 

функций, которые позволяют динамически изменять цвет.

При такой настройке добавьте координаты пути вашего SVG в карту Sass с помощью ключа и вызовите функцию с вашими параметрами. Вы вызываете функцию с именем значка, которое соответствует ключу в карте. Вы можете передавать аргументы для color, stroke-color, и stroke-width. Вы также можете делать другие интересные вещи, например передавать любой допустимый для SVG CSS, как я сделал с stroke-dasharray в последнем примере.

При правильной кодировке URL это будет работать в IE. Очевидно, что это довольно сложно сделать правильно.

SVG Background Sprite

При создании спрайтов для SVG используются те же принципы, что и при создании обычных спрайтов. Спрайт содержит все версии изображения. Управляя background-size и background-position в CSS, вы выбираете, какую версию отображать. Вот как можно создать спрайт SVG:

Используйте атрибут пространства имён xmnls, иначе SVG не будет работать на вашем фоне. Также добавьте атрибут xmlns:xlink, если используете ссылки, которые я использую в тегах use. Тег width и height должны быть достаточно большими, чтобы вместить все изображения. В этом примере я использую 24 иконки размером 24x24, расположенные вертикально, поэтому размеры моего SVG составляют 24x576 (24 умножить на 24 = 576).

Я использую теги symbol и use для уменьшения размера файла. Определите форму значка как symbol и поместите его в блок defs. Присвойте ему id. Используйте тег use для создания версий этого символа. В теге use координата y настраивается таким образом, чтобы значки накладывались друг на друга с шагом в 24 единицы. Атрибут fill окрашивает значок. Вот демонстрация с набором разноцветных значков, созданных с помощью этой техники.

Я использую Sass здесь, чтобы упростить позиционирование фона.

Этот метод отлично работает везде, где поддерживается SVG. Поскольку вам нужно вручную создавать и добавлять новые версии иконок в спрайт, он довольно негибкий.

Это те методы, которые я смог придумать для раскрашивания SVG в качестве фонового изображения с помощью CSS. Есть ли другие? Возможно!

Понравилась статья?
Будем признательны, если поделитесь в соцсетях или мессенджерах, а также присоединитесь к нашей группе Вконтакте. Будет интересно!

Вас может заинтересовать:

Все, что вам нужно знать о форматах изображений в 2024 году
Все, что вам нужно знать о форматах изображений в 2024 году

Всегда пытаетесь пройти по канату между качеством изображения и размером файла? Хотите выйти из JPG и PNG в этом году? Все еще изучаете разницу между PDF и PSD? Мы вас прикрыли.


Фоновая волна на простом CSS
Фоновая волна на простом CSS
Рассмотрим в этой статье, как сделать фоновые волны на сайте, используя только возможности CSS3 и SVG файл. Т.е. без применения Javascript.

6 распространенных сбоев SVG (и как их исправить)
6 распространенных сбоев SVG (и как их исправить)

Поскольку SVG это часть DOM, мы можем проверять любой встроенный SVG в любом браузере DevTools. И из-за этого у нас есть возможность проанализировать ситуацию и выявить любые потенциальные проблемы или возможности для оптимизации SVG.


Приведение в движение: анимация автомобилей с помощью HTML и SVG
Приведение в движение: анимация автомобилей с помощью HTML и SVG
SVG <animateMotion> предоставляет способ определить, как элемент перемещается по траектории движения. В этой статье Пол Скэнлон делится идеей о том, как использовать это, анимируя гоночные автомобили в бесконечном цикле так же просто, как раз-два-три!

SVG иконки с открытым исходным кодом бесплатно
SVG иконки с открытым исходным кодом бесплатно

Иконки SVG формата во многом очень удобны при использовании на сайте - имеют малый размер, масштабируются без потери качества, встраиваются в код страниц.


CSS анимация обводки блоков
CSS анимация обводки блоков
Интересные эффекты для границ блоков контента с анимацией, которые вам могут пригодиться при оформлении страниц сайта.

QRcode

2010-2024 © Веб студия iNikSite.ru (г. Подольск). Все права сохранены.

Цены на сайте носят ознакомительный характер и не являются публичной офертой! Просим уточнять цены при отправке заявки в нашу компанию. У нас действуют специальные предложения и скидки на различные варианты исполнения заказа и 100% предоплату!

Мы используем файлы cookie. Они помогают улучшить ваше взаимодействие с сайтом.