如何使用响应式大小的图像防止卡顿并减少布局偏移?
How can I prevent jank and reduce layout shift with responsive sized images?
我的网站上有很多各种尺寸的图片。这些图像是响应式的,并且会在从桌面到移动设备的所有浏览器宽度下改变大小。我在 Google Search Console 中看到我的 CLS(累积布局偏移)很差,为 0.25 秒。我的网站布局会随着图像加载而变化。
由于我的图片是响应式的,我无法指定图片的确切尺寸,也无法使用占位符来保留 space。
使用响应式图像防止 CLS 的现代方法是什么?
此处布局:https://jsfiddle.net/exspwgab/
更新: 我在互联网上尝试了一个建议,即在 img 标签内指定图像文件的宽度和高度,如:
<img src="photo.jpg" width="1504" height="752">
然后在 CSS 你做:
width: 100%;
height: auto;
这似乎在任何浏览器中都不起作用。而且我网页上的元素仍然随着图像的加载而到处移动。
如果有人有适用于所有浏览器的解决方案,请告诉我。我基本上需要占位符来保存 space,同时加载图像以防止页面卡顿问题。
这里是我的响应式布局的 JSFiddle:
https://jsfiddle.net/exspwgab/
如果您需要做您正在做的事情...别担心。
识别您网站潜在问题的工具不知道上下文。例如,假设我的站点有一个 20 MB 的巨大图像,需要几秒钟才能加载。 Google 的工具无疑会将此标记为问题。但是,也许在我的例子中,我的网站正在托管科学图像或需要无损大图像尺寸的东西。我的用户很乐意花几秒钟加载他们需要的数据。
如果您的网站布局要求您加载图像然后动态调整大小,那么这就是它的要求,您不必担心。
我不确定这是否正是 CLS 问题的“现代解决方案”,但我只是尽力提供帮助。
显然,为 响应式图像元素 放置 constant-sized 占位符在逻辑上是不可能的。如果我们使用 placeholders/elements 和 fixed-sizes 作为 响应式内容 会怎么样?
例如:
img.placeholder-image {
width: 100%;
height: 256px;
object-fit: contain;
}
使用 fixed-height,此元素不会对 CLS 政策造成任何负面影响,同时即使调整视口大小也会将整个图像内容保留在元素本身内。
我非常建议您考虑使用 <div>
s 而不是 <image>
元素来显示图像内容(使用 background
属性),但是,我可以不能保证这不是又一次违反审计规则。
我的两分钱。
我最终使用了此处找到的解决方案:
http://davidecalignano.it/lazy-loading-with-responsive-images-and-unknown-height/#:~:text=And%20here%20is%20the%20formula,flashes%20on%20lazy%20loaded%20images.
HTML
<a class="thumb lazy-container" href="#">
<img class="lazy" data-original="image.jpg" alt="">
</a>
CSS
.lazy-container {
display: block;
position: relative;
height: 0;
}
.post .lazy-container {
padding-bottom: 55.3%;
}
.lazy-container img {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
由于我所有的图片都有不同的高度,我将 padding-bottom 百分比作为每张图片的内联样式。
HTML:
<img width="300" height="450" src="300x450.jpg">
CSS:
img {
height: auto;
aspect-ratio: 2/3;
max-width: 100%;
}
目标浏览器:
- Chrome88+
- 边 88+
文章:
我遇到了完全相同的问题。
解决方案是将 width: 100%
更改为 max-width: 100%
这是在 https://web.dev/optimize-cls/
上隐含说明的
img {
width: 100%; /* or max-width: 100%; */
height: auto;
}
我的网站上有很多各种尺寸的图片。这些图像是响应式的,并且会在从桌面到移动设备的所有浏览器宽度下改变大小。我在 Google Search Console 中看到我的 CLS(累积布局偏移)很差,为 0.25 秒。我的网站布局会随着图像加载而变化。
由于我的图片是响应式的,我无法指定图片的确切尺寸,也无法使用占位符来保留 space。
使用响应式图像防止 CLS 的现代方法是什么?
此处布局:https://jsfiddle.net/exspwgab/
更新: 我在互联网上尝试了一个建议,即在 img 标签内指定图像文件的宽度和高度,如:
<img src="photo.jpg" width="1504" height="752">
然后在 CSS 你做:
width: 100%;
height: auto;
这似乎在任何浏览器中都不起作用。而且我网页上的元素仍然随着图像的加载而到处移动。
如果有人有适用于所有浏览器的解决方案,请告诉我。我基本上需要占位符来保存 space,同时加载图像以防止页面卡顿问题。
这里是我的响应式布局的 JSFiddle: https://jsfiddle.net/exspwgab/
如果您需要做您正在做的事情...别担心。
识别您网站潜在问题的工具不知道上下文。例如,假设我的站点有一个 20 MB 的巨大图像,需要几秒钟才能加载。 Google 的工具无疑会将此标记为问题。但是,也许在我的例子中,我的网站正在托管科学图像或需要无损大图像尺寸的东西。我的用户很乐意花几秒钟加载他们需要的数据。
如果您的网站布局要求您加载图像然后动态调整大小,那么这就是它的要求,您不必担心。
我不确定这是否正是 CLS 问题的“现代解决方案”,但我只是尽力提供帮助。
显然,为 响应式图像元素 放置 constant-sized 占位符在逻辑上是不可能的。如果我们使用 placeholders/elements 和 fixed-sizes 作为 响应式内容 会怎么样?
例如:
img.placeholder-image {
width: 100%;
height: 256px;
object-fit: contain;
}
使用 fixed-height,此元素不会对 CLS 政策造成任何负面影响,同时即使调整视口大小也会将整个图像内容保留在元素本身内。
我非常建议您考虑使用 <div>
s 而不是 <image>
元素来显示图像内容(使用 background
属性),但是,我可以不能保证这不是又一次违反审计规则。
我的两分钱。
我最终使用了此处找到的解决方案: http://davidecalignano.it/lazy-loading-with-responsive-images-and-unknown-height/#:~:text=And%20here%20is%20the%20formula,flashes%20on%20lazy%20loaded%20images.
HTML
<a class="thumb lazy-container" href="#">
<img class="lazy" data-original="image.jpg" alt="">
</a>
CSS
.lazy-container {
display: block;
position: relative;
height: 0;
}
.post .lazy-container {
padding-bottom: 55.3%;
}
.lazy-container img {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
由于我所有的图片都有不同的高度,我将 padding-bottom 百分比作为每张图片的内联样式。
HTML:
<img width="300" height="450" src="300x450.jpg">
CSS:
img {
height: auto;
aspect-ratio: 2/3;
max-width: 100%;
}
目标浏览器:
- Chrome88+
- 边 88+
文章:
我遇到了完全相同的问题。
解决方案是将 width: 100%
更改为 max-width: 100%
这是在 https://web.dev/optimize-cls/
上隐含说明的img {
width: 100%; /* or max-width: 100%; */
height: auto;
}