[html] 외부 CSS로 SVG 스타일을 지정하는 방법은 무엇입니까?

각 SVG 파일 내에서 직접적으로가 아니라 외부 스타일 시트를 통해 색상을 수정하고 싶은 여러 SVG 그래픽이 있습니다. 그래픽을 인라인으로 넣지 않고 내 이미지 폴더에 저장하고 가리키고 있습니다.

툴팁이 작동 할 수 있도록 이러한 방식으로 구현 <a>했으며 링크를 허용하기 위해 각각을 태그로 래핑했습니다 .

<a href='http://youtube.com/...' target='_blank'><img class='socIcon' src='images/socYouTube.svg' title='View my videos on YouTube' alt='YouTube' /></a>

다음은 SVG 그래픽의 코드입니다.

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="stylesheets/main.css" type="text/css"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 56.69 56.69">
<g>
    <path d="M28.44......./>
</g>
</svg>

외부 CSS 파일 (main.css)에 다음을 넣습니다.

.socIcon g {fill:red;}

그러나 그래픽에는 영향을 미치지 않습니다. 나는 또한 .socIcon g path {} 및 .socIcon path {}를 시도했습니다.

문제가 있거나 내 구현이 외부 CSS 수정을 허용하지 않거나 단계를 놓쳤습니까? 도와 주셔서 정말 감사합니다! 외부 스타일 시트를 통해 SVG 그래픽의 색상을 수정할 수있는 기능이 필요하지만 툴팁과 링크 기능을 잃을 수는 없습니다. (하지만 툴팁없이 살 수 있을지도 모릅니다.) 감사합니다!



답변

main.css 파일은 SVG 파일이 HTML에 인라인으로 포함 된 경우 SVG의 콘텐츠에만 영향을 미칩니다.

https://developer.mozilla.org/en/docs/SVG_In_HTML_Introduction

<html>
  <body>
  <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 56.69 56.69">
    <g>
      <path d="M28.44......./>
    </g>
  </svg>
</html>

SVG를 파일에 보관하려면 SVG 파일 내부에 CSS를 정의해야합니다.

스타일 태그로 할 수 있습니다.

http://www.w3.org/TR/SVG/styling.html#StyleElementExample

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
     width="50px" height="50px" viewBox="0 0 50 50">
  <defs>
    <style type="text/css"><![CDATA[
      .socIcon g {
        fill:red;
      }
    ]]></style>
  </defs>
  <g>
    <path d="M28.44......./>
  </g>
</svg>

서버 측 도구를 사용하여 활성 스타일에 따라 스타일 태그를 업데이트 할 수 있습니다. 루비에서는 Nokogiri로 이것을 달성 할 수 있습니다. SVG는 XML 일뿐입니다. 따라서이 작업을 수행 할 수있는 XML 라이브러리가 많이 있습니다.

그렇게 할 수 없다면 마치 PNG처럼 사용하면됩니다. 각 스타일에 대한 세트를 만들고 스타일을 인라인으로 저장합니다.


답변

한 가지 (중요한)주의 사항으로 원하는 작업을 수행 할 수 있습니다. 심볼 내의 경로는 외부 CSS를 통해 독립적으로 스타일을 지정할 수 없습니다.이 방법으로 전체 심볼에 대한 속성 만 설정할 수 있습니다. 따라서 심볼에 두 개의 경로가 있고 다른 채우기 색상을 갖기를 원하면 작동하지 않지만 모든 경로를 동일하게하려면 작동해야합니다.

HTML 파일에서 다음과 같은 것을 원합니다.

<style>
  .fill-red { fill: red; }
  .fill-blue { fill: blue; }
</style>

<a href="//www.example.com/">
  <svg class="fill-red">
    <use xlink:href="images/icons.svg#example"></use>
  </svg>
</a>

그리고 외부 SVG 파일에서 다음과 같은 것을 원합니다.

<svg xmlns="http://www.w3.org/2000/svg">
   <symbol id="example" viewBox="0 0 256 256">
    <path d="M120.... />
  </symbol>
</svg>

온 클래스를 스왑 svg에서 (당신의 HTML에) 태그 fill-redfill-blue 와 TA-다 … 당신은 빨간색 대신 파란색있다.

인라인 CSS가 우선하므로 특정 경로에서 일부 인라인 CSS와 외부 CSS를 혼합하고 일치시킴으로써 외부 CSS와 별도로 경로를 대상으로 지정할 수있는 한계를 부분적으로 피할 수 있습니다. 이 접근 방식은 외부 CSS를 통해 배경 색상을 변경하고 싶지만 아이콘 자체는 ​​항상 흰색 (또는 그 반대) 인 색상 배경에 흰색 아이콘과 같은 작업을 수행하는 경우에 효과적입니다. 따라서 이전과 동일한 HTML과이 svg 코드와 같은 것을 사용하면 빨간색 배경과 흰색 전경 경로가 표시됩니다.

