前端图片适配不同屏幕方案

预备知识:

设备独立像素,以下图的iphone12 Pro为例,390*844表示的就是设备独立像素(DIP),也可以理解为CSS像素
在这里插入图片描述

物理像素(设备像素),就是屏幕的分辨率,显示屏就是由一个个物理像素点组成的;
DPR(Device Pixel Ratio) 设备像素比,DPR = 物理像素 / 设备独立像素

在同样的css像素大小下,屏幕有不同的dpr,同样大小的图片渲染出来的效果会不一样;因此,为了在不同的 DPR 屏幕下,让图片看起来都不失真,我们需要为不同 DPR 的图片,提供不同大小的图片。有以下几个方案

方案一:媒体查询
通过相应的媒体查询,得知当前的设备的 DPR 值,使用对应的图片

 #image {
     background: url(xxx@1x.png)
 }
 @media (device-pixel-ratio: 2) {
     #image {
         background: url(xxx@2x.png)
     }
 }
 @media (device-pixel-ratio: 3) {
     #image {
         background: url(xxx@3x.png)
     }
 }

缺点:

  • 可能存在一些介于 1和2,2和3 之间的 DPR 值,匹配不到对应的
  • 注意:
    需要注意语法需要的兼容性,需要添加前缀,譬如 -webkit-min-device-pixel-ratio,可以由 autoprefixer 插件解决

方案二:CSS 配合 image-set 语法
image-set 属于 CSS background 中的一种语法,image-set() 函数为设备提供最合适的图像分辨率,它提供一组图像选项,每个选项都有一个相关的 DPR 声明,浏览器将从中选择最适合设备的图像进行设置。

 #imgage {
     /* 不支持 image-set 的浏览器*/
     background-image: url('xxx@1x.png');
     /* 支持 image-set 的浏览器*/
     background-image: image-set(
         url('xxx@2x.png') 2x,
         url('xxx@3x.png') 3x
     );
 }

缺点:

  • 和方案一一样

方案三:srcset 配合像素密度描述符
img标签的srcset属性 可以根据不同的 dpr 拉取对应尺寸的图片

 <div class='image'>
    <img src='xxx@1x.png'
        srcset='xxx@2x.png 2x,
                xxx@3x.png 3x'
    >
 </div>

上面 srcset 里的 2x,3x 表示 像素密度描述符,当屏幕的 dpr = 2 时,使用 xxx@2x.png.png 这张图,以此类推
缺点:

  • 和方案一一样

方案四:srcset 属性配合 sizes 属性 w 宽度描述符
上述 3 种方案都存在统一的问题,只考虑了 DPR,但是忽略了响应性布局的复杂性与屏幕的多样性;
srcset 属性还有一个 w 宽度描述符,配合 sizes 属性一起使用,可以覆盖更多的面;
sizes定义图像元素在不同的视口宽度时,可能的大小值;

<img
         sizes = “(min-width: 600px) 600px, 300px"
         src = "xxx.png"
         srcset = “xxx@1x.png 300w,
                        xxx@2x.png 600w,
                        xxx@3x.png 1200w,
 >

sizes = “(min-width: 600px) 600px, 300px” 的意思是:

  • 如果屏幕当前的 CSS 像素宽度大于或者等于 600px,则图片的 CSS 宽度为 600px
  • 反之,则图片的 CSS 宽度为 300px
    srcset = “photo@1x.png 300w, photo@2x.png 600w, photo@3x.png 1200w 里面的 300w,600w,900w 叫宽度描述符。

示例:
当前屏幕 dpr = 2 ,CSS 宽度为 375px。
当前屏幕 CSS 宽度为 375px,则图片 CSS 宽度为 300px(因为sizes定义了最小宽度,屏幕375px小于600px,所以图片的CSS宽度为300px)。分别用上述 3 个宽度描述符的数值除以 300。

  • 300 / 300 = 1
  • 600 / 300 = 2
  • 1200 / 300 = 4
    上面计算得到的 1、 2、 4 即是算出的有效的像素密度,换算成和 x 描述符等价的值 。这里 600w 算出的 2 即满足 dpr = 2 的情况,匹配到xxx@2x.png这张图。

示例:
当前屏幕 dpr = 3 ,CSS 宽度为 414px。
当前屏幕 CSS 宽度为 414px,则图片 CSS 宽度仍为 300px

  • 300 / 300 = 1
  • 600 / 300 = 2
  • 1200 / 300 = 4
    dpr = 3,2 不满足,因此匹配到 1200w 这张图。

