【问题标题】:How to use webp images and support safari如何使用 webp 图片并支持 safari
【发布时间】:2020-09-24 21:56:22
【问题描述】:

由于压缩效果更好,我正在尝试在整个网站中使用 webp 图片。但是我知道 safari 不支持 webp。使用 background-image: url("img/img.webp) 加载图像。然后我应用其他background 属性。

我了解<picture> 标签可用于显示不同的图像,具体取决于浏览器支持。像这样。

<picture>
    <source srcset="some_img.webp" type="image/webp">
    <img src="some_img.jpg"alt="">
</picture>

但是,如果有一种方法可以使用 css 来完成,我不必为所有图像编写新的 html 和样式,这将更加方便。

比如这样的

#image-id {
    background-image: url("../img/img.webp", "../img/img.jpeg"); // show jpeg if webp not supported 
}

或者如果那是不可能的,那么也许是这样的

@media only screen and (safari-specific-property:) {
    background-image: url("../img/img.jpeg"); // show jpeg for safari
}

在保持浏览器支持的同时使用 webp 图片的最佳解决方案是什么,最好使用 css?

【问题讨论】:

    标签: html css image safari webp


    【解决方案1】:

    这里很有趣。据我所知,您可以使用级联或@supports。

    让我们看看当我们使用级联时会发生什么:

    .bg {
     /*fallback */
     background-image: url("https://www.gstatic.com/webp/gallery/2.jpg")
     background-image: url("https://www.gstatic.com/webp/gallery/1.webp");
    }
    

    它可以正常工作,但理解 JPG 和 WebP(占大多数)的浏览器会发出两个请求,这不是最佳选择。

    现在,让我们看看@supports at 规则。

    @supports not (background-image: url("https://www.gstatic.com/webp/gallery/1.webp")) {
        .bg {
            background-image: url("https://www.gstatic.com/webp/gallery/2.jpg")
        }
    }
    .bg {
        background-image: url("https://www.gstatic.com/webp/gallery/1.webp");
    }
    

    由于大多数浏览器都支持 WebP,我认为这个解决方案是理想的。

    不支持 WebP 的浏览器将属于获取 JPG 的规则。然后他们将阅读下一个调用 WebP 的样式,并且由于他们不支持该功能,因此他们将坚持使用 JPG。 我想知道您是否可以在 Safari 浏览器中尝试此操作。

    感兴趣的链接:

    https://css-tricks.com/how-supports-works/

    https://hacks.mozilla.org/2016/08/using-feature-queries-in-css/

    【讨论】:

    • 第二种解决方案正是我想要的。非常感谢。
    • 它可以在 safari 上运行吗?我问你是因为我运行的是 Windows 并且 Internet Explorer 不支持功能查询。
    • 我刚刚试了一下,好像不行。出于某种原因,即使 safari 不支持 webp 图片,@supports (background-image: url("img.webp") 也会返回 true。
    • 嗯,你应该用 javascript 解决这个问题,抱歉,目前还没有其他解决方案。我认为这可以帮助你:css-tricks.com/using-webp-images/#article-header-id-4
    【解决方案2】:

    最终的答案是这样的:

    @supports not (background-image: url("https://www.gstatic.com/webp/gallery/1.webp")) {
            .bg {
                background-image: url("https://www.gstatic.com/webp/gallery/2.jpg")
            }
        }
        @supports (background-image: url("https://www.gstatic.com/webp/gallery/1.webp")) {
            .bg {
                background-image: url("https://www.gstatic.com/webp/gallery/1.webp")
            }
        }

    因为如果你只放一个@support查询,浏览器会下载另一个没有被@support包围的。 这样浏览器将只加载一个背景图像:那个更适合。

    【讨论】:

    • 这太棒了 - 如何让 jpg 在 IE 11 上显示?
    • 根据caniuse.com/?search=supports,您不能在IE中使用@supports功能。如果您真的想检测 Web 浏览器以查看是否应该下载 .webp 图像,您可以使用 JavaScript,但我不会这样做,因为在 CSS 中执行此操作很酷的部分是它花费的时间很短加载(当然与 JS 相比)。
    • 顺便说一句,根据bugzilla.mozilla.org/show_bug.cgi?id=1713460 - @supports 检查是否支持background-image 而不一定检查是否支持 avif 或 webp。
    • 谢谢,很好的解决方案。
    猜你喜欢
    • 2017-12-18
    • 2021-05-14
    • 2020-02-17
    • 2012-01-01
    • 2016-08-02
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 2019-04-10
    相关资源
    最近更新 更多