<svg xmlns="http://www.w3.org/2000/svg">
  <symbol id="example" viewBox="0 0 256 256">
    <path class="background" d="M120..." />
    <path class="icon" style="fill: white;" d="M20..." />
  </symbol>
</svg>


답변

다음을 사용하여 SVG 파일에 외부 CSS 파일 링크를 포함 할 수 있습니다.

<link xmlns="http://www.w3.org/1999/xhtml" rel="stylesheet" href="mystyles.css" type="text/css"/>

태그를 여는 후에 다음을 입력해야합니다.

<svg>
  <link xmlns="http://www.w3.org/1999/xhtml" rel="stylesheet" href="mystyles.css" type="text/css"/>
  <g>
    <path d=.../>
  </g>
</svg>

SVG 파일을 수정해야하기 때문에 완벽한 솔루션은 아니지만 한 번만 수정하면 모든 SVG 파일에 대해 하나의 CSS 파일에서 모든 스타일 변경을 수행 할 수 있습니다.


답변

JavaScript에서 스타일 요소를 동적으로 만들고 SVG 요소에 추가하여 SVG 스타일을 지정할 수 있습니다. Hacky,하지만 작동합니다.

<object id="dynamic-svg" type="image/svg+xml" data="your-svg.svg">
    Your browser does not support SVG
</object>
<script>
    var svgHolder = document.querySelector('object#dynamic-svg');
    svgHolder.onload = function () {
        var svgDocument = svgHolder.contentDocument;
        var style = svgDocument.createElementNS("http://www.w3.org/2000/svg", "style");

        // Now (ab)use the @import directive to load make the browser load our css
        style.textContent = '@import url("/css/your-dynamic-css.css");';

        var svgElem = svgDocument.querySelector('svg');
        svgElem.insertBefore(style, svgElem.firstChild);
    };
</script>

원한다면 PHP에서 동적으로 JavaScript를 생성 할 수 있습니다. JavaScript에서 이것이 가능하다는 사실은 수많은 가능성을 열어줍니다.


답변

취할 수있는 한 가지 접근 방식은 CSS 필터를 사용하여 브라우저에서 SVG 그래픽의 모양을 변경하는 것입니다.

예를 들어 SVG 코드 내에 빨간색 채우기 색상을 사용하는 SVG 그래픽이있는 경우 180 도의 색조 회전 설정을 사용하여 보라색으로 바꿀 수 있습니다.

#theIdOfTheImgTagWithTheSVGInIt {
    filter: hue-rotate(180deg);
    -webkit-filter: hue-rotate(180deg);
    -moz-filter: hue-rotate(180deg);
    -o-filter: hue-rotate(180deg);
    -ms-filter: hue-rotate(180deg);
}

원하는 색상을 찾으려면 다른 색조 회전 설정을 시험해보십시오.

명확하게 말하면 위의 CSS는 HTML 문서에 적용된 CSS에 포함됩니다. SVG 코드의 스타일이 아니라 HTML 코드에서 img 태그의 스타일을 지정합니다.

그리고 이것은 검정, 흰색 또는 회색으로 채워진 그래픽에서는 작동하지 않습니다. 해당 색상의 색조를 회전하려면 실제 색상이 있어야합니다.


답변

외부 CSS 스타일 시트로 동적 스타일을 갖는 매우 빠른 솔루션입니다. <object>태그를 하여 svg를 포함 입니다.

이 예제는 루트에 클래스를 추가합니다. <svg> 상위 요소를 클릭 태그에 .

file.svg :

<?xml-stylesheet type="text/css" href="../svg.css"?>
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="">
  <g>
   <path/>
  </g>
 </svg>

html :

<a class="parent">
  <object data="file.svg"></object>
</a>

Jquery :

$(function() {
  $(document).on('click', '.parent', function(){
    $(this).find('object').contents().find('svg').attr("class","selected");
  }
});

클릭 부모 요소 :

 <svg xmlns="http://www.w3.org/2000/svg" viewBox="" class="selected">

그러면 CSS를 관리 할 수 ​​있습니다.

svg.css :

path {
 fill:none;
 stroke:#000;
 stroke-miterlimit:1.41;
 stroke-width:0.7px;
}

.selected path {
 fill:none;
 stroke:rgb(64, 136, 209);
 stroke-miterlimit:1.41;
 stroke-width:0.7px;
}


답변

먼저 외부 svg 이미지를 인라인하여 수행 할 수 있어야합니다. 아래 코드는 Jess Frazelle의 모든 SVG 이미지를 인라인 SVG교체 한 것입니다.

$('img.svg').each(function(){
  var $img = $(this);
  var imgID = $img.attr('id');
  var imgClass = $img.attr('class');
  var imgURL = $img.attr('src');
  $.get(imgURL, function(data) {
    // Get the SVG tag, ignore the rest
    var $svg = $(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');
    // Replace image with new SVG
    $img.replaceWith($svg);
  });
});