html - webp 图像未使用 Angular 8、Chrome 版本 78 显示
问题描述
我无法弄清楚为什么我在我的 Angular 应用程序中看不到 webp 图像。下面是代码:
<picture>
<source type="image/webp" srcset="./assets/4T-dashboard-start.webp">
<img class="shadowed" src="./assets/4T-dashboard-start.png" style="width: 100%; height: auto;">
</picture>
使用开发人员工具,我可以清楚地看到对 webp 图像的引用是有效的,并且实际上包含图像。当我将鼠标悬停在应用程序中的任何图片元素上时,我会得到一个奇怪的 0px 高 x 21px 宽的元素。
我的猜测是图片元素工作正常,因为它无法读取 webp 图像,因此它正在提供图像。问题是,为什么无法读取webp图像?
<picture>
<source type="image/webp" media="(min-width: 0px)" srcset="./assets/4T-dashboard-start.webp">
<img class="shadowed" src="./assets/4T-dashboard-start.png" style="width: 100%; height: auto;">
</picture>
我也尝试过使用媒体查询,看看是否会做任何事情。无济于事。我通过命令行制作了两个测试 webp 图像。我可以在他们的目录中打开它们,并在 chrome 中有机地查看它们就好了。我需要做什么才能使它正常工作?
如果我将它构建到测试服务器,并在网站上使用 chrome 运行审核日志,我可以确认 Chrome 目前无法知道存在两个 webp 图像。
解决方案
好的,我找到了导致混乱的事情:
在将一些图像切换到 webp 后不久,我开始在应用程序中延迟加载所有图像。延迟加载属性之一 -[attr.lazyLoad]="'imageURL'"
例如在加载图像后加载
<picture>
<source type="image/webp" [attr.lazyLoad]="'./assets/4T-dashboard-popover.webp'">
<img [lazyLoad]="'./assets/4T-dashboard-popover.png'" style="width: 100%; height: auto;"/>
</picture>
在 Web 应用程序中滚动到此图像时(在加载组件时最初不可见),一切正常。webp 图像将加载
但是,如果图像在页面加载时通过了lazyLoad 标准(即它的容器元素可见),则应用程序将延迟加载png 图像,然后加载webp 图像。
所以为了解决这个问题,(我最初认为这是一个 webp 错误)我最终在源标签中使用 srcset 来强制 webp 加载,如下所示:
<picture>
<source type="image/webp" [attr.lazyLoad]="'./assets/4T-dashboard-popover.webp'" srcset="./assets/4T-dashboard-popover.webp">
<img [lazyLoad]="'./assets/4T-dashboard-popover.png'" style="width: 100%; height: auto;"/>
</picture>
对于客户端第一次导航到组件时将可见的图像。