img src SVG изменение цвета заливки
HTML-код
<img src="logo.svg" alt="Logo" class="logo-img">
в CSS
.logo-img path {
fill: #000;
}
вышеупомянутый svg загружается и изначально fill: #fff
но когда я использую выше css
чтобы попытаться изменить его на черный, он не меняется, это мой первый раз, играя с SVG, и я не уверен, почему он не работает.
13 ответов
вам нужно сделать SVG встроенный SVG. Вы можете использовать этот скрипт, добавив класс svg
изображение:
/*
* Replace all SVG images with inline SVG
*/
jQuery('img.svg').each(function(){
var $img = jQuery(this);
var imgID = $img.attr('id');
var imgClass = $img.attr('class');
var imgURL = $img.attr('src');
jQuery.get(imgURL, function(data) {
// Get the SVG tag, ignore the rest
var $svg = jQuery(data).find('svg');
// Add replaced image's ID to the new SVG
if(typeof imgID !== 'undefined') {
$svg = $svg.attr('id', imgID);
}
// Add replaced image's classes to the new SVG
if(typeof imgClass !== 'undefined') {
$svg = $svg.attr('class', imgClass+' replaced-svg');
}
// Remove any invalid XML tags as per http://validator.w3.org
$svg = $svg.removeAttr('xmlns:a');
// Check if the viewport is set, if the viewport is not set the SVG wont't scale.
if(!$svg.attr('viewBox') && $svg.attr('height') && $svg.attr('width')) {
$svg.attr('viewBox', '0 0 ' + $svg.attr('height') + ' ' + $svg.attr('width'))
}
// Replace image with new SVG
$img.replaceWith($svg);
}, 'xml');
});
и затем, теперь, если вы это сделаете:
.logo-img path {
fill: #000;
}
или может быть:
.logo-img path {
background-color: #000;
}
это работает!
Скрипка:http://jsfiddle.net/wuSF7/462/
кредиты для вышеуказанного скрипта:как изменить цвет SVG-изображения с помощью CSS (jQuery SVG image замена)?
если ваша цель-просто изменить цвет логотипа, и вам не обязательно использовать CSS, тогда не используйте javascript или jquery, как было предложено некоторыми предыдущими ответами.
чтобы точно ответить на исходный вопрос, просто:
открыть
logo.svg
в текстовом редакторе.искать
fill: #fff
и заменитьfill: #000
например,logo.svg
может выглядеть так, когда открыт в текстовом редакторе:
<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0h24v24H0z" fill="none"/>
<path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z" fill="#fff"/>
</svg>
... просто измените заливку и сохранить.
вы можете установить svg в качестве маски. Таким образом, настройка цвета фона будет действовать как цвет заливки.
HTML-код
<div class="logo"></div>
в CSS
.logo {
background-color: red;
-webkit-mask: url(logo.svg) no-repeat center;
mask: url(logo.svg) no-repeat center;
}
JSFiddle: https://jsfiddle.net/KuhlTime/2j8exgcb/
обратите внимание, что этот метод не работает для браузера Edge. Вы можете проверить это, перейдя на этот сайт: https://caniuse.com/#search=mask
ответ от @Praveen твердый.
Я не мог заставить его ответить в моей работе, поэтому я сделал для него функцию наведения jQuery.
в CSS
.svg path {
transition:0.3s all !important;
}
JS / JQuery
// code from above wrapped into a function
replaceSVG();
// hover function
// hover over an element, and find the SVG that you want to change
$('.element').hover(function() {
var el = $(this);
var svg = el.find('svg path');
svg.attr('fill', '#CCC');
}, function() {
var el = $(this);
var svg = el.find('svg path');
svg.attr('fill', '#3A3A3A');
});
Почему бы не создать webfont с вашим svg-изображением или изображениями, импортировать webfont в css, а затем просто изменить цвет глифа с помощью атрибута цвета css? Не требуется JavaScript
этот ответ основан на ответе https://stackoverflow.com/a/24933495/3890888 но с простой версией JavaScript сценария, используемого там.
вам нужно сделать SVG встроенный SVG. Вы можете использовать этот скрипт, добавив класс svg
изображение:
/*
* Replace all SVG images with inline SVG
*/
document.querySelectorAll('img.svg').forEach(function(img){
var imgID = img.id;
var imgClass = img.className;
var imgURL = img.src;
fetch(imgURL).then(function(response) {
return response.text();
}).then(function(text){
var parser = new DOMParser();
var xmlDoc = parser.parseFromString(text, "text/xml");
// Get the SVG tag, ignore the rest
var svg = xmlDoc.getElementsByTagName('svg')[0];
// Add replaced image's ID to the new SVG
if(typeof imgID !== 'undefined') {
svg.setAttribute('id', imgID);
}
// Add replaced image's classes to the new SVG
if(typeof imgClass !== 'undefined') {
svg.setAttribute('class', imgClass+' replaced-svg');
}
// Remove any invalid XML tags as per http://validator.w3.org
svg.removeAttribute('xmlns:a');
// Check if the viewport is set, if the viewport is not set the SVG wont't scale.
if(!svg.getAttribute('viewBox') && svg.getAttribute('height') && svg.getAttribute('width')) {
svg.setAttribute('viewBox', '0 0 ' + svg.getAttribute('height') + ' ' + svg.getAttribute('width'))
}
// Replace image with new SVG
img.parentNode.replaceChild(svg, img);
});
});
и затем, теперь, если вы это сделаете:
.logo-img path {
fill: #000;
}
или может быть:
.logo-img path {
background-color: #000;
}
JSFiddle: http://jsfiddle.net/erxu0dzz/1/
чтобы развернуть ответ @gringo, метод Javascript, описанный в других ответах, работает, но требует, чтобы пользователь загружал ненужные файлы изображений, и IMO, он раздувает ваш код.
Я думаю, что лучшим подходом было бы перенести всю 1-цветную векторную графику в файл webfont. Я использовал Форт-Офигенно в прошлом, и он отлично работает, чтобы объединить ваши пользовательские значки / изображения в формате SVG, а также любые сторонние значки, которые вы можете использовать (шрифт Awesome, Bootstrap иконки и т. д.) в один файл webfont пользователь должен загрузить. Вы также можете настроить его, поэтому вы включаете только сторонние значки, которые вы используете. Это уменьшает количество запросов, которые страница должна сделать, и Вы общий вес страницы, особенно если вы уже включаете любые сторонние библиотеки значков.
Если вы предпочитаете более dev ориентированный вариант, вы могли бы Google "npm svg webfont" и используйте один из модулей узла, который наиболее подходит для вашего окружающая среда.
после того, как вы сделали любой из этих двух вариантов, вы можете легко изменить цвет с помощью CSS, и, скорее всего, вы ускорили свой сайт в этом процессе.
попробуйте чистый CSS:
.logo-img {
// to black
filter: invert(1);
// or to blue
// filter: invert(1) sepia(1) saturate(5) hue-rotate(175deg);
}
подробнее в этой статье https://blog.union.io/code/2017/08/10/img-svg-fill/
2018: Если вы хотите динамический цвет, не хотите использовать javascript и не хотите встроенный SVG, используйте переменную CSS. Работает в Chrome, Firefox и Safari. edit: и Edge
<svg>
<use xlink:href="logo.svg" style="--color_fill: #000;"></use>
</svg>
в вашем SVG замените любые экземпляры style="fill: #000"
С style="fill: var(--color_fill)"
.
основная проблема в вашем случае заключается в том, что вы импортируете svg из <img>
тег, который скроет структуру SVG.
вам нужно использовать <svg>
- тег в сочетании с <use>
чтобы получить желаемый эффект. Чтобы заставить его работать, вам нужно дать id
к пути, который вы хотите использовать в файле SVG <path id='myName'...>
чтобы затем иметь возможность получить их из <use xlink:href="#myName"/>
tag.
Попробуйте обрезанный ниже.
.icon {
display: inline-block;
width: 2em;
height: 2em;
transition: .5s;
fill: currentColor;
stroke-width: 5;
}
.icon:hover {
fill: rgba(255,255,255,0);
stroke: black;
stroke-width: 2;
}
.red {
color: red;
}
.blue {
color: blue;
}
<svg width="0" height="0">
<defs>
<path id="home" d="M100 59.375l-18.75-18.75v-28.125h-12.5v15.625l-18.75-18.75-50 50v3.125h12.5v31.25h31.25v-18.75h12.5v18.75h31.25v-31.25h12.5z"/>
</svg>
<span class="icon red">
<svg viewbox="0 0 100 100">
<use xlink:href="#home"/>
</svg>
</span>
<span class="icon blue">
<svg viewbox="0 0 100 100">
<use xlink:href="#home"/>
</svg>
</span>
обратите внимание, что вы можете поместить любой URL перед фрагментом #
если вы хотите загрузить SVG из внешний источник (и не вставлять его в свой HTML). Кроме того, обычно вы не указываете заливку в CSS. Лучше рассмотреть возможность использования fill:"currentColor"
внутри самого SVG. Затем будет использоваться значение цвета CSS соответствующего элемента.
поскольку SVG-это в основном код, вам нужно только содержание. Я использовал PHP для получения контента, но вы можете использовать все, что вы хотите.
<?php
$content = file_get_contents($pathToSVG);
?>
затем я напечатал содержимое "как есть" внутри контейнера div
<div class="fill-class"><?php echo $content;?></div>
для finnaly установить правило SVG childs контейнера на CSS
.fill-class > svg {
fill: orange;
}
я получил эти результаты с помощью значка материала SVG:
Mozilla Firefox 59.0.2 (64-разрядная версия) Linux
Google Chrome66.0.3359.181 (Build oficial) (64 бита) Linux
Opera 53.0.2907.37 Linux
сначала вам нужно будет ввести SVG в HTML DOM.
есть библиотека с открытым исходным кодом под названием SVGInject что делает это для вас. Он использует onload
атрибут для запуска инъекции.
вот минимальный пример использования SVGInject:
<html>
<head>
<script src="svg-inject.min.js"></script>
</head>
<body>
<img src="image.svg" onload="SVGInject(this)" />
</body>
</html>
после загрузки изображения onload="SVGInject(this)
вызовет инъекцию и <img>
элемент будет заменен содержимым SVG-файла, представленного в src
атрибут.
он решает несколько проблем с инъекцией SVG:
Свгс могут быть скрыты до инъекций закончила. Это важно, если стиль уже применяется во время загрузки, что в противном случае вызовет краткую "незаполненную вспышку содержимого".
на
<img>
элементы впрыснуть автоматически themselved. Если вы добавляете SVGs динамически, вам не нужно беспокоиться о вызове функции инъекции снова.случайная строка добавляется к каждому идентификатору в SVG, чтобы избежать наличия одного и того же идентификатора несколько раз в документе, если SVG вводится более одного раза.
SVGInject-простой Javascript и работает со всеми браузерами, поддерживающими SVG.
отказ от ответственности: я являюсь соавтором SVGInject
Если у вас есть доступ к JQuery, то, расширяя ответ Praveen, можно программно изменить цвет различных вложенных элементов внутри SVG:
$('svg').find('path, text').css('fill', '#ffffff');
в find вы можете указать различные элементы, которые необходимо изменить в цвете.