很长时间以来,我使用图片元素来响应每个视口不同尺寸的图像。它工作得很好,但现在我被迫切换到响应<img>
式srcset
并且sizes
我尝试将我的图片元素重写为 IMG 样式。
经过长时间的搜索,我在以下位置找到了很好的文档:
https://www.dofactory.com/html/img/sizes 和更多细节在: https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images
带图片的代码是这样的:
<picture>
<source media="(max-width: 740px)" src="740.jpg" type="image/jpeg">
<source media="(max-width: 980px)" src="1280.jpg" type="image/jpeg">
<source media="(max-width: 1280px)" src="1600.jpg" type="image/jpeg">
<source media="(max-width: 1480px)" src="1920.jpg" type="image/jpeg">
<img src="740.jpg" title="..." alt="..." />
</picture>
我将其重写为这样的响应式 img:
<img src="740.jpg" title="..." alt="..."
srcset="
740.jpg 740w,
1280.jpg 1280w,
1600.jpg 1600w,
1920.jpg 1920w"
sizes="
(max-width: 740px) 740px,
(max-width: 980px) 1280px,
(max-width: 1280px) 1600px,
(max-width: 1480px) 1920px"
/>
这似乎在浏览器的第一次测试中效果很好。但后来我注意到在移动设备上它加载了太大的图像。
原因是某些移动设备的像素密度不同,如 a-complete-guide-for-responsive-images 中所述
我试图通过将代码更改为来解决此问题
<img src="1920.jpg" title="..." alt="..."
srcset="
740.jpg 740w 1x,
1280.jpg 1280w 1x,
1600.jpg 1600w 1x,
1920.jpg 1920w 1x"
sizes="
(max-width: 740px) 740px,
(max-width: 980px) 1280px,
(max-width: 1280px) 1600px,
(max-width: 1480px) 1920px"
/>
不起作用...(它总是为所有视点加载最小的图像)
我从使用 img srcset 处理响应式图像中尝试了没有媒体查询大小的解决方案
不像我需要的那样工作......
所以最大的问题是,如何组合宽度和密度的选择器。
在我的示例中,它应该加载:
- 740.jpg 用于宽度 0-740
- 1280.jpg 适用于宽度 740-980
- 1600.jpg 用于宽度 980-1280
- 1920.jpg 用于更大的一切
而且我不希望它为像素密度更大的设备加载更大的图像。
我知道 Stackoverflow 中有很多类似的问题,我正在寻找数周的工作解决方案,但似乎没有什么能像预期的那样工作,所以我希望有人能提供解决方案
更新: 我发现,有一个讨论这个问题的 gitlab 问题。
(请参阅响应式图像导致性能问题)
但目前看来,这个问题还没有最终的解决方案。
如果有人能提供新的想法,我会很高兴。