html - webp/jpg - 仅在 html 文件中预加载所需的类型
问题描述
我有一个网站,我使用 webp 和 jpg 作为后备。在标题中,我为移动用户提供了 bis 图像和较小的图像。
所以我有4个文件:
header-big.webp
header-small.webp
header-big.jpg
header-small.jpg
因为它在标题中,所以我想要预加载图像,但只加载我需要的图像。对于小型和大型的,我可以使用媒体属性预加载它。
<link rel="preload" href="header-small.jpg" as="image" type="image/jpg" media="(max-width: 575px)">
<link rel="preload" href="header-small.webp" as="image" type="image/webp" media="(max-width: 575px)">
<link rel="preload" href="header-big.jpg" as="image" type="image/jpg" media="(min-width: 576px)">
<link rel="preload" href="header-big.webp" as="image" type="image/webp" media="(min-width: 576px)">
在这种情况下,浏览器总是根据文件的宽度预加载两个文件,但仍然只会使用其中一个。
天哪,这是有道理的,因为 jpg 和 webp 都可以实现。所以当然浏览器预加载两者。
但我可以说“如果你支持 webp,那么预加载 webp 而不要预加载 jpg”?
谢谢,弗洛里安
解决方案
我实施的解决方案涉及一个小脚本,取自https://avif.io/blog/tutorials/use-avif-in-css/来检测 AVIF 和 WEBP,因为我之后已经需要它来为这两种格式添加 CSS 支持,但是对于您的用例可以稍微简化一些。一旦我知道它受支持,我就会preload
在头部添加一个链接。
我将脚本放在头部的最后,因为在我的特殊情况下我不需要更早的图像。
<script type="text/javascript">
function addPreloadLink(img, type) {
var fileref = document.createElement('link');
fileref.setAttribute('rel', 'preload');
fileref.setAttribute('as', 'image');
fileref.setAttribute('href', img);
fileref.setAttribute('type', type);
document.head.appendChild(fileref);
}
function AddClass(c) {
document.documentElement.classList.add(c);
}
var webp = new Image();
webp.src =
'data:image/webp;base64,UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==';
webp.onload = function() {
AddClass('webp');
addPreloadLink('header-small.webp', 'image/webp');
addPreloadLink('header-big.webp', 'image/webp');
};
webp.onerror = function() {
//load JPG
addPreloadLink('header-small.jpg', 'image/jpg');
addPreloadLink('header-big.jpg', 'image/jpg');
};
</script>
推荐阅读
- javascript - 需要 JavaScript 才能通过电子邮件传递 URL 地址,该地址将链接到打开特定模式的登录页面
- javascript - 笑话/酶 expect.any(ReactComponent)
- sql - 从 SELECT 语句中导出数据
- google-cloud-platform - 在 BigQuery 目标中导出日志接收器 - Google Cloud Platform
- r - R中的性别检测
- json - 将对象转换为数组
- asp.net-core - 使用 Windows 身份验证的自定义状态代码页
- python - 将图像添加到 tkinter 网格但未显示
- angular - ng2-charts - Tolltip color dont match line color
- c++ - 未能在 SFINAE 中将概念类型识别为 bool