HTML5 响应式图片

2023-05-16

现在上网设备越来越多,各种设备的屏幕千差万别,如果只用一张图片去涵盖所有的设备,一是可能会造成某些设备上显示效果不佳,比如使用了一张低清晰度的图,而网页运行在一个高清大屏里;二是可能会浪费带宽,比如使用了一张超大图,而网页运行在小屏幕手机里。在很多情况下我们希望浏览器能根据具体的运行环境去选择最合适的图片来加载,这便是响应式图片。

一睹为快,可以克隆示例项目到本地运行查看

基于设备像素比(DPR)加载图片

设备像素比是指物理像素和逻辑像素(或CSS像素、设备独立像素)之间的比率,比如三个物理像素对应一个逻辑像素,那么设备像素比就是3:1。

这里写图片描述

不同的设备有不同的设备像素比。比如IPhone 6的DPR是2.0,Galaxy S5的DPR是3.0。设备像素比越高,显示效果就越高清,相应的对图片的分辨率要求也就更高。因此就出现了一个需求:希望高DPR的设备下载高清图,这样就不会出现模糊,低DPR的设备下载低清图,这样更节省带宽

<img>标签的srcset属性并使用x描述符可以实现这个功能:

<img src="pic.jpg" srcset="pic-hd.jpg 2x,pic-sd.jpg 3x">

上面的代码可以根据DPR的值来加载图片,pic-hd.jpg 2x表示当DPR=2,加载pic-hd.jpg,以此类推。

基于视口宽度加载图片

视口(viewport)就是浏览器窗口,在不同设备下,视口大小往往不同。这样就有一个问题,一张图片可能在大屏上显示正常,而在小屏幕上很能只显示到一块很小的区域里面,所以在小屏幕里面根本没必要加载这么大尺寸的图。

这里写图片描述

<img>标签的srcset属性并使用w描述符,再结合sizes属性就可以实现根据视口的宽度进行加载图片:

<img src="pic-small.jpg" 
     srcset="pic-small.jpg 200w,pic-medium.jpg 300w,pic-large.jpg 400w"       
     sizes="(min-width: 800px) 400px,(min-width: 500px) 270px,100px" >

上面的代码可以根据视口的宽度来加载图片,pic-small.jpg 200w表示图像的宽度为200px,w是图像宽度描述符,你可以当成是px来看。sizes属性表示的是图片显示区域的预期尺寸,(min-width: 800px) 400px 表示当视口大于800px时,图片显示区域的预期宽度是400px。

当浏览器打开网页时,它会根据屏幕大小算出图片显示区域的预期大小(通过sizes属性里的媒体查询),然后再根据图片显示区域的预期宽度选择合适图片进行加载。

其实这里影响浏览器选择的因素不止图片显示区域宽度一个,网络、DPR都会影响浏览器选择。所以,不用去猜浏览器会怎么选择,你只要在srcset中提供不同尺寸的图片,在sizes中提供不同视口下的图片显示区域大小的信息,剩下的事就不要管了,具体图片的选择,就交给浏览器去做吧。

注意:媒体查询条件最好从大到小按顺序写,如上面例子中,按800px>500px>0这样的顺序写,否则一些浏览器会忽略中间的媒体查询。

基于艺术设计加载图片

有时候我们希望根据视口的大小显示不同的图片,比如,在小屏幕中只显示主体部分的图片,而在大屏幕中,则可以显示其它没那么紧要的部分。

这里写图片描述

使用<picture>标签加<source>标签可以实现这个功能:

<picture>
    <source media="(min-width:800px)" srcset="pic-large.jpg">
    <source media="(min-width:500px)" srcset="pic-medium.jpg">
    <img src="pic-small.jpg">
</picture>

看起来和”基于视口宽度加载图片”的形式很像,不过这里浏览器会严格按照媒体查询的执行结果来选择加载哪个图片,不考虑网络、DPR等因素。

基于浏览器对图片格式的支持情况加载图片

不同的图片格式具有不同的特点,比如webp格式,具有很高的压缩比,但是浏览器支持情况还不太好,所以我们希望能够基于浏览器对图片格式的支持情况来选择加载合适的图片。

使用带有type属性的<source>标签可以实现这个功能:

<picture>
  <source srcset="hello.webp" type="image/webp">
  <source srcset="hello.jxr" type="image/vnd.ms-photo">
  <img src="hello.jpg" alt="" width="100" height="150">
</picture>

浏览器会从一个带有type属性的<source>标签开始检查,如果浏览器支持webp格式,就加载webp格式图片,否则检查浏览器是否支持jxr格式,如果支持,就使用jxr格式,否则,使用默认的jpg格式。

参考链接

  1. HTML5标准文档之嵌入内容 文章的主要内容参考至这里
  2. img srcset attribute 结合标准文档综合看
  3. MDN img docs
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTML5 响应式图片 的相关文章

