【问题标题】:picture srcset with webp - how to implement sizes?带有 webp 的图片 srcset - 如何实现尺寸?
【发布时间】:2020-07-20 12:53:47
【问题描述】:

我正在尝试使用支持 WebP 的图片标签。

(如果屏幕尺寸超过 1024px 则加载 image-full,最大宽度为 1024px 时加载 image-1024,最大宽度 768 像素时加载 image-768,最大宽度 500px 时加载 image-500)

我有这段代码,w3 验证器抱怨:当 srcset 属性有任何带有宽度描述符的图像候选字符串时,sizes 属性也必须存在。

如何在其中实现尺寸?有没有更好/不同的方法我应该这样做?

<picture>
// load webp in different sizes if browser supports it
<source media="(min-width: 1025px)" 
    srcset="webp/image-full.webp"
    type="image/webp">
<source media="(max-width: 1024px)"
    srcset="webp/image-1024.webp" 
    type="image/webp">
<source media="(max-width: 768px)" 
    srcset="webp/image-768.webp"
    type="image/webp">
<source media="(max-width: 500px)" 
    srcset="webp/image-500.webp"
    type="image/webp">

// load jpg in different sizes if browser doesn't support webp
<source media="(min-width: 1025px)"
    srcset="siteimages/image-full.jpg" 
    type="image/jpeg">
<source media="(max-width: 1024px)"
    srcset="siteimages/image-1024.jpg" 
    type="image/jpeg">
<source media="(max-width: 768px)"
    srcset="siteimages/image-768.jpg" 
    type="image/jpeg">
<source media="(max-width: 500px)"
    srcset="siteimages/image-500.jpg" 
    type="image/jpeg">

// fallback in different sizes, as well as regular src.
<img 
    srcset="siteimages/image-1024.jpg, 
        siteimages/image-768.jpg,
        siteimages/image-500.jpg"

    src="siteimages/image-full.jpg" 

    alt="image description"
    class="myimageclass">
</picture>

【问题讨论】:

    标签: html webp srcset


    【解决方案1】:

    虽然在img 标签中提供多个srcset,但浏览器需要scrset 和sizes 属性来帮助浏览器选择正确的一个。

    你可以像下面这样添加更新代码,它应该可以正常工作 -

    <picture>
    // load webp in different sizes if browser supports it
    <source media="(min-width: 1025px)" 
        srcset="webp/image-full.webp"
        type="image/webp">
    <source media="(max-width: 1024px)"
        srcset="webp/image-1024.webp" 
        type="image/webp">
    <source media="(max-width: 768px)" 
        srcset="webp/image-768.webp"
        type="image/webp">
    <source media="(max-width: 500px)" 
        srcset="webp/image-500.webp"
        type="image/webp">
    
    // load jpg in different sizes if browser doesn't support webp
    <source media="(min-width: 1025px)"
        srcset="siteimages/image-full.jpg" 
        type="image/jpeg">
    <source media="(max-width: 1024px)"
        srcset="siteimages/image-1024.jpg" 
        type="image/jpeg">
    <source media="(max-width: 768px)"
        srcset="siteimages/image-768.jpg" 
        type="image/jpeg">
    <source media="(max-width: 500px)"
        srcset="siteimages/image-500.jpg" 
        type="image/jpeg">
    
    // fallback in different sizes, as well as regular src.
    <img 
        srcset="siteimages/image-1024.jpg 1024w, 
            siteimages/image-768.jpg 768w,
            siteimages/image-500.jpg 500w"
    
        sizes="(max-width: 1024px) 1024px,
                (max-width: 768px) 768px,
                (max-width: 500px) 500px"
    
        src="siteimages/image-full.jpg" 
    
        alt="image description"
        class="myimageclass">
    </picture>
    

    简而言之,我们告诉浏览器加载 srcset 列表中引用的与所选插槽大小最匹配的图像

    Responsive Images Detailed Tutorial

    【讨论】:

    • 谢谢!效果很好。我不确定在哪里添加它,一些教程也在源标签内的某处添加了 800w 或 2x。在您链接到的示例中,我不清楚 做了什么?对于最大宽度为 600 像素的屏幕尺寸,它同时提供 480 像素和 800 像素大小的图像?
    • 没问题。对于最大宽度为 600 像素的屏幕尺寸,它将为其余屏幕尺寸选择 480 像素和 800 像素的图像。
    • 如果我不能真正将一个集合写入源的 srcset 属性,或者我可以吗?
    • 您还必须将源顺序从最小到最大颠倒才能使其正常工作,正如我在 Firefox 上测试的那样
    • 这里的 sizes 属性的片段顺序错误。使用第一个匹配,所以对于一个小屏幕,比如 400px,它将首先匹配 max-width: 1024px 并加载最大的图像,当然你希望它加载最小的。
    【解决方案2】:

    基于@varun 的回答,您可以稍微简化一下代码:

    • 改进:如果 image/jpeg 已经在 &lt;img&gt; 中,则不需要 - 浏览器会自动回退
    • 改进:合并多个&lt;source&gt;标签。
    • 修复:将默认宽度 100vw 添加到 sizes 标签(即未定义大于 1024 像素的视口)
    • 修复:media 标签用于美术指导,不用于分辨率切换,区别见Mozilla's guide
    <picture>
        // load webp in different sizes if browser supports it
        <source type="image/webp"
            sizes=" (max-width: 500px) 500px,
                    (max-width: 768px) 768px,
                    (max-width: 1024px) 1024px,
                    100vw"
            srcset="
              webp/image-500.webp 500w,
              webp/image-768.webp 768w,
              webp/image-1024.webp 1024w,
              webp/image-full.webp 1920w
            "
            >
        // fallback on original src.
        <img 
            srcset="siteimages/image-1024.jpg 1024w, 
                siteimages/image-768.jpg 768w,
                siteimages/image-500.jpg 500w"
            sizes=" (max-width: 500px) 500px,
                    (max-width: 768px) 768px,
                    (max-width: 1024px) 1024px,
                    100vw"
            src="siteimages/image-full.jpg" 
    
            alt="image description"
            class="myimageclass">
    </picture>
    

    【讨论】:

    • 您的尺寸属性顺序错误。请参阅developer.mozilla.org/en-US/docs/Learn/HTML/…,它表示浏览器将根据大小的第一个匹配元素从 srcset 中进行选择。这意味着在您使用 400px 视口的情况下,(max-width: 1024px) 将匹配并且它将加载不必要的大图像。它应该从最小到最大,然后是后备。
    • 谢谢@tremby,很好。
    猜你喜欢
    • 1970-01-01
    • 2021-03-07
    • 2020-08-16
    • 2016-11-30
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    相关资源
    最近更新 更多