Укажите SVG в качестве фонового изображения и ТАКЖЕ стиль SVG в CSS? - PullRequest
25 голосов
/ 09 сентября 2011

Можно ли указать SVG в качестве фонового изображения и ТАКЖЕ стилизовать SVG в одном и том же файле CSS?

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

В псевдо CSS я хотел бы сделать следующее, чтобы изменить цвет простой фигуры в зависимости от класса родительского элемента:

element1 {
 background-image(icon.svg);
}

element1.black .svg-pathclass {
 fill: #000000;
}

element1.white .svg-pathclass {
 fill: #ffffff;
}

, очевидно, это предполагает путь в SVGимея класс .svg-pathclass

возможно ли это?

Ответы [ 3 ]

17 голосов
/ 09 сентября 2011

Нет, это невозможно. SVG должен быть подготовлен в одном документе (который может быть URI данных или файлом с внешней ссылкой) и , а затем использоваться в качестве фона в другом файле.

6 голосов
/ 18 ноября 2015

На самом деле для тех, кто может использовать препроцессоры в производстве, «вставляя» фоновый SVG и бит SASS mixins, который «разрезает» целую svg тарабарщину, можно получить доступ к частям, которыми вы хотите манипулировать с помощьюSASS variables.

В вашем исходном сценарии у вас есть элемент
<div class="element1"></div>,

, поэтому вам нужен mixin/function, который встроит SVG для вас.Допустим, вы хотите управлять fill, поэтому:

@mixin inline-svg($color, $svg-content) {
  $start: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><style>path { fill:#{$color}; }</style>';
  $end:   '</svg>';

  background-image: url('data:image/svg+xml;utf8, #{$start}#{$svg-content}#{$end}');
}

, где $svg-content - это ваш <svg> материал, исключающий элемент <style> (к которому вы хотите получить доступ изнутри mixin) и обертка svg tag ,, т.е.: $svg-content = "<path .... />"

Это просто необходимо включить в значения, передаваемые внутри:
@include inline-svg(salmon, $svg-content);

Чтобы подвести итог всегоЭто пример SASS код:

$svg-content = "<path .... />"

@mixin inline-svg($color, $svg-content) {
    $start: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><style>path { fill:#{$color}; }</style>';
    $end:   '</svg>';

    background-image: url('data:image/svg+xml;utf8, #{$start}#{$svg-content}#{$end}');
}  

.element1 {
    @include inline-svg(rgba(0,0,0,0.6), $svg-content);
}

Я думаю, что возможности здесь довольно велики (здесь также есть ограничения для этого подхода).На самом деле я передаю SASS map своему mixin со стилями css, определенными как пара key, value, чтобы ввести целую кучу стилей css в <style> часть svg.

Так что это технически возможно, но требует большей сложности, но как только вы это сделаете, вы получите преимущества от повторного использования этого mixin во всех ваших проектах, что круто.

6 голосов
/ 24 октября 2013

Вы можете использовать маски SVG и CSS, чтобы воссоздать этот эффект, затем используйте обычные CSS, чтобы придать стиль внутренней части SVG, даже background-image

-webkit-mask:   url(filename.svg) 50% 50% / 100px 50px no-repeat;
    -o-mask:    url(filename.svg) 50% 50% / 100px 50px no-repeat;
    -ms-mask:   url(filename.svg) 50% 50% / 100px 50px no-repeat;

background-color: red;
background-image: url(animated.gif);

/* Filename, Position / Size, Repeat */
/* Modernizr.cssmask is the test needed to pass - snippet below */

Это можно использовать для создания теней, добавив element к DOM и стилизовав его с более низким z-index и установив непрозрачность.

Надеюсь, это поможет!

Редактировать: Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...