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

news2024/11/25 16:49:34

预备知识:

设备独立像素,以下图的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 请求,依然会在页面一开始被触发;因此严格来讲它并不是一个懒加载的方式;

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

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

相关文章

基于EMD的滚动轴承故障诊断算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1EMD的基本原理 固有模态函数&#xff08;IMF&#xff09; 筛分过程 4.2 基于EMD的滚动轴承故障诊断算法 信号预处理 EMD分解 特征提取 故障诊断 5.算法完整程序工程 1.算法运行效…

Python爱心光波完整代码

文章目录 环境需求完整代码详细分析环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.blog.csdn.net/arti…

3d导入模型怎样显示原本材质---模大狮模型网

要在导入3D模型时保留原本的材质&#xff0c;您可以尝试以下方法&#xff1a; 导入前检查文件格式&#xff1a;确保您所使用的3D软件支持导入模型的文件格式。不同的软件对文件格式的支持有所差异&#xff0c;选择正确的文件格式可以更好地保留原始材质。 使用正确的材质库&am…

pip freeze 导出的requirements.txt文件含有 @file

使用 pip freeze > requirements.txt 导出的文件中含有 file&#xff1a;// 使用这个文件在其他环境下安装就会出现 找不到路径的错误 原因是这种方法生成的文件只能用于本地环境&#xff0c;无法供他们使用 使用以下方式生成文件 解决&#xff1a;pip list --formatfreeze …

【数据库系统概论】第6章-关系数据库理论

真别看吧&#xff0c;抄ppt而已啊 文章目录 6.1 引言6.2 规范化6.2.1 函数依赖6.2.2 码6.2.3 范式&#xff08;Normal Form&#xff09;6.2.4 BC范式6.2.5 规范化小结 6.1 引言 我们有这样一张表&#xff1a; but 为啥这样设计呢&#xff1f;由此引出怎样设计一个关系数据库…

C++的多继承和虚继承

目录 多继承的定义和用法定义多继承多继承中派生类对象的内存布局访问基类成员多继承带来的问题 虚继承虚继承的语法虚继承对象的内存布局虚继承中的构造虚继承的缺点 多继承的定义和用法 C支持多继承&#xff0c;即一个派生类可以有多个基类。 很多时候&#xff0c;单继承就…

Spring boot:3.X + Security OAuth2 自定义登录页面、登出后跳转到登录页

本文描述了基于 Spring Oauth2 的 code 模式&#xff0c;实现登陆同时授权、自定义登录界面、登出页面的功能。 1.Maven依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactI…

文件打包上传linux服务器,通过http协议url下载

背景&#xff1a;服务器部署tomcat&#xff0c;已经运行项目 直接在编译后的class文件新建文件&#xff0c;把想要下载的文件放入&#xff0c; 编译后新建文件存放 访问时&#xff0c;加zl/xxx.zip

Springboot拦截器及统一异常处理

文章目录 一、Java中异常相关概念1、异常类2、异常处理方法3、注意事项4、自定义异常 二、配置全局异常处理1、统一返回体定义2、定义异常处理实现类3、全局异常处理类 三、Springboot拦截器1、定义拦截器2、注册拦截器 四、验证效果 一、Java中异常相关概念 1、异常类 Throw…

微信小程序开发系列-07组件

在开发小程序的过程中会遇到一个常见的问题&#xff0c;怎样将其他同事提供的样式或者第三方的样式载入自己的工程&#xff0c;本文基于这个问题为索引&#xff0c;探索下小程序的组件。 什么是组件 组件是视图层的基本组成单元。组件自带一些功能与微信风格一致的样式。一个…

C++标准模板库(STL)

标准模板库&#xff08;STL&#xff09;是一组C模板类&#xff0c;提供常见的编程数据结构和函数&#xff0c;如列表、堆栈、数组等。它是一个容器类、算法和迭代器的库。它是一个通用库&#xff0c;因此&#xff0c;它的组件是参数化的。模板类的相关知识是使用STL的先决条件。…

vivado set_max_delay案例分析

案例分析 在一些设计中&#xff0c;某些信号在特定模式下具有恒定值。例如&#xff0c;在功能模式下&#xff0c;测试信号不切换&#xff0c;因此与VDD或VSS相连这取决于它们的活动水平。这也适用于在设计完成后不切换的信号已通电。同样&#xff0c;今天的设计有多种功能模式…

优秀数据库开发工具Navicat Premium 16 Mac/win中文版

Navicat Premium 16作为一款综合性的数据库开发工具&#xff0c;可以支持主流的数据库管理系统&#xff0c;如MySQL、MariaDB、Oracle、SQL Server等。无论是进行数据库建模、数据导入导出、SQL脚本编辑&#xff0c;还是数据同步、备份恢复等操作&#xff0c;Navicat Premium 1…

Linux安装常用的软件(jdk,MySQL,nginx)并完成对前后端项目的部署发布

linux软件安装&#xff1a; 安装方式介绍&#xff1a; 二进制发布包安装&#xff1a; 软件已经针对具体平台编译打包发布&#xff0c;只要解压&#xff0c;修改配置即可 rpm安装&#xff1a; 软件已经按照redhat的包管理规范进行打包&#xff0c;使用rpm命令进行安装&#xff0…

Java 类加载与字节码技术

3 类加载与字节码技术 3.1 类文件结构 类文件结构字节码指令编译期处理类加载阶段类加载器运行期优化 根据 JVM 规范&#xff0c;类文件结构如下 ClassFile {u4 magic;u2 minor_version; // 小版本号u2 major_version; // 主版本号u2 constant_pool_count; // 常量池cp_info…

《我与地坛》当时只道是寻常;只是当时已惘然

《我与地坛》当时只道是寻常&#xff1b;只是当时已惘然 史铁生&#xff08;1951/1/4-2010/12/31&#xff09;&#xff0c;作家&#xff0c;散文家&#xff0c;代表作有《我与地坛》《命若琴弦》《奶奶的星星》等。 文章目录 《我与地坛》当时只道是寻常&#xff1b;只是当时已…

Thinkphp+vue+mysql学生作业管理系统21j0r

运行环境:phpstudy/wamp/xammp等 开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp5 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat/phpmyadmin 为设计一个安全便捷&#xff0c;并且使用户更好获取本学院…

c基础学习(一)

学习网站&#xff1a; C语言的过去与未来 - C语言教程 - C语言网 (dotcpp.com)https://www.dotcpp.com/course/c-intros/ C 语言简介 - C 语言教程 - 网道 (wangdoc.com)https://wangdoc.com/clang/intro 变量&#xff1a; #include<stdio.h> /*引入头文件-- 标准…

深入浅出理解转置卷积Conv2DTranspose

温故而知新&#xff0c;可以为师矣&#xff01; 一、参考资料 论文&#xff1a;A guide to convolution arithmetic for deep learning github源码&#xff1a;Convolution arithmetic bilibili视频&#xff1a;转置卷积&#xff08;transposed convolution&#xff09; 转置…

【Linux】深度解剖环境变量

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟悉并掌握Linux的环境变量。 > 毒鸡汤&#x…