css srcset -响应图像加载错误文件

jexiocij  于 2023-06-25  发布在  其他
关注(0)|答案(6)|浏览(97)

我的目标是提供同一张图像的不同版本(分辨率/大小),这应该占据100%的视口宽度,所以我可以提供800 px版本给移动的设备(或者,通常,具有较小显示器或较慢连接的设备),1366 px及以上版本给较大的桌面显示器。
问题是,我正在使用Chromium设备模拟器进行测试,一些小屏幕设备加载1366 px版本而不是800 px:iPhone 6/7/8(375 px宽度)加载800 px图像,但iPad(768 px),Nexus 5(360 px)和iPhoneX(375 px)都加载1366 px而不是加载800 px。
我对正确理解sizes指令不是很有信心,这是我的代码,默认src引用2880 px版本只是为了帮助测试:

<img class="img-fluid" 
    srcset="img/dreamstime_800w_109635242.jpg 800w,
         img/dreamstime_1366w_109635242.jpg 1366w,
         img/dreamstime_2880w_109635242.jpg 2880w"
    sizes="(max-width: 800px) 100vw,
        (max-width: 1366px) 100vw,                      
        2880px 100vw"
    src="img/dreamstime_2880w_109635242.jpg"/>
d7v8vwbk

d7v8vwbk1#

你的sizes属性告诉浏览器图像总是显示整个视口宽度,所以你可以简单地用sizes="100vw"替换它。
因此浏览器获取当前视口宽度,将其乘以屏幕密度,然后将其提供所需图像的宽度。然后,它从srcset的列表中获取最近的图像。
你不能用它来“为移动的设备提供800px版本”,因为现在大多数移动设备的密度都比桌面设备大,你不能用<img srcset… sizes…>来阻止它。
如果你真的想忽略屏幕密度(出于什么原因?)和:

  • 为小型设备提供最小的图像,
  • 向介质设备提供介质图像
  • 为大型设备提供大图像
  • 保留最大图像作为备用

然后,你必须使用<picture>来处理媒体查询:
html <picture> <source media="(max-width: 800px)" srcset="img/dreamstime_800w_109635242.jpg 800w"> <source media="(max-width: 1366px)" srcset="img/dreamstime_1366w_109635242.jpg 1366w"> <img src="img/dreamstime_2880w_109635242.jpg"> </picture>

2izufjch

2izufjch2#

这与视网膜显示器有关(我认为还有它们的DPI)。
据我所知,视网膜显示器将选择第一幅图像,这是其显示器宽度的两倍或三倍,这取决于其各自的视网膜显示器(2x,3x等)。
另一个简单的解决方案是清除浏览器缓存。如果你的最大和最坏的图像已经被缓存,Chrome(例如)将始终加载该图像。

yzxexxkh

yzxexxkh3#

对于未来的读者-我很难理解为什么SRCSET完全忽略了我的尝试。在经历了几个小时的沮丧和愤怒之后,我得到了世界上最明显的答案--我正在使用Retina Macbook Pro,而且我没有触发像素密度。
我改成了

<img class="<?= $image_class;?>" data-caption="<?php echo $image['alt']; ?>"
data-src="<?php echo $image['sizes']['medium']; ?>"
data-srcset="<?php echo $image['sizes']['medium']; ?> 600w 2x, 
<?php echo $image['sizes']['large']; ?> 1280w 2x"
sizes="(min-width: 150px) 600px, 100vw"
width="150" height="150"
alt="<?php echo $image['alt']; ?>">

一切都很顺利--至少我能弄清楚发生了什么事。嗨。大家圣诞快乐!

qgelzfjb

qgelzfjb4#

用Chrome模拟器测试我的网页,我有时会发现(就像你一样)一个比必要的大的图像显然正在加载,特别是在小型移动的设备上。我终于意识到,这不是我的错误,而是Chrome从缓存中拉出一个更大的图像,如果它碰巧有一个。单击模拟器中的复选框以在测试时禁用该高速缓存,问题消失了,我期望看到加载的大小实际上加载了。

vvppvyoh

vvppvyoh5#

我注意到,当chrome devTools打开并启用响应模式时,我的设备像素比例从1变为2。因此,即使在“网络”选项卡中禁用了缓存,在我看来浏览器加载的文件比必要的要大,但这是因为像素比发生了变化时:

  1. devTools已打开
    1.已启用响应模式
    你可以用一个简单的JavaScript重复检查在任何给定时间的像素比率:
    <script>alert(window.devicePixelRatio)</script>
    如果您尝试以多个宽度加载页面进行测试,您可能启用了响应模式,但这也可能改变像素密度。因此,它可能只是工作的预期,就像它是为我。
daolsyd0

daolsyd06#

简单回答:

sizes="(max-width: 999px) 50vw, 100vw"

相关问题