当前位置: 首页 > 知识库问答 >
问题:

具有srcset、大小和媒体查询的响应图像-防止加载大图像以获得更高的像素密度

云骏奇
2023-03-14

很长一段时间以来,我使用picture element处理每个视口中不同大小的响应图像。它工作得很好,但现在我不得不切换到响应

经过长时间的搜索,我找到了很好的文档:

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处理响应图像时不使用媒体查询大小的解决方案

没有像我需要的那样工作。。。

所以最大的问题是,如何将宽度和密度的选择结合起来。

在我的示例中,它应该加载:

  • 宽度为0-740时为740.jpg

我不希望它为像素密度更大的设备加载更大的图像。

我知道Stackoverflow中有很多类似的问题,我花了几个星期寻找一个有效的解决方案,但似乎没有什么像预期的那样有效,所以我希望有人能提供一个解决方案

更新:我发现,在讨论这个问题时,存在一个gitlab问题。

(请参见响应映像导致性能问题)

但目前看来,这个问题似乎没有最终的解决办法。

如果有人能提供新的想法,我会非常高兴。


共有1个答案

洪黎昕
2023-03-14

我找到了两种可能的解决方案:

两者都使用最小分辨率媒体查询来定义每个像素密度的独立大小。我用一个比问题中更简单的例子来解释它:

想法1

<img src="500.jpg" title="..." alt="..." 
    srcset="
       500.jpg 500w,
       1000.jpg 1000w"
    sizes="
       (min-resolution: 3dppx) 33vw,
       (min-resolution: 2dppx) 50vw,
       (min-resolution: 1dppx) 100vw"
/>

我使用了100vh示例,并“还原”了浏览器使用*像素密度拍摄的图像是current\u。

此解决方案适用于全屏图像,但您可以使用自定义视口。

想法2

<img src="500.jpg" title="..." alt="..." 
    srcset="
       500.jpg 500w,
       1000.jpg 1000w"
    sizes="
       (min-resolution: 3dppx) and (max-width: 600px) 1500px,
       (min-resolution: 3dppx) and (max-width: 1200px) 2000px,

       (min-resolution: 2dppx) and (max-width: 600px) 1000px,
       (min-resolution: 2dppx) and (max-width: 1200px) 2000px,

       (min-resolution: 1dppx) and (max-width: 600px) 500px,
       (min-resolution: 1dppx) and (max-width: 1200px) 1000px"
/>

我根据屏幕宽度创建了类似的媒体查询,但添加了“还原”大小,即浏览器使用*像素密度拍摄当前图像。

此解决方案适用于所有图像,即使它们不是全尺寸图像。在这里,您可以使用自定义视口,但它的代码相对较多。

两者背后的基本理念是:

  • 例如,对于像素密度为2x和500px的屏幕宽度,浏览器选择srcset为双倍大小,这是在大小媒体查询中定义的,并采取1000px-图像
  • 所以我试图定义新的媒体查询我想要的大小的两倍(例如1000px),这需要浏览器得到我想要的500px,当它是由像素比

在Summery中,这意味着:

如果您希望恢复浏览器为具有大像素密度的mobil设备拍摄更大图像的效果,则必须为每个像素密度的大小计算新值。

对于这两种解决方案,您也应该通过css定义显示大小。

例如,这个简单的php代码示例显示:

<?php
  $viewport = [
    // Viewport => Image-Size
    600  => 500,
    1200 => 1000
  ];

  // walk over all pixel-densities
  for($i=3; $i>0; $i--) {
    foreach($viewport as $vp => $w) 
      echo "(min-resolution: {$i}dppx) and (max-width: {$vp}px) "
            .floor($w/$i) . "px,\n";
  }
?>

 类似资料:
  • 我正在使用具有响应图像的引导。我想通过向浏览器提供多种图像大小来优化加载时间。根据本文,使用srcset这样的简单方法有助于让浏览器选择最佳图像大小: 我的问题是,将其与引导img响应类相结合,即使只需要一张小图片,也会加载一张大图片。 代码示例:Bootply。使用Chrome进行测试,它内置支持srcset支持!其他一些浏览器需要picturefill.js才能识别它。) 如果您复制图像的源(

  • 我正在尝试优化一个页面,该页面由带有断点的图像网格组成,使其使用1、2、3或4列。 html看起来像这样:

  • 问题内容: 有没有办法用javascript / jquery防止图像加载?我正在从带有图像的html列表构建幻灯片。因此,我想收集所有src数据,然后阻止加载图像。因此,稍后当用户真正需要图像时,我便会加载它。 我在Google上找到了一些延迟加载脚本,但找不到阻止图像加载的方式。 提前致谢。 Edit1: 从答案看来,不可能使用javascript来防止图像加载。 这是一个执行延迟加载的脚本。

  • 我正在尝试根据设备宽度提供响应/自适应图像。 原始图像: 与Srcset: 我面临两个问题: 1)即使在较小的设备上(如iPhone 6s),也会加载宽度为2000px的图像(它应该加载800px图像)。 2)我已经把两个图像(有和没有srcset)放在一起。它们都加载了具有相同维度的图像。然而,与其他版本相比,带有srcset的版本显得较小。因为html/css中没有指定宽度,所以它应该以实际图

  • 我开始使用响应图像,我有点怀疑。 我有一个图标。我的网站上的图标总是有两种尺寸:一种是74像素宽的小版本,另一种是94像素宽的大版本。 我使用imgix为大图标创建了这个srcset。我检查了这些图像,并以正确的方式调整了它们的大小,1x是94像素宽,2x是188像素宽。 我修正了94的大小,因为在大版本中,图像总是94像素。 现在我的问题是:对于74像素版本,所以小图标,我必须使用74px来重新

  • 我想在Android中创建不同分辨率的背景图像。所以我需要ldpi,mdpi,hdpi,xhdpi和xxhdpi的值(以像素为单位)。重要的是图像不会模糊。 我已经阅读了有关多屏幕支持的文档,但dp中的尺寸而不是像素。