JavaScript 方案实现图片的懒加载

通过 JavaScript 实现的懒加载,主要是两种方式:

  • 监听 onscroll 事件,通过 getBoundingClientRect API 获取元素图片距离视口顶部的距离,配合当前可视区域的位置实现图片的懒加载
  • 通过 HTML5 的 IntersectionObserver API,Intersection Observer(交叉观察器) 配合监听元素的 isIntersecting 属性,判断元素是否在可视区内,能够实现比监听 onscroll 性能更佳的图片懒加载方案
    还有一种是类似于懒加载的方式,类似于虚拟列表
  • 使用 content-visibility: auto 实现图片内容的延迟渲染
<template>
  <div class="card">
    <div class="img-container">
      <img class="img" :src="props.url" />
    </div>
    <div class="title">{{ props.title }}</div>
    <div class="area">{{ props.area }}</div>
    <div class="collect">{{ props.collect }}人想要</div>
    <div class="price"><span class="amount">{{ props.price }}</span>
    </div>
  </div>
</template>

<style>
.card {
  content-visibility: auto;
}
</style>

不在可视区域内的内容,一开始是没有被渲染的,在每次滚动的过程中,才逐渐渲染,以此来提升性能;虽然当前页面可视区域外的内容未被渲染,但是图片资源的 HTTP/HTTPS 请求,依然会在页面一开始被触发;因此严格来讲它并不是一个懒加载的方式;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

绝地求生:大逃杀,鼠标灵敏度设置教程及枪法练习技巧 鼠标灵敏度怎么设置

《绝地求生大逃杀》鼠标灵敏度怎么设置&#xff1f;作为一款FPS游戏&#xff0c;如何调整鼠标参数是大家急需掌握的&#xff0c;今天闲游盒带来“院长尼克”分享的《绝地求生大逃杀》鼠标灵敏度设置教程及枪法练习技巧&#xff0c;废话不多说&#xff0c;下面我们一起来看吧。 …

AIGC时代下,结合ChatGPT谈谈儿童教育

引言 都2024年了&#xff0c;谈到儿童教育&#xff0c;各位有什么新奇的想法嘛 我觉得第一要务&#xff0c;要注重习惯养成&#xff0c;我觉得聊习惯养成这件事情范围有点太大了&#xff0c;我想把习惯归纳于底层逻辑&#xff0c;我们大家都知道&#xff0c;在中国式教育下&a…

jdk17安装

前言 也许是太久没有新建java项目了&#xff0c;官网新建spring项目最低到17了&#xff0c;吃惊… 最近正好项目需要&#xff0c;就安装下&#xff0c;顺便记录下&#xff0c;与诸君共勉&#xff01;抱拳~ 参考文章 JDK17的下载安装与配置(详细教程) 文件下载地址 jdk17-win…

众和策略:人工智能风起云涌 算力基建支撑加速前进

2023年&#xff0c;人工智能技术完结质的飞跃。通过生成式AI&#xff08;AIGC&#xff09;技术&#xff0c;人们可用自然语言与机器进行便捷交互&#xff0c;并将海量的数据通过训练、推理&#xff0c;快速转化为出产力&#xff0c;发生实践商业价值。 AI技术加快向各行各业渗…

vue2导入

父页面 <template><div><div><el-button size"small" click"excelFn">导入</el-button></div><div v-if"ExcelInSure"><excelln :names"names" close"closeFn"></exce…

【解决问题】pyinstaller打包python应用进行快速分发

pyinstaller打包python应用进行快速分发 问题起因先利其器再善其事试用运行 问题起因 有同学问我要接口的应用&#xff0c;于是试了一下python打包成exe的过程。 先利其器 主要使用pyinstaller&#xff0c;可以通过pip安装 pip install pyinstaller安装过程如图 再善其事…

文本的剪切和复制有区别吗?有什么区别

在电脑操作中&#xff0c;文本的剪切与复制是我们经常进行的操作。尽管它们看起来都是对文本的“复制”行为&#xff0c;但两者在使用和功能上存在明显的差异。本文将详细介绍剪切与复制的区别&#xff0c;以帮助您更好地理解它们的适用场景和作用&#xff0c;并介绍剪切后如何…

亚信安慧AntDB数据并行加载工具的实现(二)

3.功能性说明 本节对并行加载工具的部分支持的功能进行简要说明。 1) 支持表类型 并行加载工具支持普通表、分区表。 2) 支持指定导入字段 文件中并不是必须包含表中所有的字段&#xff0c;用户可以指定导入某些字段&#xff0c;但是指定的字段数要和文件中的字段数保持一…

