SVG for images in browsers with PNG fallback

后端 未结 6 1811
梦如初夏
梦如初夏 2020-12-13 14:24

I\'m looking to use SVG versions of a company logo on a website. At present, all current versions of major browsers (IE, Safari, Chrome, Firefox, Opera) support SVG, so this

相关标签:
6条回答
  • 2020-12-13 15:04

    I wouldn't call it the preferred way, but if you want to pursue your second option this should detect SVG support (from Raphaël 1.5.2):

    if(window.SVGAngle || 
        document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") {
        // supports SVG
    else {
        // no SVG
    }
    

    Raphaël uses this to determine if it should render using VML (IE) or SVG (everyone else).

    Out of curiosity, why SVG for your logo? If you already have a PNG version, this seems like a lot of work.

    0 讨论(0)
  • 2020-12-13 15:07

    Try svg-web they have a number of different ways of displaying svg images including flash with automatic fallback.

    0 讨论(0)
  • 2020-12-13 15:11

    The only thing you need is CSS. First you declare the fallback image as a background-image. Then you can use multiple backgrounds to add the SVG.

    IE8 and below will ignore the second background-image-declaration, because the lacking support of multiple backgrounds.

    By the way, I'm using the img element here, because a logo is content, not layout. Using background-images might appear to be wrong in this context, but I disagree. You get the best of the worlds: SVG logo, fallback for

    HTML:

    <a href="/" class="site-logo">
        <!-- base64 encoded 1x1 px big transparent gif -->
        <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" alt="company logo">
    </a>
    

    CSS (using multiple background images):

    caniuse: multiple backgrounds

    • PNG for IE <9, FF <3.6, Opera <10.5
    • SVG for all the others supporting SVG
    • Android 2.x won't have a PNG or SVG, due to these versions actually supporting multiple backgrounds, but not SVG
    • There is only one HTTP request made for browsers supporting SVG
    .site-logo > img {
        /* Dimensions of your image need to be set */
        width: 32px;
        height: 32px;
    
        /* Fallback for <IE9 */
        background-image: url(logo.png);
    
        /* multiple backgrounds are ignored by <IE9 */
        background-image: url(logo.svg), none;
    }
    

    CSS (using linear gradients):

    caniuse: CSS gradients

    • PNG for IE <10, FF <3.6, Safari <4.0, Opera <11.1, Opera Mini, Opera Mobile <11.1
    • SVG for all the others supporting SVG (if vendor-prefixes are specified)
    • Ignoring the old gradient syntax for webkit makes Android 2.x use the PNG fallback
    .site-logo > img {
        /* Dimensions of your image need to be set */
        width: 32px;
        height: 32px;
    
        background: transparent url(logo.png) center center no-repeat;
        background-image: -webkit-linear-gradient(transparent, transparent), url(logo.svg);
        background-image:         linear-gradient(transparent, transparent), url(logo.svg);
    }
    
    0 讨论(0)
  • 2020-12-13 15:14

    To solve your problem w/resizing SVGs in the object tag:

    Add "preserveAspectRatio" and "viewBox" attributes to the svg tag. Open the file in a text editor and find the tag. in that tag, add the following attributes:

    preserveAspectRatio="xMinYMin meet" viewBox="0 0 {width} {height}"

    Replace {width} and {height} with some defaults for the viewBox. I use the values from the "width" and "height" attributes of the SVG tag. Save the SVG and it should now scale as expected.

    See: How do I scale a stubborn SVG embedded with the <object> tag?

    The problem w/SVGs in the object tag, though is that they swallow the clicks.

    SVG as background-image w/PNG fallback: http://www.broken-links.com/2010/06/14/using-svg-in-backgrounds-with-png-fallback/

    My favorite is using the img tag and an onerror handler to change the src tag to a PNG.

    Another good resource: http://www.schepers.cc/svg/blendups/embedding.html

    0 讨论(0)
  • 2020-12-13 15:19

    The best method I have found including SVG as an HTML element (with fallback) is this one:

    <svg preserveAspectRatio="xMidYMid meet" viewBox="0 0 100 100" style="width: 100px; height: 100px; vertical-align: top;">
        <image xlink:href="image.svg" src="fallback.png" width="100%" height="100%"/>
    </svg> 
    

    Pros:

    • Provides fallback in every device/browser I have tested (IE6-IE11, Android 2.0+, IOS3-7)
    • Only one image is loaded for each tested browser (except IE9-IE11)
    • Externally loaded images allows image to be cached

    Cons:

    • Unable to use as scaleable (responsive) image in IE9-IE11 (see this question)
    • IE9-IE11 loads both images
    • IOS3-4 (Mobile Safari) has SVG support but displays the PNG (since it lacks inline SVG support)
    • SVG file must not have height / width attributes (unsure about this, but have read about it somewhere and in my tests my SVG did not have them anyway)
    • Does not validate

    Please provide comments with additional pros / cons you can think of. I know for one SVG's can appear pixeled in some browsers, but I was unable to test zooming in since using browserstack for emulation.

    Source: http://lynn.ru/examples/svg/en.html

    0 讨论(0)
  • 2020-12-13 15:26

    This is an old question, but here is another solution:

    1. Download a version of Modernizr that is trimmed down to just testing SVG (assuming that’s the only test you need).

    2. Run the test. If it passes, put in the SVG. If it fails, put in the bitmap. Essentially:

      if (!Modernizr.svg) { 
          $("#logo").css("background-image", "url(fallback.png)"); 
      }
      

    SVG is a perfect use case for Modernizr, because there is no simple native way to provide a fallback.

    Note: The browser don't load both (png and svg) versions.

    For the record: the only reason you would need a fallback for SVG these days if you have to support IE 8 and down, or older Android.

    0 讨论(0)
提交回复
热议问题