如果我们几乎不做任何操作就能获得纵横比大小的图像?

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

假设您在 <img> 中使用了一个 800×600 像素的图像。它真的会在您的网站上显示为 800px 宽吗?这很可能不会。我们倾向于将图像放入灵活的容器元素中,并且内部图像设置为 width: 100%;。因此,该图像最终可能为 721px 宽,或 381px 宽,或任何宽度。不会改变的是该图像的纵横比,除非您将其尴尬地压缩(忽略特殊用例 object-fit 场景)。

要点是我们不知道图像加载之前将占用多少垂直空间。这就是卡顿的原因!可怕的卡顿!它无处不在,而且很糟糕。

更新!这实际上发生了。所以您只需在图像上放置正确的自然宽度和高度属性,它们就会在没有卡顿的情况下加载,即使 CSS 使图像具有流动性。所以像这样操作:<img src="image.jpg" width="800" height="600">

现在有方法在 HTML/CSS 中创建 纵横比大小的盒子。没有一个选项特别优雅,因为它们依赖于设置零高度并使用填充推动盒子高度的“技巧”。如果有一个平台功能可以帮助我们解决这个问题,岂不是更好?我所知的第一个解决此问题的尝试是 intrinsicsize 属性。Eric Portis 在 流畅的图像加载 中写道了它是如何完美地工作。

我们将得到以下内容

<img src="image.jpg" intrinsicsize="800x600" />

这目前在 Chrome 71+ 中 处于实验阶段,它确实有助于解决此问题。

但是……

intrinsicsize 属性是全新的。它仅在开发人员了解并注意实施它的网站上才有帮助。而且它很棘手!图像往往是任意大小的,并且每个图像都需要自定义 intrinsicsize 属性才能准确并发挥其作用。也就是说,如果它根本能从标准中脱颖而出的话。

还有另一种可能性!Eric 还谈到了 CSS 中的 aspect-ratio 属性作为一种潜在的解决方案。它也仍然 只是一个草案规范。您可能会说,但这有什么用?它需要像 intrinsicsize 一样定制,这意味着您必须将其作为内联样式才能发挥作用。如果它能解决一个大问题,也许这还不错,但内联样式很难覆盖,而且 HTML 属性方法似乎更符合图像的精神。想想 srcset 如何提示浏览器可下载哪些图像,允许浏览器为该场景选择最佳图像。提前告诉浏览器 aspect-ratio 同样有用。

我从 Jen Simmons 那里了解到了一种处理此问题的绝佳方法:根据元素现有的 widthheight 属性,将默认纵横比放入 UA 样式表中。 如下所示

img, video {
  aspect-ratio: attr(width) / attr(height);
}

仔细想想。

现在,如果您已经拥有

<img src="image.jpg" width="800" height="600" />

它会在页面加载时自动具有正确的纵横比。这太棒了。

  1. 它易于理解。
  2. 互联网上有很多网站已经在其图像上设置了这些属性。
  3. 新开发人员将毫不费力地理解这一点,而老开发人员会很高兴这里几乎(如果有)不需要做任何工作。

我喜欢 CSS 功能的想法。但我更喜欢将其放入 UAUA 样式表中的想法——这不是一件小事——我没有资格理解其中的所有含义——但乍一看,这感觉是一件非常棒的事情。

Jen 已发布了一个问题,供人们发表他们的想法,并链接到 Firefox 将在其中测试此功能以查看其效果的错误问题。