2022 年处理 Safari 和 .webp 图片
Dealing with Safari and .webp images in 2022
我已经等 .webp
图像非常 很长时间了。
现在是 2022 年,所以,给定:
- 图像格式已经存在了十年
- Chrome 于 2014 年 1 月开始支持
.webp
- Firefox 于 2019 年 1 月开始支持
.webp
我前天决定冒险尝试将网站上的一堆 .png
图片转换为 .webp
图片。
菜鸟错误。因为,当然,我应该先检查:https://caniuse.com/webp,那会告诉我 Safari 在 macOS 11.0 Big Sur(2020 年 11 月)之前的任何东西上) 不 支持 .webp
图像。
可是我已经等不及了。所以...我想 Safari 可以继续使用 .png
图片。
因为我绝对确实想要向 Firefox、Brave、Chrome、Edge、Opera 等用户提供 .webp
图像。
如果我使用的是标记图像,则声明一个或多个后备图像是基本的:
<picture>
<source srcset="a-webp-for-most-browsers.webp" type="image/webp">
<source srcset="a-png-for-safari.png" type="image/png">
<img src="a-png-for-safari.png" alt="My Image">
</picture>
但是(叹息)在这种情况下,图像是 CSS 背景图像,因此创建后备选项的选项更加有限:
- CSS
image-set
still has pretty low support 目前
- CSS 使用
@supports
的特征查询不会扩展到图像格式。
我是否仅限于通过 PHP 进行浏览器嗅探,如下所示:
if (preg_match('/Mac OS X/', $_SERVER['HTTP_USER_AGENT'])) {
$Body_Element_CSS_Class_List .= ' oh-no-here-comes-safari';
}
我可以采用比浏览器检测更好/更可靠的方法吗?
是的,很难为 CSS background-images
提供后备方案
在我的问题中我写道:
If I were using marked-up images, declaring one or more fallback images is elementary [...]
But (sigh) in this instance, the images are CSS background-images, so options for creating fallbacks are more limited
至少现在,- 即。虽然我们仍在等待(2022 年)广泛 cross-browser 支持 CSS image-set()
功能 - 这是真的。
但是一个marked-up<img>
可以替换每个CSSbackground-image
当我四处寻找替代方法时,我意外地看到了 Quentin Albert 于 2021 年 7 月发表的评论:
For what most people use background images for you can nowadays easily use object-fit + object-position.
Source: https://css-tricks.com/using-performant-next-gen-images-in-css-with-image-set/
这对我来说是个新闻。我完全隐约意识到 object-fit
CSS property, but I'd never come across the object-position
CSS 属性。
但这绝对有效!!
如果image-set()
有支持我会用CSS
如果 image-set()
有广泛的 cross-browser 支持,这就是我的意图 CSS,这将为 Safari 启用后备图像:
.my-image-1 {
background-image: url(image-set('my-sprited-images.webp', 'my-sprited-images.png'));
background-position: 0, 0;
}
.my-image-2 {
background-image: url(image-set('my-sprited-images.webp', 'my-sprited-images.png'));
background-position: -100px, 0;
}
我可以用HTML + CSS代替(感谢object-position
)
由于以上内容不可靠,我可以在 HTML 中声明后备图像,并使用 object-position
:
定位它
HTML:
<picture>
<source srcset="my-sprited-images.webp" type="image/webp">
<source srcset="my-sprited-images.png" type="image/png">
<img class="my-image-1" src="/my-sprited-images.png" alt="My Image 1">
</picture>
<picture>
<source srcset="my-sprited-images.webp" type="image/webp">
<source srcset="my-sprited-images.png" type="image/png">
<img class="my-image-2" src="/my-sprited-images.png" alt="My Image 2">
</picture>
CSS:
.my-image-1 {
object-position: 0 0;
}
.my-image-2 {
object-position: -100px 0;
}
我遇到了同样的问题,但我相信今天解决 CSS 背景图片的一种好方法是使用 Modernizr.
在那个 link 中,您可以制作一个 Modernizr 脚本构建,专门验证浏览器中的 webp 支持。然后您只需将脚本添加到 <head>
,它会根据您正在验证的功能将 类 添加到 <html>
。因此,例如,要为 CSS 背景图片加载不同的图片格式,您可以这样做:
.webp .image {
background-image: url('/image.webp');
}
.no-webp .image {
background-image: url('/image.png');
}
我已经等 .webp
图像非常 很长时间了。
现在是 2022 年,所以,给定:
- 图像格式已经存在了十年
- Chrome 于 2014 年 1 月开始支持
.webp
- Firefox 于 2019 年 1 月开始支持
.webp
我前天决定冒险尝试将网站上的一堆 .png
图片转换为 .webp
图片。
菜鸟错误。因为,当然,我应该先检查:https://caniuse.com/webp,那会告诉我 Safari 在 macOS 11.0 Big Sur(2020 年 11 月)之前的任何东西上) 不 支持 .webp
图像。
可是我已经等不及了。所以...我想 Safari 可以继续使用 .png
图片。
因为我绝对确实想要向 Firefox、Brave、Chrome、Edge、Opera 等用户提供 .webp
图像。
如果我使用的是标记图像,则声明一个或多个后备图像是基本的:
<picture>
<source srcset="a-webp-for-most-browsers.webp" type="image/webp">
<source srcset="a-png-for-safari.png" type="image/png">
<img src="a-png-for-safari.png" alt="My Image">
</picture>
但是(叹息)在这种情况下,图像是 CSS 背景图像,因此创建后备选项的选项更加有限:
- CSS
image-set
still has pretty low support 目前 - CSS 使用
@supports
的特征查询不会扩展到图像格式。
我是否仅限于通过 PHP 进行浏览器嗅探,如下所示:
if (preg_match('/Mac OS X/', $_SERVER['HTTP_USER_AGENT'])) {
$Body_Element_CSS_Class_List .= ' oh-no-here-comes-safari';
}
我可以采用比浏览器检测更好/更可靠的方法吗?
是的,很难为 CSS background-images
提供后备方案在我的问题中我写道:
If I were using marked-up images, declaring one or more fallback images is elementary [...]
But (sigh) in this instance, the images are CSS background-images, so options for creating fallbacks are more limited
至少现在,- 即。虽然我们仍在等待(2022 年)广泛 cross-browser 支持 CSS image-set()
功能 - 这是真的。
但是一个marked-up<img>
可以替换每个CSSbackground-image
当我四处寻找替代方法时,我意外地看到了 Quentin Albert 于 2021 年 7 月发表的评论:
For what most people use background images for you can nowadays easily use object-fit + object-position.
Source: https://css-tricks.com/using-performant-next-gen-images-in-css-with-image-set/
这对我来说是个新闻。我完全隐约意识到 object-fit
CSS property, but I'd never come across the object-position
CSS 属性。
但这绝对有效!!
如果image-set()
有支持我会用CSS
如果 image-set()
有广泛的 cross-browser 支持,这就是我的意图 CSS,这将为 Safari 启用后备图像:
.my-image-1 {
background-image: url(image-set('my-sprited-images.webp', 'my-sprited-images.png'));
background-position: 0, 0;
}
.my-image-2 {
background-image: url(image-set('my-sprited-images.webp', 'my-sprited-images.png'));
background-position: -100px, 0;
}
我可以用HTML + CSS代替(感谢object-position
)
由于以上内容不可靠,我可以在 HTML 中声明后备图像,并使用 object-position
:
HTML:
<picture>
<source srcset="my-sprited-images.webp" type="image/webp">
<source srcset="my-sprited-images.png" type="image/png">
<img class="my-image-1" src="/my-sprited-images.png" alt="My Image 1">
</picture>
<picture>
<source srcset="my-sprited-images.webp" type="image/webp">
<source srcset="my-sprited-images.png" type="image/png">
<img class="my-image-2" src="/my-sprited-images.png" alt="My Image 2">
</picture>
CSS:
.my-image-1 {
object-position: 0 0;
}
.my-image-2 {
object-position: -100px 0;
}
我遇到了同样的问题,但我相信今天解决 CSS 背景图片的一种好方法是使用 Modernizr.
在那个 link 中,您可以制作一个 Modernizr 脚本构建,专门验证浏览器中的 webp 支持。然后您只需将脚本添加到 <head>
,它会根据您正在验证的功能将 类 添加到 <html>
。因此,例如,要为 CSS 背景图片加载不同的图片格式,您可以这样做:
.webp .image {
background-image: url('/image.webp');
}
.no-webp .image {
background-image: url('/image.png');
}