响应式图片 - srcset和sizes属性 - 如何正确使用两者:如何同时基于设备像素比和视口选择?

8

我已经多次阅读了关于这个问题的内容,而且它也发生在我的项目中。以下是我目前对srcset和sizes属性所了解到的介绍。

有两种不同的可能性来使用srcset属性(来源w3c:http://w3c.github.io/html/semantics-embedded-content.html#device-pixel-ratio):

  1. 基于设备像素比选择当图像的渲染尺寸固定时

这是一种简单可靠的使用srcset的方式。您只需要说:如果目标设备的设备像素比大于x,则显示具有以下更高分辨率的图像。

x描述符不适用于图像的渲染尺寸取决于视口宽度(基于视口的选择),但可以与艺术方向一起使用。

例如:

 <img src="/uploads/100-marie-lloyd.jpg"
      srcset="/uploads/150-marie-lloyd.jpg 1.5x, /uploads/200-marie-lloyd.jpg 2x"
      alt="" width="100" height="150">
  1. 基于视口的选择

这种方法允许您根据视口的大小显示不同的图像大小。这是您在示例中主要使用的方法。

可以使用 srcset 和 sizes 属性,使用 w 描述符, 提供多个仅在大小上有所不同的图像(较小的图像是较大图像的缩小版本)。

简单示例:

<h1><img sizes="100vw" srcset="wolf-400.jpg 400w, wolf-800.jpg 800w, wolf-1600.jpg 1600w"
    src="wolf-400.jpg" alt="The rad wolf"></h1>

更进一步:使用大小属性

Viewport-based选择和srcset的默认设置是,图像始终具有100%的宽度(100vw)。sizes属性提供了一个很好的可能性,可以告诉浏览器,在特定的屏幕宽度下,图像的宽度是多少。

sizes属性在30em和50em处设置布局断点,并声明这些断点之间的图像大小为100vw、50vw或calc(33vw - 100px)。这些大小不一定要与CSS中指定的实际图像宽度完全匹配。

用户代理将从sizes属性中选择一个宽度,使用第一个具有true值的项(括号中的部分),或者如果所有项都评估为false,那么使用最后一个项目(calc(33vw - 100px))。

示例:

<img sizes="(max-width: 30em) 100vw, (max-width: 50em) 50vw, calc(33vw - 100px)"
srcset="swing-200.jpg 200w, swing-400.jpg 400w, swing-800.jpg 800w, swing-1600.jpg 1600w"
src="swing-400.jpg" alt="Kettlebell Swing">

我希望有人能够为我解答一个问题:

如果使用srcset,客户端是否总是能够加载正确的图片?还是实际加载的图片也取决于处理能力和网络连接速度,正如一些人所说?我收到了有关在视网膜设备上加载低分辨率图像的投诉。

如何同时使用基于设备像素比和基于视口大小的选择?因为对于sizes中每个可能的大小,我可能需要定义一个200%尺寸的Retina图像以及一个非Retina图像

而且:在srcset中使用不同的图像来适应不同的视口大小是否有意义,或者这是滥用srcset属性?如果可以同时使用基于设备像素比和基于视口大小的选择,则应该可以做到这一点。

1个回答

1

我可以依靠srcset确保客户端始终加载正确的图像吗? 答案是否定的。此外,除非您想使用JavaScript代码检查并限制用户上传正确的尺寸,否则您永远无法知道用户将上传的图像的尺寸。但这样做不太友好。

同样地,您可能希望实现算法以始终将图像调整为所需的特定大小而不会失真,因此您不必传递不同的imageurl到srcset中,只需使用src属性即可。这对于具有缓慢互联网连接的用户是一个优势。

在不同的视口大小中使用不同的图像是否有意义,或者这是对srcset属性的误用? 关键在于您要处理多少设备视口。如果您为不同的视口指定了不同的图像大小和尺寸,则可能无法同时针对所有视口进行目标化,特别是当您在开发时没有处理新设备的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接