【问题标题】:img srcset based on img width rather than viewport widthimg srcset 基于 img 宽度而不是视口宽度
【发布时间】:2025-11-27 15:00:01
【问题描述】:

我有一个部分模板,可以在页面上呈现一篇文章,该页面基本上是图像和随附的文本。在登录页面中,我将在页面上有几篇文章,不同的类别,主要文章将是全宽的,次要文章是一半,第三个宽度。有时侧边栏文章的宽度也会非常小。然后根据视口,有时图像可以呈现在文本上方或左侧。

总而言之,同一篇文章的 HTML 会根据上下文以多种方式呈现。

在最新的 srcset 规范中有没有办法解决这个问题?

据我所知,每个上下文必须有不同的尺寸属性,基本上将布局/断点耦合到标记,在我的实现中具有如此多的上下文,这将使服务器端逻辑变得可怕。

【问题讨论】:

    标签: html srcset


    【解决方案1】:

    srcset 中的宽度描述符始终定义图像本身的宽度,而不是视口。

    如果您指的是尺寸属性:

    简而言之,你不能。这样做的原因是,浏览器在完全加载/解析样式表之前就开始获取图像。这意味着布局是未知的。但是,如果您使用延迟加载技术,您可以自动计算 size 属性。

    这是由lazysizes完成的。

    【讨论】:

    • 感谢您的回复,嗯,我有点困惑,我的图像周围有 10 像素的填充,所以如果视口为 1000 像素,则图像将为 980 像素。如果我在 srcset 中有一个设置为 1000w 的图像,它将在视口为 1000 而不是 1020 时加载它。根据您的最后一段,它只能依赖视口作为下载图像的指南,因为 css 可能不会被解析。
    • 为了说明,codepen.io/anon/pen/ZbEvwB 这里的 2 张图片将始终相同,即使它们的尺寸不同。视口大小似乎决定了加载哪个 src。如果我的浏览器 > 800 他们都加载 1600,如果
    • 这里有两点:1.你需要添加sizes属性。 (即:sizes="50vw" 和 sizes="25vw")否则浏览器默认为两个图像的“100vw”。 2. Chrome 检查是否已经缓存了更高分辨率的图片,如果找到,则选择缓存的图片。
    • 好的,感谢您的澄清。我不可能在尺寸标签中解释我的文章布局的所有不同排列。很遗憾,您不能强迫浏览器推迟决定,直到它知道图像将采用的大小并以此为基础,当您已经在标记中定义断点信息时将其放入标记中感觉不对css。我明白为什么浏览器想要尽快开始加载资产,但最好覆盖它。
    • 在我看来,2020 年的 W3C 似乎完全是这种情况。为什么我们到底要根据视口而不是实际图像宽度来确定图像大小?我仍然需要使用 Javascript 来做到这一点,除非有人想出了什么...