You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化Laravel Blade组件中<picture>元素的冗长标记?

优化Laravel Blade组件中<picture>元素的冗长写法

我正在编写一个Laravel Blade组件,用于输出包含不同源的<picture>元素。根据布局和图片可用性会有不同配置,但最终生成的标记十分冗长,因此想找更简洁的实现方式。

初始图片标记

<img src="img_home_desk.jpg" width="1340" height="777"/>

添加AVIF和WebP格式支持

由于存在该图片的avif和webp版本,需要添加包裹的picture元素及两个备选源:

<picture>
  <source srcset="img_home_desk.avif" type="image/avif">
  <source srcset="img_home_desk.webp" type="image/webp">
  <img src="img_home_desk.jpg" width="1340" height="777"/>
</picture>

适配非视网膜显示器

为给非视网膜显示器显示更小图片,添加1x版本:

<picture>
  <source
    srcset="img_home_desk.avif 2x, img_home_desk_670.avif"
    type="image/avif"
  >
  <source
    srcset="img_home_desk.webp 2x, img_home_desk_670.webp"
    type="image/webp"
  >
  <img src="img_home_desk.jpg" width="1340" height="777"/>
</picture>

适配移动视口(不同比例)

若要为移动视口显示不同图片,需新增两个源。小图无视网膜版本,但比例不同,需在源中指定宽高:

<picture>
  <source
    srcset="img_home_desk.avif 2x, img_home_desk_670.avif"
    media="(min-width: 992px)"
    type="image/avif"
  >
  <source
    srcset="img_home_desk.webp 2x, img_home_desk_670.webp"
    media="(min-width: 992px)"
    type="image/webp"
  >
  <source
    srcset="img_home_desk_750.avif"
    media="(max-width: 991px)"
    type="image/avif"
    width="750"
    height="440"
  >
  <source
     srcset="img_home_desk_750.webp"
     media="(max-width: 991px)"
     type="image/webp"
     width="750"
     height="440"
    >
   <img src="img_home_desk.jpg" width="1340" height="777"/>
</picture>

适配更多视口尺寸(解决Lighthouse提示)

此时Lighthouse仍提示部分视口下图片过大,因此为移动端和桌面端添加两个中间尺寸图片,每个尺寸对应两种格式,新增4个source元素:

<picture>
  <source
    srcset="img_home_desk.avif 2x, img_home_desk_670.avif"
    media="(min-width: 1200px)"
    type="image/avif"
  >
  <source
    srcset="img_home_desk.webp 2x, img_home_desk_670.webp"
    media="(min-width: 1200px)"
    type="image/webp"
  >
  <source
    srcset="img_home_desk_1140.avif 2x, img_home_desk_570.avif"
    media="(min-width: 992px)"
    type="image/avif"
  >
  <source
    srcset="img_home_desk_1140.webp 2x, img_home_desk_570.webp"
    media="(min-width: 992px)"
    type="image/webp"
  >
  <source
    srcset="img_home_desk_750.avif"
    media="(min-width: 413px)"
    type="image/avif"
    width="750"
    height="440"
  >
  <source
    srcset="img_home_desk_750.webp"
    media="(min-width: 413px)"
    type="image/webp"
    width="750"
    height="440"
  >
  <source
    srcset="img_home_desk_600.avif"
    media="(max-width: 412px)"
    type="image/avif"
    width="750"
    height="440"
  >
  <source
    srcset="img_home_desk_600.webp"
    media="(max-width: 412px)"
    type="image/webp"
    width="750"
    height="440"
  >
  <img src="img_home_desk.jpg" width="1340" height="777"/>
</picture>

补充说明

图片路径已简化,实际由CMS通过参数生成(如img_home_desk.jpg?fm=webp&w=764),无需手动创建所有变体,浏览器最终仅请求一张图片。

问题

是否有更简洁的写法?已知srcset可列多源,但无法与2x密度描述符混用,想请教该场景下的语法优化建议。


内容的提问来源于stack exchange,提问作者Giorgio Tempesta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 23:05:21