Подтвердить что ты не робот

Как создать SVG с помощью внешнего CSS?

У меня есть несколько графических файлов 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 {}.

Что-то не так, возможно, моя реализация не разрешает внешние модификации CSS, или я пропустил шаг? Я бы очень признателен за вашу помощь! Мне просто нужно изменить цвета изображения SVG через мою внешнюю таблицу стилей, но я не могу потерять подсказку и способность ссылок. (Я могу жить без подсказок.) Спасибо!

4b9b3361

Ответ 1

Ваш файл main.css будет влиять только на содержимое SVG, если SVG файл включен в HTML:

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 в файлах, CSS необходимо определить внутри SVG файла.

Вы можете сделать это с помощью тега стиля:

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>

Вы можете использовать инструмент на стороне сервера для обновления тега стиля в зависимости от активного стиля. В рубине вы могли добиться этого с Нокогири. SVG - это просто XML. Таким образом, возможно, существует много доступных XML-библиотек, которые, возможно, достигнут этого.

Если вы не можете этого сделать, вам придется просто использовать их, как если бы они были PNG; создавая набор для каждого стиля и сохраняя их встроенные стили.

Ответ 2

Вы можете делать то, что хотите, с одним (важным) предупреждением: пути внутри вашего символа не могут быть созданы независимо через внешний 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-red до fill-blue и ta-da... у вас есть синий, а не красный.

Вы можете частично ограничить ограничение возможности маршрутизировать пути отдельно с помощью внешнего 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>

Ответ 3

Можно создать стиль SVG, динамически создав элемент стиля в JavaScript и добавив его в элемент SVG. Хакки, но он работает.

<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>

Вы можете генерировать JavaScript динамически на PHP, если хотите - тот факт, что это возможно в JavaScript, открывает множество возможностей.

Ответ 4

Один из подходов, который вы можете использовать, - это просто использовать фильтры 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 идет в CSS, который применяется к вашему HTML-документу. Вы создаете тег img в HTML-коде, не устраивая код SVG.

И обратите внимание, что это не будет работать с графикой, заполненной черным или белым или серым. У вас должен быть фактический цвет, чтобы повернуть оттенок этого цвета.

Ответ 6

При использовании в теге <image> SVG должен содержаться в одном файле по соображениям конфиденциальности. Эта ошибка bugzilla содержит более подробную информацию о том, почему это так. К сожалению, вы не можете использовать другой тег, например <iframe>, потому что это не будет работать как ссылка, поэтому вам нужно будет встроить CSS в тег <style> внутри самого файла.

Другим способом сделать это будет наличие SVG-данных в главном html файле i.e.

<a href='http://youtube.com/...' target='_blank'>
  <svg 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>
</a>

Вы можете создать стиль с помощью внешнего файла CSS, используя тег HTML <link>.

Ответ 7

"Я собираюсь изменить цвета этих изображений на основе той цветовой схемы, которую пользователь выбрал для моего сайта". - Jordan 10 часов назад

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

<?php

    header('Content-Type: image/svg+xml');
    echo '<?xml version="1.0" encoding="utf-8"?>';
    $color = $_GET['color'];

?>
<!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 fill="<?php echo $color; ?>" d="M28.44..."/>
    </g>
</svg>

И позже вы можете использовать этот файл как filename.php?color=#ffffff, чтобы получить файл svg в желаемом цвете.

Ответ 8

Очень быстрое решение иметь динамический стиль с внешней таблицей стилей 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");
  }
});

на родительском элементе click:

 <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;
}

Ответ 9

Я знаю его старый пост, но просто для устранения этой проблемы... вы просто используете свои классы не в том месте: D

Прежде всего, вы можете использовать

svg { fill: red; }

в вашем main.css чтобы получить его красным. Это имеет эффект. Вы также можете использовать селектора узлов, чтобы получить конкретные шаблоны.

Во-вторых, вы объявили класс в img -Tag.

<img class='socIcon'....

Вы действительно должны объявить его в своем 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 class="myClassForMyPath" d="M28.44......./>
</g>
</svg>

теперь вы можете изменить цвет в своем main.css как

.myClassForMyPath {
    fill: yellow;
}

Ответ 10

Что работает для меня: тег стиля с правилом @import

<defs>
    <style type="text/css">
        @import url("svg-common.css");
    </style>
</defs>

Ответ 11

  1. Для внешних стилей

<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">

  <style>
	@import url(main.css);
  </style>

  <g>
    <path d="M28.44......./>
  </g>
</svg>

Ответ 12

@leo вот версия angularJS, еще раз спасибо

G.directive ( 'imgInlineSvg', function () {

return {
    restrict : 'C',
    scope : true,
    link : function ( scope, elem, attrs ) {

        if ( attrs.src ) {

            $ ( attrs ).each ( function () {
                var imgID    = attrs.class;
                var imgClass = attrs.class;
                var imgURL   = attrs.src;

                $.get ( imgURL, function ( data ) {

                    var $svg = $ ( data ).find ( 'svg' );
                    if ( typeof imgID !== 'undefined' ) {
                        $svg = $svg.attr ( 'id', imgID );
                    }

                    if ( typeof imgClass !== 'undefined' ) {
                        $svg = $svg.attr ( 'class', imgClass + ' replaced-svg' );
                    }

                    $svg = $svg.removeAttr ( 'xmlns:a' );

                    elem.replaceWith ( $svg );

                } );

            } );
        }

    }

}

} );

Ответ 13

Этот метод будет работать, если svg будет просмотрен в веб-браузере, но как только этот код будет загружен в раздел, а класс для значка svg будет закодирован, как если бы это было фоновое изображение, цвет был потерян и вернулся к цвету по умолчанию, Похоже, что цвет не может быть изменен из внешней таблицы стилей, хотя оба класса svg для цвета и класс верхнего уровня для отображения и положения svg оба отображаются в один и тот же каталог.