html
<img src="logo.svg" alt="Logo" class="logo-img">
CSS
.logo-img path {
fill: #000;
}
위의 svg 가로 드되고 기본적으로 fill: #fff
위의 css
검은 색으로 변경하려고 시도해도 변경되지 않습니다. 이것은 SVG를 처음 사용하는 이유이며 왜 작동하지 않는지 잘 모르겠습니다.
html
<img src="logo.svg" alt="Logo" class="logo-img">
CSS
.logo-img path {
fill: #000;
}
위의 svg 가로 드되고 기본적으로 fill: #fff
위의 css
검은 색으로 변경하려고 시도해도 변경되지 않습니다. 이것은 SVG를 처음 사용하는 이유이며 왜 작동하지 않는지 잘 모르겠습니다.
답변:
로고 색상을 변경하는 것이 목표이고 CSS를 사용해야 할 필요는 없지만 이전 답변에서 제안한대로 자바 스크립트 또는 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>
... 그냥 채우기를 변경하고 저장하십시오.
path
또는에 circle
항목 을 추가하면됩니다 <path fill="#777777" d="m129.774,74.409c-5.523,...
.
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/
MDN : https://developer.mozilla.org/en-US/docs/Web/CSS/mask
브라우저가이 기능을 지원하는지 확인하십시오 : https://caniuse.com/#search=mask
mask
입니다 invalid property value
. 크롬에서 이것을 테스트하고 있습니다.
순수한 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 : 동적 색상을 원한다면 자바 스크립트를 사용하지 않고 인라인 SVG를 원하지 않으면 CSS 변수를 사용하십시오. Chrome, Firefox 및 Safari에서 작동합니다. 편집 : 그리고 가장자리
<svg>
<use xlink:href="logo.svg" style="--color_fill: #000;"></use>
</svg>
SVG에서 모든 인스턴스를 style="fill: #000"
로 바꿉니다 style="fill: var(--color_fill)"
.
"This feature has been removed from the Web standards. Though some browsers may still support it, it is in the process of being dropped"
xlink:href
에 찬성하여 더 이상 사용되지 않는 것 같습니다 href
. 따라서 이것은 여전히 작동 할 수 있습니다.
먼저 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>
요소가 src
속성에 제공된 SVG 파일의 내용으로 대체됩니다 .
SVG 주입과 관련된 몇 가지 문제를 해결합니다.
주입이 완료 될 때까지 SVG를 숨길 수 있습니다. 로드 시간 동안 스타일이 이미 적용된 경우 중요합니다. 그렇지 않으면 짧은 "스타일이 지정되지 않은 콘텐츠 플래시"가 발생할 수 있습니다.
<img>
요소는 자동으로 자신을 주입. SVG를 동적으로 추가하면 주입 기능을 다시 호출 할 필요가 없습니다.
SVG가 두 번 이상 주입 된 경우 문서에서 동일한 ID를 여러 번 사용하지 않도록 SVG의 각 ID에 임의의 문자열이 추가됩니다.
SVGInject는 일반 Javascript이며 SVG를 지원하는 모든 브라우저에서 작동합니다.
면책 조항 : 저는 SVGInject의 공동 저자입니다
@Praveen의 대답은 확실합니다.
내 작업에서 응답 할 수 없으므로 jquery hover 함수를 만들었습니다.
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');
});
svg 이미지 또는 이미지로 웹 글꼴을 만들고 CSS에서 웹 글꼴을 가져온 다음 CSS 색상 속성을 사용하여 글리프의 색상을 변경하십시오. 자바 스크립트가 필요하지 않습니다
이 답변은 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/
parser.parseFromString(text, "image/svg+xml");
fetch
10.1 사파리에 추가 (한 developer.mozilla.org/en-US/docs/Web/API/Fetch_API ). 위의 jQuery 버전이 작동합니다.
필터를 사용하여 모든 색상으로 변환하십시오.
나는 최근 에이 솔루션을 찾았으며 누군가가 그것을 사용할 수 있기를 바랍니다. 이 솔루션은 필터를 사용하므로 모든 유형의 이미지와 함께 사용할 수 있습니다. svg만이 아닙니다.
색상을 변경하려는 단색 이미지가있는 경우 일부 필터를 사용하여이 작업을 수행 할 수 있습니다. 물론 여러 가지 색상의 이미지에서도 작동하지만 특정 색상을 타겟팅 할 수는 없습니다. 전체 이미지 만.
CSS 필터 만 사용하여 특정 색상으로 검정을 변환하는 방법에서 제안 된 스크립트에서 필터를 가져 왔습니다. 흰색을 임의의 색상으로 변경하려면 각 필터의 반전 값을 조정할 수 있습니다.
.startAsBlack{
display: inline-block;
width: 50px;
height: 50px;
background: black;
}
.black-green{
filter: invert(43%) sepia(96%) saturate(1237%) hue-rotate(88deg) brightness(128%) contrast(119%);
}
.black-red{
filter: invert(37%) sepia(93%) saturate(7471%) hue-rotate(356deg) brightness(91%) contrast(135%);
}
.black-blue{
filter: invert(12%) sepia(83%) saturate(5841%) hue-rotate(244deg) brightness(87%) contrast(153%);
}
.black-purple{
filter: invert(18%) sepia(98%) saturate(2657%) hue-rotate(289deg) brightness(121%) contrast(140%);
}
Black to any color: <br/>
<div class="startAsBlack black-green"></div>
<div class="startAsBlack black-red"></div>
<div class="startAsBlack black-blue"></div>
<div class="startAsBlack black-purple"></div>
@gringo 답변을 확장하려면 다른 답변에 설명 된 Javascript 방법이 작동하지만 사용자가 불필요한 이미지 파일을 다운로드해야하며 IMO가 필요하면 코드가 부풀어 오른다.
더 좋은 방법은 모든 1 색 벡터 그래픽을 웹 폰트 파일로 마이그레이션하는 것입니다. 내가 사용했던 포트가 굉장과거에는 을 사용자 정의 아이콘 / 이미지를 SVG 형식으로 결합하고 사용중인 타사 아이콘 (Font Awesome, Bootstrap 아이콘 등)을 단일 웹 글꼴 파일로 결합하는 것이 좋습니다. 사용자가 다운로드해야합니다. 사용자 정의 할 수도 있으므로 사용중인 타사 아이콘 만 포함하십시오. 이렇게하면 페이지 요청 횟수가 줄어들고 특히 타사 아이콘 라이브러리를 이미 포함하고있는 경우 전체 페이지 무게가 늘어납니다.
보다 개발 지향적 인 옵션을 선호하는 경우 Google "npm svg webfont" 를 사용하고 환경에 가장 적합한 노드 모듈 중 하나를 사용할 수 있습니다.
이 두 가지 옵션 중 하나를 수행하면 CSS를 통해 색상을 쉽게 변경할 수 있으며 프로세스에서 사이트를 빠르게 검색했을 수 있습니다.
단순한..
이 코드를 사용할 수 있습니다 :
<svg class="logo">
<use xlink:href="../../static/icons/logo.svg#Capa_1"></use>
</svg>
먼저 svg의 경로를 지정한 다음 ID를 작성하십시오 (이 경우 "Capa_1"). 편집기에서 svg를 열어서 ID를 얻을 수 있습니다.
CSS에서 :
.logo {
fill: red;
}
귀하의 경우 주요 문제 <img>
는 SVG 구조를 숨길 태그 에서 svg를 가져 오는 것입니다.
원하는 효과를 얻으려면 <svg>
태그와 함께 태그 를 사용해야합니다 <use>
. 제대로 작동하려면 id
SVG 파일에서 사용하려는 경로 를 제공 한 <path id='myName'...>
다음 <use xlink:href="#myName"/>
태그 에서 검색 할 수 있어야합니다 . 아래에서 찍어보십시오.
외부 소스#
에서 SVG를로드하고 HTML에 포함하지 않으려는 경우 조각 앞에 URL을 넣을 수 있습니다 . 또한 일반적으로 CSS에 채우기를 지정하지 않습니다. SVG 자체 내에서 사용하는 것이 좋습니다 . 그런 다음 해당 요소의 CSS 색상 값이 사용됩니다.fill:"currentColor"
SVG는 기본적으로 코드이므로 내용 만 있으면됩니다. PHP를 사용하여 내용을 얻었지만 원하는 것을 사용할 수 있습니다.
<?php
$content = file_get_contents($pathToSVG);
?>
그런 다음 div 컨테이너 안에 "있는 그대로"내용을 인쇄했습니다.
<div class="fill-class"><?php echo $content;?></div>
CSS에서 규칙을 컨테이너의 SVG 자식으로 규칙적으로 설정하려면
.fill-class > svg {
fill: orange;
}
재료 아이콘 SVG 로이 결과를 얻었습니다.
Mozilla Firefox 59.0.2 (64 비트) Linux
Google Chrome66.0.3359.181 (빌드 oficial) (64 비트) Linux
오페라 53.0.2907.37 Linux
이것은 PHP
함께 사용하는 사람들에게 도움이 될 수 있습니다.svg
CSS로 조작하려는 이미지 .
CSS로 img 태그 내부의 속성을 덮어 쓸 수 없습니다. 그러나 svg 소스 코드가 HTML에 포함되면 확실하게 할 수 있습니다. 내가 require_once
포함하는 기능 으로이 문제를 해결하고 싶습니다 ..svg.php
파일을 . 이미지를 가져 오는 것과 비슷하지만 CSS로 스타일을 덮어 쓸 수 있습니다!
먼저 svg 파일을 포함 시키십시오 :
<?php require_once( '/assets/images/my-icon.svg.php' ); ?>
그리고이 아이콘이 포함됩니다 :
<svg xmlns="http://www.w3.org/2000/svg" width="20.666" height="59.084" viewBox="0 0 20.666 59.084"><g transform="translate(-639.749 -3139)"><path d="M648.536,3173.876c0-2.875-1.725-3.8-3.471-3.8-1.683,0-3.49.9-3.49,3.8,0,3,1.786,3.8,3.49,3.8C646.811,3177.676,648.536,3176.769,648.536,3173.876Zm-3.471,2.341c-.883,0-1.437-.513-1.437-2.341,0-1.971.615-2.381,1.437-2.381.862,0,1.438.349,1.438,2.381,0,1.907-.616,2.339-1.438,2.339Z" fill="#142312"/><path d="M653.471,3170.076a1.565,1.565,0,0,0-1.416.9l-6.558,13.888h1.2a1.565,1.565,0,0,0,1.416-.9l6.559-13.887Z" fill="#142312"/><path d="M655.107,3177.263c-1.684,0-3.471.9-3.471,3.8,0,3,1.766,3.8,3.471,3.8,1.745,0,3.49-.9,3.49-3.8C658.6,3178.186,656.851,3177.263,655.107,3177.263Zm0,6.139c-.884,0-1.438-.514-1.438-2.34,0-1.972.617-2.381,1.438-2.381.862,0,1.437.349,1.437,2.381,0,1.909-.616,2.34-1.437,2.34Z" fill="#142312"/><path d="M656.263,3159.023l-1.49-14.063a1.35,1.35,0,0,0,.329-.293,1.319,1.319,0,0,0,.268-1.123l-.753-3.49a1.328,1.328,0,0,0-1.306-1.054h-6.448a1.336,1.336,0,0,0-1.311,1.068l-.71,3.493a1.344,1.344,0,0,0,.276,1.112,1.532,1.532,0,0,0,.283.262l-1.489,14.087c-1.7,1.727-4.153,4.871-4.153,8.638v28.924a1.339,1.339,0,0,0,1.168,1.49,1.357,1.357,0,0,0,.17.01h17.981a1.366,1.366,0,0,0,1.337-1.366v-29.059C660.414,3163.893,657.963,3160.749,656.263,3159.023Zm-8.307-17.349h4.274l.176.815H647.79Zm9.785,43.634v10.1H642.434v-17.253a4.728,4.728,0,0,1-2.028-4.284,4.661,4.661,0,0,1,2.028-4.215v-2c0-3.162,2.581-5.986,3.687-7.059a1.356,1.356,0,0,0,.4-.819l1.542-14.614H652.1l1.545,14.618a1.362,1.362,0,0,0,.4.819c1.109,1.072,3.688,3.9,3.688,7.059v9.153a5.457,5.457,0,0,1,0,8.5Z" fill="#142312"/></g></svg>
이제 CSS를 사용하여 채우기 색상을 쉽게 변경할 수 있습니다.
svg path {
fill: blue;
}
먼저이 문제를 해결하려고했지만 file_get_contents()
위의 솔루션이 훨씬 빠릅니다.
이것이 오래된 질문이라는 것을 알고 있지만 최근에 같은 문제가 발생하여 서버 측에서 해결했습니다. 이것은 PHP 전용 답변이지만 다른 envs에 비슷한 것이 있다고 긍정적입니다. img 태그를 사용하는 대신 svg를 get-go에서 svg로 렌더링합니다.
public static function print_svg($file){
$iconfile = new \DOMDocument();
$iconfile->load($file);
$tag = $iconfile->saveHTML($iconfile->getElementsByTagName('svg')[0]);
return $tag;
}
이제 파일을 렌더링하면 완전한 인라인 svg가 표시됩니다.