ArcGIS高程点生成等高线

基本步骤&#xff1a;数据清洗→创建TIN→TIN转栅格→等值线→平滑线。 1.&#xff08;重要&#xff09;数据清理&#xff1a;删除高程点中的高程异常值数据。 2.创建TIN:系统工具→3D Analyst Tools→数据管理→TIN→创建TIN&#xff08;可直接搜索工具TIN&#xff09;。 单击…

1万亿元国债支持水利、应急行业,钡铼智能终端积极助力提升防灾抗洪建设需求

10月24日&#xff0c;十四届全国人大常委会第六次会议审议通过了国务院关于增加发行国债支持灾后恢复重建和提升防灾减灾救灾能力的议案。为贯彻落实中共中央政治局常委会会议精神&#xff0c;以强有力的资金保障有关工作落实&#xff0c;中央财政将在今年四季度增发2023年国债…

从零开始学Python系列课程第17课:容器型数据类型之列表(上)

前言 列表算是 Python 中比较常用的一种容器型数据类型&#xff0c;那么什么是列表&#xff0c;列表有什么样的作用致使它在 Python 中这么受欢迎呢&#xff1f;这便是接下来我们要一起讨论的问题。 在不久之前我们讲过变量&#xff0c;我们将数据使用变量保存&#xff0c;但是…

【数据结构和算法】独一无二的出现次数

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 哈希类算法题注意事项 2.2 方法一&#xff1a;判断长度 2.3 方法二&#xff1a; set 判断 2.4 方法…

DG报错ORA-01111、ORA-01110、ORA-01157备库不同步

刚同步好没多久的dg备库&#xff0c;过两天查看同步状态发现备库数据不同步&#xff0c;重新开启同步也不能正常同步。 查看alert日志&#xff0c;查看报错如下&#xff1a; MRP0: Background Media Recovery terminated with error 1111 Errors in file D:\APP\ADMINISTRATOR…

红队打靶练习:DIGITALWORLD.LOCAL: FALL

目录 信息收集 1、arp 2、netdiscover 3、nmap 4、nikto 5、whatweb 6、小结 目录探测 1、gobuster 2、dirsearch WEB 80端口 /test.php 文件包含漏洞 SSH登录 提权 get root and flag 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interfa…

圆钢在线直线度测量仪的配置都有哪些?

圆钢产线有很多&#xff0c;并且很多都是需要对直线度尺寸进行检测的&#xff0c;这就是在线直线度测量仪的应用所在&#xff0c;在线检测远比人工检测能带给工厂更大的利益与效率。 在线直线度测量仪原理 直线度测量仪设置3台位置测量仪&#xff0c;每台位置测量仪内布置呈十字…

CMake中开启编译器代码优化加速

【写在前面】 写这篇博客是因为有一天晚上刷到了一篇公众号推文&#xff0c;讲的“如何将一段原本执行需要3秒的程序优化到只需要0.3秒”。长期开发上层应用软件&#xff0c;确实很难接触到一些编程效率优化方面的技巧。但是写C的人还是骨子里有一种潜意识&#xff0c;这代码跑…

云端赋能 算力加速 | 活动回顾

12月16日&#xff0c;华锐技术ACLUB联合火山引擎和AMD以“云端赋能 算力加速”为主题在上海举办了2023量化IT年度专属沙龙活动&#xff0c;会议围绕量化上云、极速行情、高性能处理器等前沿技术深入交流&#xff0c;近40位量化IT齐聚一堂&#xff0c;共同探讨量化行业如何在人工…

纯CSS实现马里奥效果,回忆一下童年吧

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

使用 pytest 相关特性重构 appium_helloworld

一、前置说明 在 pytest 基础讲解 章节,介绍了 pytest 的特性和基本用法,现在我们可以使用 pytest 的一些机制,来重构 appium_helloworld 。 appium_helloworld 链接: 编写第一个APP自动化脚本 appium_helloworld ,将脚本跑起来 代码目录结构: pytest.ini 设置: [pyt…

QT UI自动化测试(1)

一、框架选择 想结合公司产品搭建一套自动化测试框架&#xff0c;一方面自己学习用&#xff0c;一方面也希望跟公司业务结合起来&#xff0c;双赢。公司软件最多的产品是部署在Linux系统上&#xff0c;基于QT QML开发的UI&#xff0c;本来奔着免费的自动化框架去的&#xff0c;…