【问题标题】:Maintain aspect ratio of images in Chrome during native lazy-loading在原生延迟加载期间保持 Chrome 中图像的纵横比
【发布时间】:2020-07-16 12:26:54
【问题描述】:

更新:原来这是由于bug in Chrome。我仍在寻找解决方法。


我正在尝试通过在 img 元素上设置 loading="lazy" 来在 Chrome 中使用延迟加载。我还使用以下方法让图像适合:

img {
  max-width: 100%;
  height: auto;
}

不幸的是,在图像实际加载之前显示的图像占位符在 Chrome 中具有方形纵横比。它不遵循img 元素的width/height 属性中设置的纵横比。这发生在以下条件下:

  • 仅在 Chrome 中(不在 Firefox 75 中,它也支持延迟加载)。
  • 仅当设置loading="lazy" 时。如果没有此属性,则会保留纵横比。

是否有解决方案来保留图像的纵横比,如 width/height 中设置的那样,即使延迟加载也是如此?


Here's an article 建议我正在做的事情应该有效。另请参阅文章中嵌入的视频,说的是一样的。


如果使用 Chrome 的开发者工具限制网络速度,您可以通过以下示例观察问题。我包括一个屏幕录像来说明问题。我不希望加载后图像大小发生变化,因为它会导致页面元素移动。

一个最小的例子

HTML:

<html>
<head>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur pretium nibh tellus, ac luctus erat viverra sed. Aliquam sed nisi sed sapien tempus consectetur vestibulum vel diam. Ut vel faucibus metus. Donec non sem et purus luctus dictum nec et elit. Suspendisse et ipsum tortor. Proin eros massa, pulvinar a ante eu, imperdiet consequat dolor. Pellentesque sed lacus nulla. Mauris gravida purus sed facilisis sollicitudin.
</p>
<p>
    <img src="image.png" width="850" height="422" loading="lazy">
</p>
<p>
Vivamus sagittis faucibus elit non feugiat. Curabitur interdum nulla sed ligula pharetra, in faucibus tortor ullamcorper. Curabitur tristique libero in lobortis posuere. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Quisque quis velit sed tellus aliquet dictum. Fusce vitae consectetur lacus. In scelerisque varius euismod. Nunc scelerisque enim quis lacus dignissim tincidunt. Nulla suscipit, odio eu dictum condimentum, massa elit vestibulum leo, ut lobortis dolor felis vel erat. Cras dapibus, nunc eget sollicitudin semper, elit nisl dictum leo, non semper quam nunc consequat augue. Vivamus bibendum mauris sapien, vel sagittis urna consequat ut.
</p>
</body>
</html>

CSS:

body {
    max-width: 600px;
    padding: 20px;
}

img {
    border: solid black;
    max-width: 100%;
    height: auto;
}

图片:

【问题讨论】:

    标签: html css image google-chrome lazy-loading


    【解决方案1】:

    代码沙盒 DEMO (source code)


    也许一个经典的 padding-top hack 可能会作为一种解决方法有所帮助。

    body {
      max-width: 600px;
      padding: 20px;
    }
    
    img {
      border: solid black;
      max-width: 100%;
      height: auto;
      box-sizing: border-box;
    }
    
    @supports (--foo: 1) {
      .aspect,
      .aspect-inline {
        position: relative;
      }
    
      .aspect {
        padding-top: calc(var(--height) / var(--width) * 100%);
        height: 0;
        display: block;
      }
    
      .aspect-inline {
        display: inline-block;
        vertical-align: middle;
      }
    
      .aspect img,
      .aspect-inline img {
        position: absolute;
        top: 0;
        max-height: 100%;
      }
    }
    <p>
      <picture class="aspect-inline" style="width: 50px; height: 24.8px">
        <img
          src="https://i.stack.imgur.com/SII5r.png"
          loading="lazy"
          width="50"
          height="24,8"
        />
      </picture>
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur pretium
      nibh tellus, ac luctus erat viverra sed. Aliquam sed nisi sed sapien
      tempus consectetur vestibulum vel diam. Ut vel faucibus metus. Donec non
      sem et purus luctus dictum nec et elit. Suspendisse et ipsum tortor. Proin
      eros massa, pulvinar a ante eu, imperdiet consequat dolor. Pellentesque
      sed lacus nulla. Mauris gravida purus sed facilisis sollicitudin.
    </p>
    <p>
      <picture class="aspect" style="--width: 850; --height: 422">
        <img
          src="https://i.stack.imgur.com/SII5r.png"
          loading="lazy"
          width="850"
          height="422"
        />
      </picture>
    </p>
    <p>
      Vivamus sagittis faucibus elit non feugiat. Curabitur interdum nulla sed
      ligula pharetra, in faucibus tortor ullamcorper. Curabitur tristique
      libero in lobortis posuere. Pellentesque habitant morbi tristique senectus
      et netus et malesuada fames ac turpis egestas. Quisque quis velit sed
      tellus aliquet dictum. Fusce vitae consectetur lacus. In scelerisque
      varius euismod. Nunc scelerisque enim quis lacus dignissim tincidunt.
      Nulla suscipit, odio eu dictum condimentum, massa elit vestibulum leo, ut
      lobortis dolor felis vel erat. Cras dapibus, nunc eget sollicitudin
      semper, elit nisl dictum leo, non semper quam nunc consequat augue.
      Vivamus bibendum mauris sapien, vel sagittis urna consequat ut.
    </p>

    【讨论】:

    • 谢谢,这很好用。不幸的是,在我的实际应用程序中,我也有一些内联图像,而且我还没有设法以使这些与独立图像区分开来的方式生成页面。我想知道这是否可以修改为不与内联图像冲突。内联图像的示例位于第一段的开头here。
    • 我已经更新了答案,不幸的是,没有办法正确区分“内联”图像和其他图像。我建议使用类。但是对于这种特殊的布局,所有“块”图像始终作为一个图像放置在段落中,您可以使用像 img:first-child:last-child 这样的选择器来仅选择这些图像并为它们应用样式。 i.imgur.com/TG7bT5Q.png
    • img:first-child:last-child
    猜你喜欢
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2016-06-01
    • 2017-04-11
    • 2019-12-13
    • 2019-05-30
    相关资源
    最近更新 更多