随机推荐

  • 使用SSH远程如何显示图形界面

    背景 xff1a 通常在使用SSH连接到服务器时 xff0c 无法显示图形界面 xff08 例如opencv python中cv2 imshow 函数和ROS中rviz的调用等 xff09 xff0c 使用下述操作可以解决这个问题 xff1
  • VTK 学习----3D基础知识-着色器和图形管道

    2 5 着色器和图形管道 2 5 1 图形管道 在三维绘图引擎中 xff0c 一切物体都在三维空间 xff0c 但屏幕和窗口是2D像素阵列 xff0c 因此三维引擎的大部分工作是将所有3D坐标转换为合适屏幕的2D像素 将3D坐标转换为2D像
  • debian作为web server 的进一步深化设置

    1 xff0c 打开gzip压缩 http www jzxue com wangzhankaifa php 201104 14 7108 html php ini zlib output compression 61 On zlib out
  • Hadoop shell

    1 Hadoop shell 1 1 引言 调用文件系统 FS Shell命令应使用 bin hadoop fs lt args gt 的形式 所有的的FS shell命令使用URI路径作为参数 URI格式是scheme authority
  • windows 平台适配达梦数据库 dmPython: python3.9 ---import dmPython提示找不到指定的模块

    报错现象 xff1a Python 3 9 0 tags v3 9 0 9cf6752 Oct 5 2020 15 34 40 MSC v 1927 64 bit AMD64 on win32 Type 34 help 34 34 copy
  • UIControlEvents中的event被触发解释

    UIControlEventTouchDown 鼠标按下 UIControlEventTouchDownRepeat 重复点击 注 多次重复按下时 UIControlEventTouchDown gt UIControlEventTouch
  • iOS设置圆角的4种方法

    1 直接layer层的设置 不推荐 其中的masksToBounds会实现离屏渲染 GPU会在当前屏幕缓冲区开辟一个新的缓冲区进行工作 也就是离屏渲染 这会给我们带来额外的性能损耗 如果这样的圆角操作达到一定数量 会触发缓冲区的频繁合并和上
  • 红帽RHCE之查看进程

    列出进程 进程的定义 xff1a 进程 xff08 process xff09 是已启动的可执行程序的运行中实例 xff0c 由以下部分组成 xff1a 1 已分配的内存地址空间 2 安全属性 xff0c 包括所有权凭据与特权 3 程序代码
  • could not find main class com/intellij/idea/main

    虚拟机 Windows 32位操作系统 安装完idea 出现 could not find main class com intellij idea main 解决方案 xff1a 问题很形象了没有主启动类 xff0c idea的安装需要j
  • H5 使用微信开放标签跳转小程序

    微信开放标签是微信公众平台面向网页开发者提供的扩展标签集合 xff0c 可以在网页上提供跳转小程序 打开 App 等能力 本文梳理使用微信开放标签跳转小程序的过程 xff0c 以备日后查阅 参考链接 1 开放标签说明文档 准备已认证的服务号
  • @Autowired和构造方法执行的顺序解析

    先看一段代码 xff0c 下面的代码能运行成功吗 xff1f span class hljs annotation 64 Autowired span span class hljs keyword private span User us
  • 腾讯视频客户端导出MP4格式

    腾讯视频下载下来之后是 qlv格式 xff0c 这种格式只能使用客户端播放 感觉挺蛋疼的 xff0c Mp4好不容易让各种设备都可以统一播放视频了 xff0c 这样一搞感觉又倒退了几十年 xff0c 关键的是 xff0c 有些资源是腾讯独家
  • Anaconda安装及配置python虚拟环境

    近期需要在多个场景下进行实验 xff0c 而不同场景的测试脚本所需的环境配置不同 xff0c 所以疲于在服务器上配置不同的环境 因为这个成功地被mentor喷了个半死 xff0c 在mentor的提示下才想起配置虚拟环境这回事 xff08
  • ThreeJS 开发实例

    形状和材质 虚线 画虚线 xff1a function DrawDashLine span class hljs keyword var span geometry 61 span class hljs keyword new span T
  • Threejs性能监视和可视化控制

    概述 性能监视是监视threejs运行中的刷新频率 xff0c 要使用到threejs提供的stat js xff0c 可视化控制是在窗口中显示一个可见的控制框 xff0c 可以通过鼠标改变其中的值 xff0c 达到改变threejs对象参
  • threejs加载3D模型例子

    加载3D模型 首先要引入ColladaLoader加载器 xff0c Collada是一个3D模型交换方案 xff0c 即不同的3D模型可以通过Collada进行相互转换 xff0c 言外之意 xff0c threejs可以使用Collad
  • threejs坐标转换

    屏幕坐标转three js坐标 将屏幕坐标转变成threejs空间坐标 xff1a span class hljs function span class hljs keyword function span span class hljs
  • 搭建GitLab+Jenkins持续集成环境图文教程

    GitLab是一个代码仓库 xff0c 用来管理代码 Jenkins是一个自动化服务器 xff0c 可以运行各种自动化构建 测试或部署任务 所以这两者结合起来 xff0c 就可以实现开发者提交代码到GitLab xff0c Jenkins以
  • threejs-经纬度转换成xyz坐标的方法

    用threejs做3D应用时 xff0c 很经常会接触到球状物体 xff0c 比如说地球 xff0c 要定义球上的一点 xff0c 用经纬度是常用的办法 现在 xff0c 我们要在北京这个地方标一个点 xff0c 北京的坐标为 北纬39 9
  • HTML5 响应式图片

    现在上网设备越来越多 xff0c 各种设备的屏幕千差万别 xff0c 如果只用一张图片去涵盖所有的设备 xff0c 一是可能会造成某些设备上显示效果不佳 xff0c 比如使用了一张低清晰度的图 xff0c 而网页运行在一个高清大屏里 xff