【问题标题】:Conditional code for displaying PNG in place of SVG for older browsers?用于显示 PNG 代替旧浏览器的 SVG 的条件代码?
【发布时间】:2012-02-15 07:08:11
【问题描述】:

我正在寻找一种方法,让旧版浏览器在检测到时显示 PNG 图像代替 SVG 作为后备。我网站的徽标目前是 SVG,但旧版浏览器,特别是 IE 8 及更低版本不会呈现它。我已经有了 PNG 的标志。执行此操作的最佳方法是什么?

谢谢

【问题讨论】:

标签: svg png conditional


【解决方案1】:

使用 HTML 条件 cmets。

<!--[if lte IE 8]><img src="logo.png" /><![endif]-->
<!--[if gt IE 8]><img src="logo.svg" /><![endif]-->
<!--[if !IE]> --><img src="logo.svg" /><!-- <![endif]-->

http://msdn.microsoft.com/en-us/library/ms537512%28v=vs.85%29.aspx

如果您还在为 IE 以外的浏览器寻找处理此问题的方法,则应使用 javascript 或 php 检查用户代理。

【讨论】:

  • 谢谢,效果很好。现在只剩下一个问题,我认为可以使用正确的代码轻松解决。在 IE 8 及更低版本中,PNG 显示正常,但 IE 中的灰色轮廓和红色 X 图标不知道如何处理 SVG 仍然存在。有没有办法让 IE 忽略我的 SVG IMG 标签?谢谢。
  • 这就是为什么您必须将所有三个条件 cmets 放在那里的原因。如果 .svg 在
【解决方案2】:
<object type="image/svg+xml" data="image.svg">
    <img src="image.png" alt="image"/>
</object>

【讨论】:

  • 一个小缺点是在这种情况下浏览器通常会同时下载这两种资源。
  • 另一个缺点是“object”元素可能有一些奇怪的事件行为,例如在许多浏览器中,附加到“对象”的 jQuery UI 工具提示会在鼠标移出时打开但不会关闭。
【解决方案3】:

当您检测到(通过Modernizr 或类似方法)浏览器本身不支持 SVG 时,我建议您重写 SVG 图像的 src 属性。比如:

if (!Modernizr.svg) {
    var imgs = document.getElementsByTagName('img');
    var endsWithDotSvg = /.*\.svg$/
    var i=0;
    var l = imgs.length;
    for (; i != l; ++i) {
        if (imgs[i].src.match(endsWithDotSvg)) {
            imgs[i].src = imgs[i].src.slice(0, -3) + "png";
        }
    }
}

