How to apply a style to an embedded SVG?

前端 未结 3 833
终归单人心
终归单人心 2020-11-22 12:13

When an SVG is directly included in a document using the tag, you can apply CSS styles to the SVG via the document\'s stylesheet. However, I am tryi

相关标签:
3条回答
  • 2020-11-22 12:41

    Short answer: no, since styles don't apply across document boundaries.

    However, since you have an <object> tag you can insert the stylesheet into the svg document using script.

    Something like this, and note that this code assumes that the <object> has loaded fully:

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

    It's also possible to insert a <link> element to reference an external stylesheet:

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

    Yet another option is to use the first method, to insert a style element, and then add an @import rule, e.g styleElement.textContent = "@import url(my-style.css)".

    Of course you can directly link to the stylesheet from the svg file too, without doing any scripting. Either of the following should work:

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

    or:

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

    Update 2015: you can use jquery-svg plugin for apply js scripts and css styles to an embedded SVG.

    0 讨论(0)
  • 2020-11-22 12:47

    If the only reason for using the tag to inlcude the SVG is that you do not want to clutter your source code with the markup from the SVG, you should take a look at SVG injectors like SVGInject.

    SVG injection uses Javascript to inject an SVG file inline into your HTML document. This allows for clean HTML source code while making the SVGs fully styleable with CSS. A basic example looks like this:

    <html>
    <head>
      <script src="svg-inject.min.js"></script>
    </head>
    <body>
      <img src="image.svg" onload="SVGInject(this)" />
    </body>
    </html>
    
    0 讨论(0)
  • 2020-11-22 13:00

    You can do this without javsscrpt by putting a style block with your styles inside the SVG file itself.

    <style type="text/css">
     path,
     circle,
     polygon { 
        fill: #fff; 
      }
    </style>
    
    0 讨论(0)
提交回复
热议问题