【发布时间】:2020-02-17 14:04:46
【问题描述】:
在我的网站中,我添加了所有 webp 格式的图片。所有这些图像在 Chrome 和 Firefox 浏览器中都能正常显示,但在 Safari 中却无法正常显示。
【问题讨论】:
-
最后,Safari 14 增加了对 webp 图片的支持。截至 2020 年 6 月 23 日,Safari 14 处于测试阶段,将于今年晚些时候发布。采用需要一些时间,但这是个好消息。
在我的网站中,我添加了所有 webp 格式的图片。所有这些图像在 Chrome 和 Firefox 浏览器中都能正常显示,但在 Safari 中却无法正常显示。
【问题讨论】:
到目前为止,Safari 不支持webp 格式,我不确定它是否计划在不久的将来实施。但是您可以让浏览器选择是像这样使用webp 还是jpg。
<picture>
<source srcset="
/uploads/img_small.webp 1x,
/uploads/img_big.webp 2x" type="image/webp">
<source srcset="
/uploads/img_small.jpg 1x,
/uploads/img_big.jpg 2x" type="image/jpeg">
<img src="/uploads/img_small.jpg">
</picture>
浏览器足够智能,可以只下载和使用受支持的最佳图像。
【讨论】:
img html 标记的绝佳解决方案,但如果图像在CSS 中以background-image 的形式出现,该怎么办?另外,我不是必须复制每张图像的想法的忠实粉丝。希望有另一种方式。
已在 macOS Big Sur 以及 iOS、iPadOS 和公司的 Safari 14 中添加了 WebP 官方支持。
【讨论】:
更新:
我没有评论的声誉,但除了<picture> 选项之外,我还想提供一个(可能是喜怒无常的)CSS 背景解决方案。
截至目前,Safari(两个版本)是唯一不支持WEBP的主要浏览器,但它似乎也是唯一支持image-set without a prefix的浏览器。
所以,如果我们使用三个代码块来允许所有浏览器完全回退,那么它看起来像:
background-image: url("exampleimage.webp"); /* Firefox - UPDATE: no longer needed in FF 88+! */
background-image: -webkit-image-set(
url("exampleimage.webp") 1x,
url("exampleimage@1-5x.webp") 1.5x,
url("exampleimage@2x.webp") 2x
);
background-image: image-set(
url("exampleimage.jpg") 1x,
url("exampleimage@1-5x.jpg") 1.5x,
url("exampleimage@2x.jpg") 2x
) /* Safari */
【讨论】:
您可以按照建议here 在浏览器支持时提供WebP 格式,如果不支持则按照jpg 或png。这是它的要点:
对于HTML,使用<picture> HTML5 标签:
<picture>
<source srcset="img/my_image.webp" type="image/webp">
<source srcset="img/my_image.jpg" type="image/jpeg">
<img class="img-fluid" src="img/my_image.jpg" alt="Alt Text!">
</picture>
对于CSS:
添加modernizr.js 脚本来检测浏览器是否支持WebP 格式。您可以customize 脚本只寻找 WebP 支持,而不是其他,以尽量减少开销:
<script src="modernizr.min.js"></script>
这会将webp 或no-webp 类添加到<html> 元素,具体取决于浏览器对WebP 的支持:
<html lang="en" class="webp">
要么
<html lang="en" class="no-webp">
使用上面的类来加载合适的图片:
.no-webp .elementWithBackgroundImage { background-image: url("image.jpg"); } .webp .elementWithBackgroundImage{ background-image: url("image.webp"); }
要避免 JavaScript 在浏览器中被禁用并且无法运行 modernizr.min.js 脚本的可能性,请将 no-js 类添加到 <html> 标记:
<html class="no-js">
并在任何其他脚本之前添加以下内容:
<script>
document.documentElement.classList.remove("no-js");
</script>
如果启用了 JavaScript,这将在浏览器执行时删除 <html> 元素上的 no-js 类。否则,它永远不会被解析,no-js 类将保留。
因此,使用这个类来提供默认图像:
.no-js .elementWithBackgroundImage {
background-image: url("image.jpg");
}
【讨论】:
Safari 14 支持 WebP 图片格式,旧版 Safari 不支持 webp 图片。您不能只更改 webp 文件以使它们在不支持它的不兼容 Safari 版本上工作。它不会起作用。
因此,对于较旧的 safari 版本,您唯一的解决方案是为每张图片保留一份 PNG 或 JPG 格式的副本,或者使用 image CDN 自动为您执行此操作。如果浏览器支持,图像 CDN 会获取图像文件(JPEG 或 PNG)并将其动态转换为 webp 图像格式。否则,它会以 JPEG 或 PNG 格式提供图像,以保持工作正常而不会损坏。
【讨论】: