我曾经使用图片元素来实现响应式图片在不同视口大小下的展示,效果还不错。但现在我被迫转向使用带有srcset
和sizes
属性的响应式<img>
标签,并且我正在尝试将我的图片元素重写为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 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"
/>
这在浏览器的首次测试中似乎很好用。但是后来我注意到,在移动设备上加载了太大的图像。
原因是一些移动设备的像素密度不同,就像响应式图片的完整指南所解释的那样。
我尝试通过更改我的代码来修复这个问题
<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问题讨论了这个问题。
(请参见响应式图片会导致性能问题)
但目前似乎还没有最终的解决方案。
如果有人能提供新的想法,将会非常高兴。