【问题标题】:How can I embed SVG/PNG based on support without JavaScript?如何在没有 JavaScript 的情况下基于支持嵌入 SVG/PNG?
【发布时间】:2012-01-09 20:43:58
【问题描述】:

我正在尝试在网站上嵌入 SVG 图像。我将使用 Modernizr 来检测 SVG 兼容性。 我看过 SVGWeb 和其他的,我现在不想使用它们。

我想做的是: 如果浏览器支持 SVG,则在 HTML5 页面中嵌入 SVG 图像。 如果没有,请使用 <img> 标签放置一个 PNG 替代品。

我希望这张图片成为 HTML 的一部分,而不是通过 CSS 的 background-image 属性添加它。

我还希望 Google 可以轻松读取图像及其元数据(alt 用于 img/desc 用于 svg),因此我不确定是否应该通过 JQuery 来执行此操作。

对最好的方法有什么建议吗?

谢谢。

【问题讨论】:

    标签: svg


    【解决方案1】:

    您是否考虑过使用SVG images in the <img> element

    如果您在服务器端执行此操作,那么有很多方法可以执行此操作,包括 content negotiation,它可能有效,也可能无效。

    或者,您可以压缩所有图像的 src 属性并使用以下内容重写它们:

    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";
        }
    }
    

    【讨论】:

    • 我读了一大堆文章,其中大多数说 img 标签中的 svg 不受支持……但那些肯定是过时的文章。我想我现在就开始使用 img 标签。关于内容协商,我不知道这有多可靠……必须再研究一下。
    • 如果这有帮助,你有considered accepting it as an answer吗?
    • 我实际上使用了两个答案的组合: if (Modernizr.svg) { $('img.svg').attr('src', function() { return $(this). attr('src').replace('.png', '.svg'); });缩进 4 个空格来显示格式化代码似乎对我不起作用:/
    • @Housni 您可以使用 CSS“以”结尾的选择器,而不是为所有图像添加多余的类名:$(img[src$=".png"])
    • @HughGuiney,如果我想用 SVG 替换每个 PNG,这是个好主意。但是,有些图像我找不到 SVG,所以我最终坚持使用我提到的解决方案 :)
    【解决方案2】:

    如果您不想在客户端使用 JavaScript,那么您最终必然会在服务器端使用 JavaScript。我可以想象的是,您可以检查访问者使用哪个浏览器(和版本)的 UserAgent,并相应地显示 SVG 或 PNG。也许这是一个选择?

    编辑: 好的,看来您仍在考虑使用 JavaScript。 就个人而言,我会选择始终渲染指向 PNG 的 img-tag。然后,当文档准备好后,我会快速浏览所有这些 img-tags 并将它们替换为指向 SVG 的 embed-tag。

    jQuery-示例:

    if(Modernizr.svg) // Wohooo SVG words: let's party
    {
      $('img.replace').each(function() { // Loop through all PNGs that need replacing
        // A unique identifier for images is saved in the id-attribute: use it to append the SVG version
        $(this).append('<embed src="' + $(this).attr('id') + '.svg" type="image/svg+xml" />');
        $(this).remove(); // Clean-up the unused img-tag
      });
    }
    

    使用上面的例子,像

    这样的 img-tag
     <img class="replace" id="123456" src="123456.png"/> 
    

    将被替换为

     <embed src="123456.svg" type="image/svg+xml" />
    

    也许这对你有用? ;-)

    【讨论】:

    • 如果我在服务器端进行,这意味着我必须维护该代码并通过增加浏览器支持来更新它,而像 Modernizr 这样的库将被维护。现在,我能想到的唯一方法是这样的: <script> if (Modernizr.svg) { //write an embed tag with an SVG in it } else { //write an img tag with里面有一个PNG } </script>
    • 对不起,有人可以编辑上面的代码吗?我只允许进行 5 次编辑。我似乎无法将我的代码格式化为这样:/
    • 非常感谢这个例子 :) 我最终做了类似的事情,但我只是使用了 replaceWith() 方法。值得注意的是,由于各种浏览器的呈现方式,最好指定嵌入标签的宽度和高度属性。
    • 你说得对——我很快就把它作为一个例子。所以,是的:指定 height & with 总是一个好习惯。我还省略了 alt-tag,这会使它无效 - 正如我所说,只是为了解释。无论如何:我很高兴你让它工作! :-)
    猜你喜欢
    • 2022-09-25
    • 2013-07-03
    • 1970-01-01
    • 2016-04-19
    • 2022-01-08
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    相关资源
    最近更新 更多