【讨论】:

    【解决方案4】:

    我使用the "transparent gradient" technique,因为它是纯 CSS 的,不需要特定于浏览器的 hack。

    该技术基于能够使用 CSS 渐变的浏览器足够现代以支持 SVG 渲染这一事实。因此,如果我们使用由两层组成的背景图像,一层是 SVG,另一层是渐变,只有那些能够理解渐变语法的浏览器才会尝试显示 SVG。

    以下代码显示了基本的 CSS 规则:

    background: transparent url(fallback-image.png) center center no-repeat;
    background-image: -webkit-linear-gradient(transparent, transparent), url(vector-image.svg);
    background-image: -moz-linear-gradient(transparent, transparent), url(vector-image.svg);
    background-image: linear-gradient(transparent, transparent), url(vector-image.svg);
    

    使用此技术,所有用户都将看到图像,并且将使用最新浏览器版本的 SVG 显示。付出的代价是一些旧的浏览器版本(例如 IE9 或 Firefox 3.5)也能够渲染 SVG 但不支持渐变将显示回退版本。

    【讨论】:

      【解决方案5】:

      要跟进 Adiabatic 的评论: 您还可以将后备 img 路径设置为数据属性。这使您的后备路径更加灵活。

      示例(HTML +JS):

      <object type="image/svg+xml" data="image.svg" data-fallback="image.png"></object>
      
      <script>
      if (!Modernizr.svg) {
          var imgs = document.getElementsByTagName('img');
          var endsWithDotSvg = /.*\.svg$/
          var i=0;
          var l = imgs.length;
          for (; i != l; ++i) {
              if (imgs[i].src.match(endsWithDotSvg)) {
                 var fallback = imgs[i].getAttribute('data-fallback');
                 if(typeof fallback !== "undefined" && fallback !== "")
                 {
                     imgs[i].src = fallback;
                 }
              }
          }
      }
      </script>
      

      【讨论】:

        【解决方案6】:

        这个怎么样?

        <img src="your.svg" onerror="this.src=your.png">  
        

        也可以看看SVGeezy。

        【讨论】:

        • 这会在所有情况下加载 svg。如果 onerror 图像导致错误,它也可能引入无限循环。
        • @Nemo64 如果无法加载,它将替换 svg。大多数浏览器只检查一次onerror(例如 Chrome 和 FF 15+)。有关 Firefox 的更多信息,请参阅 bugzilla.mozilla.org/show_bug.cgi?id=528448 为了向后兼容,您只需在设置 src 之前添加 this.onerror=null;。
        • @Nemo64 虽然现在我推荐 SVGeezy 而不是这种方法,但许多流行的网站仍在使用这种方法。
        【解决方案7】:

        如果图像没有装饰,我更喜欢内容图像的“条件 cmets SVG 后备技术”,如 David Goss 所述。

        HTML:

        <a class="site-logo" href="/">
            <!--[if gte IE 9]><!--><img alt="Acme Supplies" src="logo.svg" data-fallback="logo.png" onerror="this.src=this.getAttribute('data-fallback');this.onerror=null;" /><!--<![endif]-->
            <!--[if lt IE 9]><img alt="Acme Supplies" src="logo.png" /><![endif]-->
        </a>
        

        http://davidgoss.co.uk/2013/01/30/use-svg-for-your-logo-and-still-support-old-ie-and-android/

        对于装饰性图像,我使用 Pau Giner 所描述的“透明渐变 SVG 后备技术”。

        CSS:

        .icon-file {
            background: transparent url(../images/file.png) center center no-repeat;
            background-image: -webkit-linear-gradient(transparent,transparent), url(../images-svg/file.svg);
            background-image:      -o-linear-gradient(transparent,transparent), url(../images-svg/file.svg);
            background-image:    -moz-linear-gradient(transparent,transparent), url(../images-svg/file.svg);
            background-image:     -ms-linear-gradient(transparent,transparent), url(../images-svg/file.svg);
            background-image:         linear-gradient(transparent,transparent), url(../images-svg/file.svg);
            background-size: 100%;
        }
        

        http://pauginer.com/post/36614680636/invisible-gradient-technique

        【讨论】:

          【解决方案8】:

          这个方法对我有用:

          <?php
          $browser = get_browser(null, true);
          $extension = "png";
          
          if ($browser['browser'] == "Chrome" && $browser['version'] >= 49){
              $extension = "svg";
          }else if($browser['browser'] == "Firefox" && $browser['version'] >= 57){
              $extension = "svg";
          }else if($browser['browser'] == "Opera" && $browser['version'] >= 49){
              $extension = "svg";
          }else if($browser['browser'] == "IE" && $browser['version'] >= 11){
              $extension = "svg";
          }else if($browser['browser'] == "Safari" && $browser['version'] >= 11){
              $extension = "svg";
          
          }
          ?>
          

          您告诉变量“$extension”是PNG,但如果浏览器版本能够呈现SVG,那么变量将更改为SVG。

          然后在您的 HTML 中,您只需完成文件扩展名,即可回显变量。

          <img src="image.<?php echo $extension ?>">
          

          现在您的网页将根据浏览器版本加载“image.png”或“image.svg”。

          重要信息:

          ** 为了使这个脚本工作,您需要设置文件 browscap.ini 以便您可以使用 PHP 函数“get_browser”。

          ** 有关 SVG 的浏览器功能来自此网站:

          https://caniuse.com/#search=svg

          【讨论】:

          • 所有现代浏览器多年来都支持 SVG。单击 caniuse 页面上的“显示所有”按钮以查看支持有多远。这个答案在 5 年前可能很有用,今天它完全没有意义,而且也不正确,因为 Firefox ESR 完全支持 SVG,但你会使用测试排除它。
          • 嗯...根据您所在的位置,不使用现代浏览器的人数可能会有很大差异。在我的环境中,至少这个脚本不是毫无意义的,它确实对我的项目有帮助....另一方面,我没有包含 Firefox ESR 的事实并没有使答案不正确,您只需要添加脚本的特定浏览器版本。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-05-12
          • 2012-04-23
          • 2012-02-17
          • 1970-01-01
          • 1970-01-01
          • 2012-08-21
          • 1970-01-01
          相关资源
          最近更新 更多