Search code examples
htmlsafarisvglinear-gradients

SVG Linear gradient doesn't work in Safari


I've got an SVG object that contains a linear gradient embedded directly in a document. It works fine in Chrome and Firefox, but in Safari nothing is rendered. If I create the SVG as a file and embed it using the Object tag, it works fine in Safari. Other shapes and fills work, it's just linear gradient that doesn't work. I guess I could use the object, but I'd prefer to embed the SVG directly.

I've create a demo here (works in Chrome, not Safari): http://jsfiddle.net/sjKbN/

I came across this answer which suggests setting the content type to application/xhtml+xml, but this in itself seems to cause other problems.

Just wondering if anyone had come across any other fixes or ideas to get this working.


Solution

  • Your gradient will work in Safari if you wrap a defs tag around it:

    <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
         width="300px" height="300px" viewBox="0 0 300 300" enable-background="new 0 0 300 300" xml:space="preserve">
     <defs>
    <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="5.6665" y1="149.5" x2="293.333" y2="149.5">
        <stop  offset="0" style="stop-color:#FFF33B"/>
        <stop  offset="0.0595" style="stop-color:#FFE029"/>
        <stop  offset="0.1303" style="stop-color:#FFD218"/>
        <stop  offset="0.2032" style="stop-color:#FEC90F"/>
        <stop  offset="0.2809" style="stop-color:#FDC70C"/>
        <stop  offset="0.6685" style="stop-color:#F3903F"/>
        <stop  offset="0.8876" style="stop-color:#ED683C"/>
        <stop  offset="1" style="stop-color:#E93E3A"/>
    </linearGradient>
    </defs>
    <rect x="5.667" y="5.333" fill="url(#SVGID_1_)" width="287.667" height="288.333"/>
    </svg>
    

    ​It seems that wrapping your references in defs is encouraged but not obligatory according to spec. So this is a bug in Safari.