CSS를 사용하여 SVG 이미지의 색상을 변경하는 방법 (jQuery SVG 이미지 교체)?


437

이것은 내가 생각해 낸 편리한 코드의 자체 Q & A입니다.

현재 SVG 이미지를 포함하고 CSS를 통해 SVG 요소에 액세스하는 쉬운 방법은 없습니다. JS SVG 프레임 워크를 사용하는 방법에는 여러 가지가 있지만 롤오버 상태의 간단한 아이콘을 만드는 것만으로는 너무 복잡합니다.

그래서 내가 생각해 낸 것은 웹 사이트에서 SVG 파일을 사용하는 가장 쉬운 방법이라고 생각합니다. 초기 텍스트를 이미지로 대체하는 방법에서 개념을 취하지 만 SVG에 대해서는 결코 알고 있지 않은 한.

이것이 질문입니다.

JS-SVG 프레임 워크를 사용하지 않고 SVG에서 SVG를 포함시키고 색상을 변경하려면 어떻게해야합니까?


1
불행히도 img 태그는 IE의 svg 파일과 작동하지 않으므로 명심하십시오. IE는 내장 태그를 인식합니다. 어쨌든, 잘 했어!

2
svg의 경우 "fill"css 속성을 사용해야합니다. 이미지의 경우 "필터"를 사용하는 것이 좋습니다. "필터"는 실제로 두 가지 모두에 적용되지만 벡터 그래픽에 대해서는 해당 작업을 모두 수행 할 필요는 없습니다.
Samy Bencherif

답변:


536

먼저 HTML에 IMG 태그를 사용하여 SVG 그래픽을 포함시킵니다. 그래픽을 만들기 위해 Adobe Illustrator를 사용했습니다.

<img id="facebook-logo" class="svg social-link" src="/images/logo-facebook.svg"/>

이것은 일반 이미지를 삽입하는 방법과 같습니다. svg 클래스를 갖도록 IMG를 설정해야합니다. 'social-link'클래스는 단지 예를위한 것입니다. ID는 필요하지 않지만 유용합니다.

