自适应图片:根据屏幕大小选择图片内容

自适应图片

根据屏幕大小选择图片内容。本文为学习笔记,主要内容为img的srcset与sizes属性,以及picture标签。学习内容来自于:

辅助调试:放在页面上实时监测屏幕大小

html 复制代码
<div style="font-size: 5vw;" id="data"></div>
<script>
      window.addEventListener('resize',updateText)
      updateText()

      function updateText(){
          const dataEl=document.querySelector('#data')
          data.textContent=`Width ${window.innerWidth}, Ratio: ${window.devicePixelRatio}`
      }
</script>

选择不同分辨率的图片

html 复制代码
<img
    style="width: 100vw;"
    src="https://placehold.co/1600x100/png"
    srcset="
        https://placehold.co/400x100/png  400w,
        https://placehold.co/800x100/png  800w,
        https://placehold.co/1600x100/png  1600w
    "
/>
  • src:默认使用的图片
  • srcset:定义了可选择的图片,以及宽度描述符/像素密度描述符
    • 格式:图片路径 描述符,用逗号隔开
    • 上面例子含义:当屏幕小于等于400px时,选择400x100的图片;当400px < 屏幕大小< 800px时,将选择800x100图片,依次类推。

考虑img宽度

上面例子设定的图片是铺满屏幕的(100vw),当图片没有铺满屏幕时,就需要用sizes属性了。

html 复制代码
<img
    style="width: 50vw;"
    src="https://placehold.co/1600x100/png"
    srcset="
        https://placehold.co/400x100/png  400w,
        https://placehold.co/800x100/png  800w,
        https://placehold.co/1600x100/png  1600w
    "
    sizes="(max-width: 800px) 100vw, 300px"
/>

sizes :按顺序判断依次决定图片容器大小。格式:媒体查询 容器大小,用逗号隔开,最后为默认的容器大小。

上面例子含义:当视口宽度≤800px时,图片容器是100vw,也就是屏幕宽度;而如果>800px,图片容器是300px。

具体到700px的屏幕宽度,它小于800px,那么容器宽度就使用100vw,也就是屏幕宽度700px,那图片将选择比700px要大的800x100;而如果屏幕大小为1200px,大于800px,那么容器宽度就使用默认值300px,图片将选择比300px要大的400x100

实时查询屏幕大小选择不同图片

上面的示例存在问题:只要匹配到第一个媒体查询,那么后边的将作废,也就是说图片只认准第一次媒体查询所选择的。这可以通过picture标签解决

html 复制代码
<picture>
  <source media="(max-width: 500px)" srcset="hiking-narrow.jpg" />
  <source media="(max-width: 1000px)" srcset="hiking-medium.jpg" />
  <img src="hiking-wide.jpg" alt="Someone jumping on a hike" />
</picture>

上面的例子中准备了三种不同尺寸的图片,source定义了不同屏幕大小时所使用的图片,img设定了默认使用的图片。

相关推荐
king王一帅4 分钟前
QuireKit 编辑器的 AI-Native 是如何设计的?谈谈我对真正 AI-Native 的理解
前端·开源·agent
风骏时光牛马14 分钟前
生成一个AI开源工具体验标题,只需要一个标题,不需要其他的任何文本。
前端
软件派1 小时前
生产动态数据智能风控:阈值判别、趋势预测、异常识别算法工程落地实战
前端·数据库·算法
花开盛夏^.^10 小时前
电脑打开多个浏览器Web窗口占用较大的运行内存的原因
前端·浏览器
馒头不想说话11 小时前
实体店老板的24小时AI运营员工,写、剪、发全自动,省下一整个团队工资
前端
椒哥13 小时前
一天被问几十次"允许",我统计了 517 次,然后写了个插件
前端·javascript·github
风骏时光牛马13 小时前
生成一个AI稳定性治理及疑难问题分析标题,只需要一个标题,不需要其他的任何文本。
前端
莫西干式秃头13 小时前
用 AI + threejs 写了个浏览器里的 3D 动作游戏《武来》:砍怪、放技能、开 SU7
前端·人工智能·three.js
kyriewen13 小时前
我测了 6 种防请求竞态的写法:只有 1 种真能打
前端·javascript·程序员
孟健14 小时前
用 WorkBuddy 做个人名片网页,挂上开源设计技能后效果完全不同了
前端·人工智能·ai编程