Как применить стиль к встроенному SVG?

Когда SVG напрямую включается в документ с помощью тега <svg>, вы можете применять стили CSS к SVG с помощью таблицы стилей документов. Тем не менее, я пытаюсь применить стиль к SVG, который встроен (с помощью тега <object>).

Можно ли использовать что-либо вроде следующего кода?

object svg { 
    fill: #fff; 
}

Ответ 1

Короткий ответ: нет, поскольку стили не применяются к границам документа.

Однако, поскольку у вас есть тег <object>, вы можете вставить таблицу стилей в документ svg с помощью script.

Что-то вроде этого, и обратите внимание, что этот код предполагает, что <object> загружен полностью:

var svgDoc = yourObjectElement.contentDocument;
var styleElement = svgDoc.createElementNS("http://www.w3.org/2000/svg", "style");
styleElement.textContent = "svg { fill: #fff }"; // add whatever you need here
svgDoc.getElementById("where-to-insert").appendChild(styleElement);

Также можно вставить элемент <link> для ссылки на внешнюю таблицу стилей:

var svgDoc = yourObjectElement.contentDocument;
var linkElm = svgDoc.createElementNS("http://www.w3.org/1999/xhtml", "link");
linkElm.setAttribute("href", "my-style.css");
linkElm.setAttribute("type", "text/css");
linkElm.setAttribute("rel", "stylesheet");
svgDoc.getElementById("where-to-insert").appendChild(linkElm);

Еще один вариант - использовать первый метод, вставить элемент стиля, а затем добавить правило @import, например styleElement.textContent = "@import url(my-style.css)".

Конечно, вы можете напрямую ссылаться на таблицу стилей из файла svg, не делая никаких скриптов. Любое из следующих действий должно работать:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="my-style.css" type="text/css"?>
<svg xmlns="http://www.w3.org/2000/svg">
  ... rest of document here ...
</svg>

или

<svg xmlns="http://www.w3.org/2000/svg">
  <defs>
    <link href="my-style.css" type="text/css" rel="stylesheet" 
          xmlns="http://www.w3.org/1999/xhtml"/>
  </defs>
  ... rest of document here ...
</svg>

Обновление 2015: вы можете использовать jquery-svg плагин для применения js-скриптов и стилей CSS для встроенного SVG.

Ответ 2

Вы можете сделать это без javsscrpt, поставив блок стиля со своими стилями внутри самого файла SVG.

<style type="text/css">
 path,
 circle,
 polygon { 
    fill: #fff; 
  }
</style>

Ответ 3

Если единственная причина использования тега для включения SVG заключается в том, что вы не хотите загромождать свой исходный код разметкой из SVG, вы должны взглянуть на инжектора SVG, такие как SVGInject.

Вложение SVG использует Javascript для вставки SVG файла в свой HTML-документ. Это позволяет использовать чистый исходный код HTML, делая SVG полностью настраиваемым с помощью CSS. Основной пример выглядит следующим образом:

<html>
<head>
  <script src="svg-inject.min.js"></script>
</head>
<body>
  <img src="image.svg" onload="SVGInject(this)" />
</body>
</html>