그런 다음이 jQuery 코드를 사용하십시오 (별도의 파일 또는 HEAD의 인라인).

    /**
     * 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');

                // Replace image with new SVG
                $img.replaceWith($svg);

            }, 'xml');

        });

위 코드는 'svg'클래스를 가진 모든 IMG를 찾아 링크 된 파일의 인라인 SVG로 대체합니다. 가장 큰 장점은 CSS를 사용하여 SVG의 색상을 다음과 같이 변경할 수 있다는 것입니다.

svg:hover path {
    fill: red;
}

필자가 작성한 jQuery 코드는 원래 이미지 ID 및 클래스를 포팅합니다. 따라서이 CSS도 작동합니다.

#facebook-logo:hover path {
    fill: red;
}

또는:

.social-link:hover path {
    fill: red;
}

http://labs.funkhausdesign.com/examples/img-svg/img-to-svg.html에서 작동하는 예를 볼 수 있습니다.

우리는 여기에 캐싱을 포함하는보다 복잡한 버전이 있습니다 : https://github.com/funkhaus/style-guide/blob/master/template/js/site.js#L32-L90


6
그것은 (예를 들어 용) Safari에서하지 작업 때로는 수도, 반환 된 데이터를 확인하는 것은 읽을 수는 remplace });와 $ 갔지의를}, 'xml');
조안

29
선택기를 대체 img[src$=".svg"]하고 svg클래스 가 필요 하지 않을 수도 있습니다.
Casey Chu

2
@LeonGaban 배경 이미지의 채우기를 타겟팅하는 방법이 없다고 생각합니다. 당신이 할 수 있다면 그것은 매우 도움이 될 것입니다!
Drew Baker

3
@LeonGaban 조금 늦었지만, 더 좋은 방법은 fill 속성을 완전히 제거하고 CSS 파일을 사용하여 부모 svg에 채우기를 추가하는 것입니다. $('#ico_company path').removeAttr('fill'). 그럼 당신은 #ico_company { fill: #ccc }CSS 파일에서 할 수 있습니다
bioball

2
@Soaku jQuery가 모든 경로를 글꼴 색상과 동일하게 설정하는 것이 쉽다. $ svg.find ( 'path'). attr ( 'fill', color); `그러나 이것이 CSS에 맡겨진 작업이라고 생각합니다.
Drew Baker

56

스타일

svg path {
    fill: #000;
}

스크립트

$(document).ready(function() {
    $('img[src$=".svg"]').each(function() {
        var $img = jQuery(this);
        var imgURL = $img.attr('src');
        var attributes = $img.prop("attributes");

        $.get(imgURL, function(data) {
            // Get the SVG tag, ignore the rest
            var $svg = jQuery(data).find('svg');

            // Remove any invalid XML tags
            $svg = $svg.removeAttr('xmlns:a');

            // Loop through IMG attributes and apply on SVG
            $.each(attributes, function() {
                $svg.attr(this.name, this.value);
            });

            // Replace IMG with SVG
            $img.replaceWith($svg);
        }, 'xml');
    });
});

1
너비 속성이 없으면 잘못된 숫자가 생성됩니다. width="170.667"내 경우에
stallingOne

2
이것은 이전 img 치수를 잃기 때문에 완벽하지 않습니다.
RichieHH 2016 년

안녕하세요, 서로 다른 색상으로 각각 다른 svg를 가지고 있다고 가정하십시오. 이 방법을 사용하면 모든 svg 색상이 반복되는 첫 번째 svg와 동일하게됩니다. 어떻게하면 각 색상이 이전과 동일하게 유지되도록이 문제를 해결할 수 있습니까?
tnkh

1
svg가 path(와 같은 rect) 모양 이 아닌 모양으로 만들어진 경우 CSS에서도 처리해야합니다.
Mugen

33

이제 대부분의 최신 브라우저 에서 IE11이 아닌 Edge를 포함 하여 CSS filter속성 을 사용할 수 있습니다 . SVG 이미지뿐만 아니라 다른 요소에서도 작동합니다. 다른 색상을 독립적으로 수정할 수는 없지만 색상을 사용 하거나 수정할 수 있습니다 . 다음 CSS 클래스를 사용하여 아이콘의 "비활성화 된"버전을 표시합니다 (원본은 채도가 높은 SVG 그림).hue-rotateinvert

.disabled {
    opacity: 0.4;
    filter: grayscale(100%);
    -webkit-filter: grayscale(100%);
}

대부분의 브라우저에서 밝은 회색으로 표시됩니다. IE (그리고 아마도 테스트하지 않은 Opera Mini)에서는 불투명 속성에 의해 눈에 띄게 희미 해집니다. 회색이 아니지만 여전히 꽤 좋아 보입니다.

다음은 Twemoji 벨 아이콘에 대한 네 가지 CSS 클래스 인 원본 (노란색), 위의 "비활성화 된"클래스 hue-rotate(녹색) 및 invert(파란색)의 예입니다.


아이콘 글꼴을 만들지 않으려면 반전이 좋은 해결책이라는 것을 알았습니다. 이 jQuery 코드를 사용하여 CSS 색상 속성에 따라 웹 사이트 헤더의 아이콘을 변경했습니다 (흰색 png 아이콘을 사용하고 있음에 if ($('.w3-top img').css("color") == "rgb(0, 0, 0)") { $('.w3-top img').css("filter", "invert(100%)"); $('.w3-top img').css("-webkit-filter", "invert(100%)"); };
유의

훌륭한 접근 방식. SVG 아이콘을 편집하여 대상 아이콘 색상을 추가 한 다음 .icon-disabled 클래스를 사용하여 회색으로 표시했습니다.
SushiGuy 2016 년

이전 탐색에서는 필터를 지원하지 않습니다. w3schools.com/cssref/css3_pr_filter.asp
JillAndMe

25

또는 당신은 CSS를 사용할 수 mask, 부여 브라우저 지원이 잘되지 않습니다하지만 당신은 대체를 사용할 수 있습니다

.frame {
    background: blue;
    -webkit-mask: url(image.svg) center / contain no-repeat;
}

14
MDN은-webkit-mask 프로덕션 웹 사이트에서 사용해서는 안된다고 지정 합니다 .
vaindil

1
svg를 색칠하지 않습니다
vishal

아마도 4 년 후이 솔루션은 모든 주요 브라우저에서 작동한다고 말할 수 있습니다. 여기서 테스트했으며 100 % 괜찮습니다.
Daniel Lemes

23

페이지에 파일을 포함시킬 수 있으면 (PHP 포함 또는 선택한 CMS를 통해 포함) SVG 코드를 추가하여 페이지에 포함 할 수 있습니다. 이것은 SVG 소스를 페이지에 붙여 넣는 것과 동일하게 작동하지만 페이지 마크 업을 더 깨끗하게 만듭니다.

이점은 자바 스크립트가 필요없는 CSS를 통해 SVG의 일부를 대상으로 지정할 수 있다는 것입니다.

http://codepen.io/chriscoyier/pen/evcBu

다음과 같은 CSS 규칙을 사용해야합니다.

#pathidorclass:hover { fill: #303 !important; }

!important채우기 색상을 무시 하려면 비트가 필요합니다.


3
AngularJS를 사용하는 사람들 :<div ng-include="'svg.svg'"></div>
Mikel

그러나 데이터베이스에 svg 데이터를 저장하는 매우 우아한 솔루션은 아닙니다. 틀린 것은 아니지만 템플릿이나 다른 자산을 사용하는 대신 API 또는 CMS에서 xml / html / svg DOM 데이터를 펌핑하는 것은 잘못된 느낌입니다.
ChristoKiwi

이 기여에 감사드립니다 ... 오늘날 가장 진보 된 사이트는 svg 데이터를 중첩하여 모든 종류의 활동을 허용합니다.
webMan

또한 SVG에 투명한 영역이있는 경우이 영역이 호버링으로 간주되지 않으며 "플래시 호버링"이 발생할 수 있습니다. 이를 고치려면 래퍼 요소 (편리한 경우 <a>)를 추가 한 다음 CSS 규칙에 추가하십시오. #pathidorclass:hover, .wrapperclass:hover #pathidorclass { fill: green; }또는 이제 래퍼 요소를 통해 대상을 지정하고 있기 때문에 SVG 경로의 원래 호버를 제거하십시오.
닐 먼로

18

@Drew Baker는이 문제를 해결하기위한 훌륭한 솔루션을 제공했습니다. 코드가 제대로 작동합니다. 그러나 AngularJ를 사용하는 사람들은 jQuery에 많은 의존성을 찾을 수 있습니다. 따라서 @Drew Baker의 솔루션을 따르는 코드 인 AngularJS 사용자에게 붙여 넣는 것이 좋습니다.

동일한 코드의 AngularJs 방식

1. HTML : html 파일에 다음 태그를 사용하십시오.

<svg-image src="/icons/my.svg" class="any-class-you-wish"></svg-image>

2. 지시문 : 이것은 태그를 인식해야하는 지시문입니다.

'use strict';
angular.module('myApp')
  .directive('svgImage', ['$http', function($http) {
    return {
      restrict: 'E',
      link: function(scope, element) {
        var imgURL = element.attr('src');
        // if you want to use ng-include, then
        // instead of the above line write the bellow:
        // var imgURL = element.attr('ng-include');
        var request = $http.get(
          imgURL,
          {'Content-Type': 'application/xml'}
        );

        scope.manipulateImgNode = function(data, elem){
          var $svg = angular.element(data)[4];
          var imgClass = elem.attr('class');
          if(typeof(imgClass) !== 'undefined') {
            var classes = imgClass.split(' ');
            for(var i = 0; i < classes.length; ++i){
              $svg.classList.add(classes[i]);
            }
          }
          $svg.removeAttribute('xmlns:a');
          return $svg;
        };

        request.success(function(data){
          element.replaceWith(scope.manipulateImgNode(data, element));
        });
      }
    };
  }]);

3. CSS :

.any-class-you-wish{
    border: 1px solid red;
    height: 300px;
    width:  120px
}

4. 카르마 재스민으로 단위 테스트 :

'use strict';

describe('Directive: svgImage', function() {

  var $rootScope, $compile, element, scope, $httpBackend, apiUrl, data;

  beforeEach(function() {
    module('myApp');

    inject(function($injector) {
      $rootScope = $injector.get('$rootScope');
      $compile = $injector.get('$compile');
      $httpBackend = $injector.get('$httpBackend');
      apiUrl = $injector.get('apiUrl');
    });

    scope = $rootScope.$new();
    element = angular.element('<svg-image src="/icons/icon-man.svg" class="svg"></svg-image>');
    element = $compile(element)(scope);

    spyOn(scope, 'manipulateImgNode').andCallThrough();
    $httpBackend.whenGET(apiUrl + 'me').respond(200, {});

    data = '<?xml version="1.0" encoding="utf-8"?>' +
      '<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->' +
      '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">' +
      '<!-- Obj -->' +
      '<!-- Obj -->' +
      '<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"' +
      'width="64px" height="64px" viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve">' +
        '<g>' +
          '<path fill="#F4A902" d=""/>' +
          '<path fill="#F4A902" d=""/>' +
        '</g>' +
      '</svg>';
    $httpBackend.expectGET('/icons/icon-man.svg').respond(200, data);
  });

  afterEach(function() {
    $httpBackend.verifyNoOutstandingExpectation();
    $httpBackend.verifyNoOutstandingRequest();
  });

  it('should call manipulateImgNode atleast once', function () {
    $httpBackend.flush();
    expect(scope.manipulateImgNode.callCount).toBe(1);
  });

  it('should return correct result', function () {
    $httpBackend.flush();
    var result = scope.manipulateImgNode(data, element);
    expect(result).toBeDefined();
  });

  it('should define classes', function () {
    $httpBackend.flush();
    var result = scope.manipulateImgNode(data, element);
    var classList = ["svg"];
    expect(result.classList[0]).toBe(classList[0]);
  });
});

1
해결책이 작동하지 않을 수 있습니다.<div ng-include="/icons/my.svg" class="any-class-you-wish"></div>
Guillaume Vincent

당신이 그것을 사용하려는 경우 @guillaumevincent ng-include그럼 그냥이 라인 변경 var imgURL = element.attr('src');var imgURL = element.attr('ng-include');
최대

이 방법은 매우 편리한 솔루션이지만 성능이 매우 떨어질 수 있으므로이 도구를 과도하게 사용하십시오.
skxc

1
IE의 코드에 문제가 있습니다. if (typeof(imgClass) !== 'undefined') { $svg.setAttribute("class", imgClass); }분할 및 for 루프 대신 사용할 수 있습니다 .
Robert Bokori 2016 년

2
멋진 일! 그러나 특정 이미지의 경우 svg ( angular.element(data)[0];) 의 첫 번째 요소를 잡고 IE에서 사용할 수 있도록해야합니다 if ($svg.getAttribute('class')) { $svg.setAttribute('class', $svg.getAttribute('class') + ' ' + imgClass); } else { $svg.setAttribute('class', imgClass); }. 또한 cache: true옵션에 추가하고 싶을 $http.get경우 페이지 속도가 매우 느려질 수 있습니다.
leo

16

CSS를 사용 하여이 작업을 수행하려고한다는 것을 알고 있지만 작고 간단한 이미지 인 경우 알림을 제공합니다. 메모장 ++에서 언제든지 열어서 경로 / 요소의 채우기를 변경할 수 있습니다.

<path style="fill:#010002;" d="M394.854,205.444c9.218-15.461,19.102-30.181,14.258-49.527
    ...
    C412.843,226.163,402.511,211.451,394.854,205.444z"/>

그것은 추악한 스크립트를 저장할 수 있습니다. 기본이 아닌 경우 죄송하지만 때로는 간단한 솔루션을 간과 할 수 있습니다.

... 여러 svg 이미지를 교체 하더라도이 질문의 일부 코드 스 니펫보다 크기가 작을 수 있습니다.


7

AngularJS 로이 문제를 해결하기위한 지시문을 작성했습니다. 여기서 사용할 수 있습니다 (ngReusableSvg) .

SVG 요소는 렌더링 된 후이를 대체하고 요소 안에 배치 div하여 CSS를 쉽게 변경할 수 있도록합니다. 이것은 크기 / 색이 다른 여러 장소에서 동일한 SVG 파일을 사용하는 데 도움이됩니다.

사용법은 간단합니다.

<object oa-reusable-svg
        data="my_icon.svg"
        type="image/svg+xml"
        class="svg-class"
        height="30"  // given to prevent UI glitches at switch time
        width="30">
</object>

그 후, 당신은 쉽게 가질 수 있습니다 :

.svg-class svg {
    fill: red; // whichever color you want
}

안녕하세요,이 솔루션을 제공해 주셔서 감사합니다. 나는 그것을 시도하고 그것을 산출한다 : <div ng-click = "eventHandler ()"ng-class = "classEventHandler ()"style = "height : 30px; width : 30px; float : left;" class = "svg-class"id = "my-svg"height = "30"width = "30"> [[object SVGSVGElement]] </ div> html에서 [[object SVGSVGElement]]를 넣습니다. 무슨 문제인지 아십니까? 또 다른 질문은 성능에 큰 영향을 미치거나 페이지의 많은 svg에 사용할 수 있습니까? 마지막으로, 여전히 각도 1.3 (정자)에 있습니다.
11

어떤 버전의 각도를 사용하고 있습니까? 문제가 발생하지 않았습니다. SVG에 문제가 있습니까? 성능면에서 스위치는 상대적으로 무겁기 때문에 10과 같이 직접 사용해 보았지만 괜찮 았습니다. 수량 / 크기에 따라 달라 지므로 시험 및 실험 해보십시오. bower의 문제점은 무엇입니까? 다른 버전을 사용하고 있으며 충돌이 있습니까?
Omri Aharon 2016 년

5

TL / DR : 여기로 이동-> https://codepen.io/sosuke/pen/Pjoqqp

설명:

나는 당신이 다음과 같은 HTML을 가지고 있다고 가정합니다 :

<img src="/img/source.svg" class="myClass">

필터 라우트를 확실히 찾으십시오. 당신의 svg는 대부분 검은 색 또는 흰색입니다. 필터를 적용하여 원하는 색상으로 만들 수 있습니다. 예를 들어 민트 그린을 원하는 검은 색 svg가 있습니다. 먼저 흰색 (기술적으로 모든 RGB 색상)으로 반전시킨 다음 색조 채도 등으로 재생합니다.

filter: invert(86%) sepia(21%) saturate(761%) hue-rotate(92deg) brightness(99%) contrast(107%);

더 좋은 방법은 원하는 16 진수를 필터로 변환하는 도구를 사용할 수 있다는 것입니다. https://codepen.io/sosuke/pen/Pjoqqp


이것은 훌륭한 CSS 전용 솔루션이며 16 진수에서 필터까지의 코드 펜은 훌륭합니다.
Richi González

4

knockout.js허용되는 답변 을 기반으로 한 버전은 다음과 같습니다 .

중요 : 실제로 교체에도 jQuery가 필요하지만 일부는 유용 할 것이라고 생각했습니다.

ko.bindingHandlers.svgConvert =
    {
        'init': function ()
        {
            return { 'controlsDescendantBindings': true };
        },

        'update': function (element, valueAccessor, allBindings, viewModel, bindingContext)
        {
            var $img = $(element);
            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);

            }, 'xml');

        }
    };

그런 다음 적용하십시오 data-bind="svgConvert: true" img 태그에 하십시오.

이 솔루션은 img태그를 SVG로 완전히 대체하며 추가 바인딩은 고려되지 않습니다.


2
대단해! 다음 단계로 옮기려면 캐싱이 포함 된 업데이트 된 버전이 있으므로 동일한 SVG가 두 번 요청되지 않습니다. github.com/funkhaus/style-guide/blob/master/template/js/…
Drew Baker

나는 그것에 대해 조금 걱정했지만 직접 조사 할 시간이 없었습니다. 그냥 빠른 것이 필요했습니다
Simon_Weaver

1
@DrewBaker 실제로 img 태그가 파일 get을 요청한 다음 다시 요청하는 것에 대해 더 걱정 했습니다. 태그 srcdata-src속성으로 변경하는 것을 고려 img했지만 최신 브라우저는 어쨌든 파일을 캐시하기에 충분히 똑똑하다고 결론을 내 렸습니다
Simon_Weaver

3

다음은 프레임 워크 코드가 없으며 순수한 js 만입니다.

document.querySelectorAll('img.svg').forEach(function(element) {
            var imgID = element.getAttribute('id')
            var imgClass = element.getAttribute('class')
            var imgURL = element.getAttribute('src')

            xhr = new XMLHttpRequest()
            xhr.onreadystatechange = function() {
                if(xhr.readyState == 4 && xhr.status == 200) {
                    var svg = xhr.responseXML.getElementsByTagName('svg')[0];

                    if(imgID != null) {
                         svg.setAttribute('id', imgID);
                    }

                    if(imgClass != null) {
                         svg.setAttribute('class', imgClass + ' replaced-svg');
                    }

                    svg.removeAttribute('xmlns:a')

                    if(!svg.hasAttribute('viewBox') && svg.hasAttribute('height') && svg.hasAttribute('width')) {
                        svg.setAttribute('viewBox', '0 0 ' + svg.getAttribute('height') + ' ' + svg.getAttribute('width'))
                    }
                    element.parentElement.replaceChild(svg, element)
                }
            }
            xhr.open('GET', imgURL, true)
            xhr.send(null)
        })

3

onload속성을 사용 하여 주입을 트리거하는 SVGInject라는 오픈 소스 라이브러리 가 있습니다. GitHub 프로젝트는https://github.com/iconfu/svg-inject

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 주입과 관련된 몇 가지 문제를 해결합니다.

  1. 주입이 완료 될 때까지 SVG를 숨길 수 있습니다. 로드 시간 동안 스타일이 이미 적용된 경우 중요합니다. 그렇지 않으면 짧은 "스타일이 지정되지 않은 콘텐츠 플래시"가 발생할 수 있습니다.

  2. <img>요소 자동 주입 themselved. SVG를 동적으로 추가하면 주입 기능을 다시 호출 할 필요가 없습니다.

  3. SVG가 두 번 이상 주입 된 경우 문서에서 동일한 ID를 여러 번 갖지 않도록 SVG의 각 ID에 임의의 문자열이 추가됩니다.

SVGInject는 일반 Javascript이며 SVG를 지원하는 모든 브라우저에서 작동합니다.

면책 조항 : 저는 SVGInject의 공동 저자입니다


1
동적으로 추가 된 SVG를 처리하기 때문에이 솔루션이 가장 좋습니다.
VickyB

2

우리가 그러한 svg 이미지를 더 많이 가지고 있다면 폰트 파일의 도움을받을 수도 있습니다. https://glyphter.com/
과 같은 사이트는 svgs에서 글꼴 파일을 얻을 수 있습니다.


예 :

@font-face {
    font-family: 'iconFont';
    src: url('iconFont.eot');
}
#target{
    color: white;
    font-size:96px;
    font-family:iconFont;
}

5
나는 개인적으로 "글꼴 이미지"기술을 싫어한다. 이미지를 추가 / 편집하기 어렵고 많은 의미없는 마크 업을 추가합니다. 글꼴은 글꼴이어야하고 이미지는 이미지 등이어야합니다.
Drew Baker

동의했다. 또한 문자에 할당 된 이미지를 기억 / 검색해야합니다. 그러나 이미지가 아이콘 / 단추 / 글 머리 기호로 사용되는 경우, 미디어보다 텍스트처럼 작동하는 경우 글꼴 파일도 대안이 될 수 있습니다.
Abhishek Borar

github조차 아이콘에 더 이상 글꼴을 사용하지 않습니다 github.com/blog/2112-delivering-octicons-with-svg
gagarine

2

이를 위해 데이터 이미지를 사용할 수 있습니다. data-image (data-URI)를 사용하면 인라인과 같은 SVG에 액세스 할 수 있습니다.

순수 CSS와 SVG를 사용한 롤오버 효과는 다음과 같습니다.

나는 그것이 지저분한 것을 알고 있지만 당신은 이런 식으로 할 수 있습니다.

 .action-btn {
    background-size: 20px 20px;
    background-position: center center;
    background-repeat: no-repeat;
    border-width: 1px;
    border-style: solid;
    border-radius: 30px;
    height: 40px;
    width: 60px;
    display: inline-block;
 }

.delete {
     background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg version='1.1' id='Capa_1' fill='#FB404B' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='482.428px' height='482.429px' viewBox='0 0 482.428 482.429' style='enable-background:new 0 0 482.428 482.429;' xml:space='preserve'%3e%3cg%3e%3cg%3e%3cpath d='M381.163,57.799h-75.094C302.323,25.316,274.686,0,241.214,0c-33.471,0-61.104,25.315-64.85,57.799h-75.098 c-30.39,0-55.111,24.728-55.111,55.117v2.828c0,23.223,14.46,43.1,34.83,51.199v260.369c0,30.39,24.724,55.117,55.112,55.117 h210.236c30.389,0,55.111-24.729,55.111-55.117V166.944c20.369-8.1,34.83-27.977,34.83-51.199v-2.828 C436.274,82.527,411.551,57.799,381.163,57.799z M241.214,26.139c19.037,0,34.927,13.645,38.443,31.66h-76.879 C206.293,39.783,222.184,26.139,241.214,26.139z M375.305,427.312c0,15.978-13,28.979-28.973,28.979H136.096 c-15.973,0-28.973-13.002-28.973-28.979V170.861h268.182V427.312z M410.135,115.744c0,15.978-13,28.979-28.973,28.979H101.266 c-15.973,0-28.973-13.001-28.973-28.979v-2.828c0-15.978,13-28.979,28.973-28.979h279.897c15.973,0,28.973,13.001,28.973,28.979 V115.744z'/%3e%3cpath d='M171.144,422.863c7.218,0,13.069-5.853,13.069-13.068V262.641c0-7.216-5.852-13.07-13.069-13.07 c-7.217,0-13.069,5.854-13.069,13.07v147.154C158.074,417.012,163.926,422.863,171.144,422.863z'/%3e%3cpath d='M241.214,422.863c7.218,0,13.07-5.853,13.07-13.068V262.641c0-7.216-5.854-13.07-13.07-13.07 c-7.217,0-13.069,5.854-13.069,13.07v147.154C228.145,417.012,233.996,422.863,241.214,422.863z'/%3e%3cpath d='M311.284,422.863c7.217,0,13.068-5.853,13.068-13.068V262.641c0-7.216-5.852-13.07-13.068-13.07 c-7.219,0-13.07,5.854-13.07,13.07v147.154C298.213,417.012,304.067,422.863,311.284,422.863z'/%3e%3c/g%3e%3c/g%3e%3c/svg%3e ");
     border-color:#FB404B;
     
 }
 
 .delete:hover {
     background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg version='1.1' id='Capa_1' fill='#fff' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='482.428px' height='482.429px' viewBox='0 0 482.428 482.429' style='enable-background:new 0 0 482.428 482.429;' xml:space='preserve'%3e%3cg%3e%3cg%3e%3cpath d='M381.163,57.799h-75.094C302.323,25.316,274.686,0,241.214,0c-33.471,0-61.104,25.315-64.85,57.799h-75.098 c-30.39,0-55.111,24.728-55.111,55.117v2.828c0,23.223,14.46,43.1,34.83,51.199v260.369c0,30.39,24.724,55.117,55.112,55.117 h210.236c30.389,0,55.111-24.729,55.111-55.117V166.944c20.369-8.1,34.83-27.977,34.83-51.199v-2.828 C436.274,82.527,411.551,57.799,381.163,57.799z M241.214,26.139c19.037,0,34.927,13.645,38.443,31.66h-76.879 C206.293,39.783,222.184,26.139,241.214,26.139z M375.305,427.312c0,15.978-13,28.979-28.973,28.979H136.096 c-15.973,0-28.973-13.002-28.973-28.979V170.861h268.182V427.312z M410.135,115.744c0,15.978-13,28.979-28.973,28.979H101.266 c-15.973,0-28.973-13.001-28.973-28.979v-2.828c0-15.978,13-28.979,28.973-28.979h279.897c15.973,0,28.973,13.001,28.973,28.979 V115.744z'/%3e%3cpath d='M171.144,422.863c7.218,0,13.069-5.853,13.069-13.068V262.641c0-7.216-5.852-13.07-13.069-13.07 c-7.217,0-13.069,5.854-13.069,13.07v147.154C158.074,417.012,163.926,422.863,171.144,422.863z'/%3e%3cpath d='M241.214,422.863c7.218,0,13.07-5.853,13.07-13.068V262.641c0-7.216-5.854-13.07-13.07-13.07 c-7.217,0-13.069,5.854-13.069,13.07v147.154C228.145,417.012,233.996,422.863,241.214,422.863z'/%3e%3cpath d='M311.284,422.863c7.217,0,13.068-5.853,13.068-13.068V262.641c0-7.216-5.852-13.07-13.068-13.07 c-7.219,0-13.07,5.854-13.07,13.07v147.154C298.213,417.012,304.067,422.863,311.284,422.863z'/%3e%3c/g%3e%3c/g%3e%3c/svg%3e ");        
     background-color: #FB404B;
    }
<a class="action-btn delete">&nbsp;</a>

여기에서 svg를 데이터 URL로 변환 할 수 있습니다

  1. https://codepen.io/elliz/full/ygvgay
  2. https://websemantics.uk/tools/svg-to-background-image-conversion/

호버에서 특정 경로 / 다각형 / 등 만 변경하려는 복잡한 SVG에서는 작동하지 않습니다.
Drew Baker

아니 당신은 매우 복잡한을 can..but
patelarpan

아이콘
전용

일부 아이콘이 작동하는 경우. 그럼 좋아요. 부트 스트랩 (4)는이 기술 사용
patelarpan

2

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 로이 결과를 얻었습니다.

  1. Mozilla Firefox 59.0.2 (64 비트) Linux

여기에 이미지 설명을 입력하십시오

  1. Google Chrome66.0.3359.181 (빌드 oficial) (64 비트) Linux

여기에 이미지 설명을 입력하십시오

  1. 오페라 53.0.2907.37 Linux

여기에 이미지 설명을 입력하십시오


1

jQuery가 DOM의 모든 svg 요소를 처리하고 DOM의 크기가 적당한 경우 선택한 솔루션이 좋습니다. 그러나 DOM이 크고 DOM의 일부를 동적으로로드하기로 결정한 경우 svg 요소를 업데이트하기 위해 전체 DOM을 다시 스캔 해야하는 것은 의미가 없습니다. 대신 jQuery 플러그인을 사용하여 다음을 수행하십시오.

/**
 * A jQuery plugin that loads an svg file and replaces the jQuery object with its contents.
 *
 * The path to the svg file is specified in the src attribute (which normally does not exist for an svg element).
 *
 * The width, height and class attributes in the loaded svg will be replaced by those that exist in the jQuery object's
 * underlying html. Note: All other attributes in the original element are lost including the style attribute. Place
 * any styles in a style class instead.
 */
