【问题标题】:How to load image formats based on browser support using CSS?如何使用 CSS 加载基于浏览器支持的图像格式?
【发布时间】:2019-08-29 23:50:17
【问题描述】:

我想在我的 CSS background-image 属性中使用 WebP 图像格式。但是,由于 WebP 是相当新的并且仍然不是所有新旧浏览器都支持,我还想添加对该图像的 JPEG 版本的支持作为后备。

我知道我可以使用<picture> 标记来执行此操作:

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

这将使浏览器加载第一个支持的格式。但是我是否可以仅使用 CSS 以某种方式实现相同的效果,因为我正在使用 background-image 属性设置背景图像?我知道我可以使用@media 查询根据屏幕大小选择图像,但是如何根据浏览器支持加载图像?

我试图寻找解决方案,但找不到。如果这是重复的并且解决方案已经存在,请告诉我。

谢谢。

【问题讨论】:

    标签: html css cross-browser background-image webp


    【解决方案1】:

    使用 2 个背景图片: 一种是JPG或PNG,另一种是WEBP,浏览器会自动选择最佳的。

    在 codepen 上找到此代码:Robin Rendle

    CSS:

    element {
      width: 50vw;
      height: 100vh;
      background-image: url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/14179/cust-housegreening-pup%402x-4cf7ada520811031a97bee12c06d9e9367f811bd86255ea60d40aa809cf58801.jpg');
      background-image: url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/14179/cust-housegreening-pup@2x-4cf7ada520811031a97bee12c06d9e9367f811bd86255ea60d40aa809cf58801.webp');
    }
    

    https://codepen.io/robinrendle/pen/ORmzJY

    【讨论】:

    • 我可以确认这种方法行不通。使用这种方法时,FireFox 和 Google Chrome 都会下载图像的.webp 版本并且工作正常。但是在不支持 WebP 的 Safari (v12.1.1) 上,这不起作用。 Safari 仍然尝试下载.webp 格式并且不显示图像。这是 CSS 的预期行为,因为当您使用多个 background-image 属性时,浏览器总是会下载最后提到的图像。即使您提供的 codepen 也无法在 Safari 上运行。
    • 对不起,在当前浏览器上测试过,唯一的方法是使用JS检测webp支持并添加一个body类,以便所有带有背景图像的元素都可以切换到webp
    • 你可以参考这个链接:css-tricks.com/using-webp-images和这个:freecodecamp.org/news/…
    【解决方案2】:

    改用 CSS @supports

    .yourclass {
        background: url("image.jpg") no-repeat center / contain;
    }
    
    @supports (background-image: url("image.webp")) {
        .yourclass {
            background: url("image.webp") no-repeat center / contain;
        }
    }
    

    别担心。打开检查器,您会注意到浏览器不会同时加载两个图像

    需要考虑的事项:

    • 请注意,您必须在jpg 之后声明webp 版本,或者 级联流应该会赢。
    • background-repeatbackground-positionbackground-size 参数仅用于示例目的。

    【讨论】:

    • 看起来很有希望,但在 Safari 上测试我发现尽管无法使用 webp,但它会使用 @supports 部分中的规则。
    • 我也在 Safari 上测试过,这个答案不正确。我觉得@supports只是测试这个CSS规则对当前浏览器是否可用有效,不会告诉你资源是否可以加载成功。
    • @bambooom 你用什么版本的 Safari 进行了测试? caniuse.com/#feat=css-featurequeries
    • @ed1nh0 Safari 版本 13.0.5 (15608.5.11)。我并不是说 Safari 不支持 @supports。但我同意第一条评论。对于 Safari 13,此 @supports 功能查询返回 true,因此应用了规则 url("image.webp"),但 webp 无法在 Safari 上显示。
    猜你喜欢
    • 2019-06-11
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2021-11-16
    • 2010-09-17
    • 2019-04-11
    相关资源
    最近更新 更多