HTML5 响应式图片

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

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

基于设备像素比(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

threejs坐标转换

屏幕坐标转three.js坐标 将屏幕坐标转变成threejs空间坐标&#xff1a; function transToThreeCoord(x,y){let mouse new THREE.Vector3();mouse.x (x/window.innerWidth)*2 -1;mouse.y -(y/window.innerHeight)*2 1;return mouse; }注意&#xff1a;在实际使用中&#x…

android socket 发送byte_如何正确地创建和销毁网络通讯程序中的Socket类的对象实例...

软件项目实训及课程设计指导——如何正确地创建和销毁软件应用系统中网络通讯中的Socket类的对象实例1、基于TCP/IP协议的Socket通信相关的基础知识(1)TCP/IP(Transmission Control Protocol传输控制协议/Internet Protocol网间协议)TCP/IP是目前Internet网络中的主要协议&…

H5 使用微信开放标签跳转小程序

微信开放标签是微信公众平台面向网页开发者提供的扩展标签集合&#xff0c;可以在网页上提供跳转小程序、打开 App 等能力。本文梳理使用微信开放标签跳转小程序的过程&#xff0c;以备日后查阅。 参考链接 1. 开放标签说明文档 准备已认证的服务号 开放标签只能绑定已认证…

【网络流24题】No.7 试题库问题 (最大流,二分图多重匹配)

【题意】 假设一个试题库中有 n 道试题。 每道试题都标明了所属类别。 同一道题可能有多个类别属性。现要从题库中抽取 m 道题组成试卷。并要求试卷包含指定类型的试题。 试设计一个满足要求的组卷算法。 输入文件示例input.txt3 153 3 42 1 21 31 31 31 33 1 2 32 2 32 1 31 2…

参数等效模型可以用于_干货分享电池单体产热特性及热模型标定分析(2)

上篇已讲解了电池单体产热特性及电池模型相关理论&#xff0c;相较之下等效电路模型无需对电池内部的电化学反应有着深入的分析&#xff0c;是通过电路来描述电池的开路电压、内阻等&#xff0c;以实现对电池外特性的表征。本篇将继续讨论此问题&#xff0c;用Matlab和Amesim模…

检测同心圆_(二)光线如何被眼睛检测到?

在第一篇文章中&#xff08;链接&#xff1a;&#xff08;一&#xff09;视觉系统的全貌&#xff09;&#xff0c;我们已经了解了视觉信息被大脑处理的全过程。现在&#xff0c;我们把目光投向一切的起点——眼睛。实际上&#xff0c;人们提起“视觉”&#xff0c;首先想到的几…

matlab计算斜方差_计算一幅图像的信噪比

本文摘自本人的毕业设计《数字图像滤波算法研究》2019, Chang’an University, Xi’an, China.本文适用于原始图像&#xff08;即不含噪声的图像&#xff09;存在的情况下。使用待计算SNR图像&#xff08;记为A&#xff09;与原始图像&#xff08;记为B&#xff09;做相减运算&…

【转载】linux进程及进程控制

Linux进程控制 程序是一组可执行的静态指令集&#xff0c;而进程(process)是一个执行中的程序实例。利用分时技术&#xff0c;在Linux操作系统上同时可以运行多个进程。分时技术的基本原理是把CPU的运行时间划分成一个个规定长度的时间片&#xff0c;让每个进程在一个时间片内运…

区分大小屏幕_VESA持续推动DisplayHDR认证计划,你的屏幕属于何种等级吗?

美国视频电子标准协会(VESA)今年可说是动作频频&#xff0c;年初先发布了专为OLED与其他自发光显示器所制订的DisplayHDR True Black高动态范围标准&#xff0c;下半年则更新DisplayHDR兼容测试规范至1.1版&#xff0c;并发布新的DisplayHDR 1400性能分级&#xff0c;至于年中所…

cordova 某个页面强制横屏_小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?...

老刘 1前言这篇文章是应网友之邀所写&#xff0c;主要描述一下我们访问网站时&#xff0c; 从输入网址到最后浏览器呈现内容&#xff0c;中间发生了什么。今天的文章主要专注于应用层&#xff0c;我拿了一个很简单的网络结构来讲。假定本机已经获取了IP地址&#xff0c;各种网络…

vue调用手机相机相册_今天才发现,点一下小米手机相册,能将照片一键制作成电影...

随着国产手机的发展&#xff0c;手机像素越来越高&#xff0c;里面的功能也越来越丰富&#xff0c;手机拍照成了不少人的日常&#xff0c;如果你很爱拍照&#xff0c;手机里有一大堆照片&#xff0c;那么教你用手机自带的相册功能&#xff0c;一键将照片制作成电影&#xff0c;…

unity 烘焙参数 设置_Unity通用渲染管线(URP)系列(九)——点光源和聚光灯

200篇教程总入口&#xff0c;欢迎收藏&#xff1a;放牛的星星&#xff1a;[教程汇总持续更新]Unity从入门到入坟——收藏这一篇就够了​zhuanlan.zhihu.com本文重点内容&#xff1a;1、支持更多类型的灯光2、包含实时的点光源和聚光灯3、为点光源和聚光灯烘焙阴影4、每个物体限…

c#日期转换周几_Java时间与日期

只有把眼前的事情做好&#xff0c;才能考虑其他的问题。众所周知&#xff0c;全世界在同一时刻看手表肯定不会看到同一个时间&#xff0c;因为地球是圆的&#xff0c;面对太阳的角度是不一样的&#xff0c;我们一般说时间几点几点&#xff0c;是指的本地时间&#xff0c;比如国…

Python开发之--前端 HTML基础

一&#xff1a;HTML介绍 HTML&#xff1a;超文本标记语言&#xff0c;标准通用标记语言下的一个应用。包括“头”部分&#xff08;英语&#xff1a;Head&#xff09;、和“主体”部分&#xff08;英语&#xff1a;Body&#xff09;&#xff0c;其中“头”部提供关于网页的信息&…

给与用户建立dblink的权限_网络安全 之 NTFS安全权限

NTFS安全权限一、NTFS权限概述1、通过设置NTFS权限&#xff0c;实现不同的用户访问不同的权限2、分配了正确的访问权限后&#xff0c;用户才能访问其资源3、设置权限防止资源被篡改、删除二、文件系统概述 文件系统即在外部存储设备上组织文件的方法常用的文件系统&#xff1a;…

TCP 连接中的TIME_WAIT

原文&#xff1a;http://blog.csdn.net/wangpengqi/article/details/17245349 这就有个细节&#xff0c;一次http请求&#xff0c;谁会先断开TCP连接&#xff1f;什么情况下客户端先断&#xff0c;什么情况下服务端先断&#xff1f; 百度后&#xff0c;找到原因&#xff0c;主要…

丁丁打折网卷能用吗_微信群控还能用吗?现在什么群控还能使用吗?

微信群控系统还能用吗&#xff1f;为什么现在微信群控系统越来越被限制了呢&#xff1f;其实&#xff0c;微信群控我想在生活中占据着很大的位置&#xff01;因为微信这么多的使用&#xff0c;现在微信使用人数都是几十亿了&#xff0c;所以很多人看重微信群控系统的市场&#…

错题整理

1.JAVA语言的下面几种数组复制方法中&#xff0c;哪个效率最高&#xff1f; A for循环逐一复制 B System.arraycopy C System.copyof D 使用clone方法 答案&#xff1a;B A、for循环的话&#xff0c;很灵活&#xff0c;但是代码不够简洁. for循环为什么慢&#xff0c;java中所…

xpath中两个冒号_爬虫学习(5)—XPath

之前我们写了一个简单的爬虫&#xff0c;在提取页面信息时我们使用正则表达式来匹配内容&#xff0c;但是正则表达式的书写比较繁琐&#xff0c;而且一旦错误就可能导致匹配失败。对于网页的节点来说&#xff0c;它可以定义id&#xff0c;class或其他的属性&#xff0c;而且节点…

canny算法的实现(android加载图片,数组写入文件换行)

Canny边缘检测首先要对图像进行高斯去噪&#xff0c;前面讲到了高斯去噪处理&#xff0c;这里从对图像灰度进行微分运算讲起吧。微分运算常用的方法是利用模板算子&#xff0c;把模板中心对应到图像的每一个像素位置&#xff0c;然后按照模板对应的公式对中心像素和它周围的像素…