(function ($) {
    $.fn.svgLoader = function () {
        var src = $(this).attr("src");
        var width = this.attr("width");
        var height = this.attr("height");
        var cls = this.attr("class");
        var ctx = $(this);

        // Get the svg file and replace the <svg> element.
        $.ajax({
            url: src,
            cache: false
        }).done(function (html) {
            let svg = $(html);
            svg.attr("width", width);
            svg.attr("height", height);
            svg.attr("class", cls);
            var newHtml = $('<a></a>').append(svg.clone()).html();
            ctx.replaceWith(newHtml);
        });

        return this;
    };

}(jQuery));

html에서 다음과 같이 svg 요소를 지정하십시오.

<svg src="images/someSvgFile.svg" height="45" width="45" class="mySVGClass"/>

그리고 플러그인을 적용하십시오 :

$(".mySVGClass").svgLoader();

예, 내가 준 코드를 사용하는 더 효율적인 방법이 있습니다. 프로덕션 사이트에서 실제로 사용하는 방법은 다음과 같습니다. SVG를 캐시합니다! github.com/funkhaus/style-guide/blob/master/template/js/…
Drew Baker

1

: 호버 이벤트 애니메이션의 경우 svg 파일에 스타일을 남길 수 있습니다.

<svg xmlns="http://www.w3.org/2000/svg">
<defs>
  <style>
  rect {
    fill:rgb(165,225,75);
    stroke:none;
    transition: 550ms ease-in-out;
    transform-origin:125px 125px;
  }
  rect:hover {
    fill:rgb(75,165,225);
    transform:rotate(360deg);
  }
  </style>
</defs>
  <rect x='50' y='50' width='150' height='150'/>
</svg>

svgshare에서 이것을 확인하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.