【问题标题】:Setting dimensions of <img> fallback for <source> inside <picture>, for SEO/page loading time为 <picture> 内的 <source> 设置 <img> 后备尺寸,用于 SEO/页面加载时间
【发布时间】:2020-05-07 20:17:50
【问题描述】:

使用下面的代码,我正在尝试实现这一目标:

  • 允许浏览器在 WEBP &lt;source&gt; 和 JPEG in&lt;img&gt; 之间进行选择(作为后备)
  • 如果视口宽度 >1058px,则将图像显示为 754px 宽,或者,对于较小的视口,自动选择五个图像之一并拉伸到视口宽度。
  • 具有&lt;img&gt;src 属性,它指向低分辨率延迟加载版本
  • 为 SEO/UX 原因指定 HTML 中图像的 widthheight(更多内容见下文)。

    <div>
    <picture>
    <source type="image/webp" 
         data-srcset="
            image_100.webp 100w, 
            image_200.webp 200w, 
            image_400.webp 400w, 
            image_600.webp 600w,
            image_754.webp 754w" 
            data-sizes="(min-width: 1058px) 1000px, 100%" />
    <img data-srcset="
            image_100.png 100w, 
            image_200.png 200w, 
            image_400.png 400w, 
            image_600.png 600w,
            image_754.png 754w" 
            data-sizes="(min-width: 1058px) 1000px, 100%" 
            src="image_min.png" width="1000" height="300" alt="image_alt" />
    </picture>
    </div>
    

你问为什么会有data- 前缀?我想使用延迟加载脚本,它会在应该显示图像的正确时间删除它们。

在延迟加载脚本启动之前,浏览器将忽略&lt;source&gt; 元素,因为此时正确的srcsetsizes 将不存在。浏览器还将忽略&lt;img&gt; 中的data-srcsetdata-sizes,因此将显示src 中定义的低分辨率/占位符图像。

知道图像尺寸和 w/h 比,我还想以 HTML 格式提供这些,以便浏览器知道在加载期间为图像保留什么空间,在图像之前已加载,以防止重新渲染。

简单地将图像的绝对值设置为style&lt;img&gt;widthheight属性,仅对视口宽度>1058px有效。否则,尺寸是相对于视口大小的。所以,我想告诉浏览器,图片的宽度和高度分别为父 &lt;div&gt; 宽度的 100% 和 30%,这在所有情况下都有效。

我知道有一个 css padding-top 技巧,可以保持 div 的纵横比,但我不确定我是否可以在这个场景中使用它,因为它实际上会在图像上方创建一个填充。

关于设置后备图像尺寸的任何其他想法?

【问题讨论】:

  • 您绝对可以使用填充技巧 - 但您需要将图像绝对定位在包装 div 内 - 这样它就不会在图像上方创建填充 - 仅用作占位符。
  • @ajobi,你是对的,当&lt;div&gt;&lt;img&gt; 的父级时,填充技巧有效。但是,我无法让它与 &lt;picture&gt; 一起使用。
  • 您能创建一个沙盒示例吗? jsfiddle什么的。我以后可能会检查它
  • @ajobi,对不起,我的错。我一定搞砸了我的代码。 padding-top hack 甚至可以在 &lt;picture&gt; 中使用 &lt;img&gt;。所以谢谢你!
  • 酷!恭喜

标签: html css responsive-design responsive-images srcset


【解决方案1】:

好吧,一个合理的答案毕竟是将&lt;picture&gt; 包装在&lt;div&gt; 容器中并应用CSS,包括padding-top hack,以保持其纵横比:

<div style="position:relative;"width:100%;padding-top:33%>
<picture>
<source type="image/webp" 
     srcset="
        image_100.webp 100w, 
        image_200.webp 200w, 
        image_400.webp 400w, 
        image_600.webp 600w,
        image_754.webp 754w" 
        sizes="(min-width: 1058px) 1000px, 100%" />
<img srcset="
        image_100.png 100w, 
        image_200.png 200w, 
        image_400.png 400w, 
        image_600.png 600w,
        image_754.png 754w" 
        sizes="(min-width: 1058px) 1000px, 100%" 
        src="image_min.png" style="width:100%;height:100%;position:absolute" alt="image_alt" />
</picture>
</div>
  • 回退的 CSS &lt;img&gt;: widthheight 设置为 100% 和 position:absolute
  • &lt;div&gt; 包装器必须是 CSS position:relative,以便图像“绝对”位于其中。
  • &lt;div&gt; 必须设置 widthpadding-top 以反映图像的尺寸/纵横比。
  • CSS 不需要内联定义,因此可以使用媒体查询针对不同的视口大小设置不同的 div 包装器的大小。

它的工作原理如下:

&lt;img&gt; 元素完全填满了&lt;div&gt; 包装器。感谢position:absolute&lt;div&gt; 包装器的padding-top 对图像的位置没有影响。 padding-top 的百分比值使其相对于元素 width,因此纵横比保持不变(例如,padding-top 设置为 100% 会使包装器始终为正方形)。

SEO/UX 的主要好处:

无论sizessrcset 的值是什么,如果尺寸(因此纵横比)已知,我们可以使用备用&lt;img&gt; 的CSS 创建一个占位符,从而为图像保留空间尚未加载,甚至尚未被浏览器从srcset 中选择。

最终,这将防止页面布局发生烦人的变化,这是由于在已经呈现的页面上绘制图像而引起的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 2017-04-12
    • 2019-01-29
    • 2023-03-08
    相关资源
    最近更新 更多