像素、视口、网页计量单位与移动端适配方案

像素的概念

设备像素(物理像素)

指设备能控制显示的最小物理单位,像一个个小点,每一个小像素点都是由三原色RGB组成。物理像素只是为了描述物理分辨率,在屏幕出厂时就已经固定了,单位是pt。【注意区分分辨率和物理分辨率,物理分辨率固定,而分辨率可变且不能超过物理分辨率

物理分辨率是液晶屏固有的参数不能调节,其含义是指液晶屏最高可显示的像素数,其表示方法与分辨率相同【例如,分辨率1024*768就是指横向有1024个像素点,纵向有768个像素点。】。一般来讲物理分辨率的大小可直接决定屏幕的最高分辨率,分辨率不会大于物理分辨率。

屏幕尺寸一样的情况下,分辨率越高,显示效果就越细腻。

设备独立像素

设备独立像素(又称设备无关像素 Device Independent Pixels 、密度独立性 Density Independent或设备独立像素,简称DIP或DP)是一种物理测量单位,基于计算机控制的坐标系统和抽象像素(虚拟像素),由底层系统的程序使用,转换为物理像素的应用。
典型的用途是允许移动设备软件将信息显示和用户交互扩展到不同的屏幕尺寸。允许应用程序以抽象像素为单位进行测量,而底层图形系统将应用程序的抽象像素测量值转换为适合于特定设备的物理像素。

设备独立像素代表可以通过程序控制使用的虚拟像素。在无缩放情况下,1个CSS像素等于1个设备独立像素;如果放大一倍,1个CSS像素就等于4个设备独立像素,以此类推 (宽2倍 高2倍)

通常而言,我们所说的这种可由程序调节设置的分辨率,指的就是设备独立像素。

1设备独立像素 = 1或N 物理像素
【包含的越多则屏幕看起来越清晰】

之所以需要设备独立像素,是因为不同设备的物理像素不同,不能只拿其中一个例子作为基准。

在js中可以通过window.screen.width/ window.screen.height获取屏幕尺寸(设备独立像素值)

设备像素比dpr

=设备像素/设备独立像素。
if(drp === 1:1) use 1pt show 1dp
if(drp === 2:1) use 4pt show 1dp
if(drp === 3:1) use 9pt show 1dp

像素密度PPI

单位是dpi。PPI = 对角线的分辨率 / 对角线尺寸

PC端中,未缩放的情况下,1个设备独立像素 = 1个设备像素

CSS像素

CSS像素是用于web编程的逻辑像素,以px为单位。px是相对单位,但是相对的是分辨率,跟ppi和dpr都有关系。

无缩放情况下,1个CSS像素等于1个设备独立像素

网页中的计量单位

px

px表示像素,如果理解成相对单位,那是因为它是相对于设备像素而言的;如果理解成绝对单位,那是因为它的实际显示大小与元素是无关的。通常会理解成绝对长度单位。

rem

相对HTML根元素字体大小(浏览器默认字体大小是16px)。

em

相对于父元素的字体大小。如过没有被人为设置,则相对于浏览器的默认字体尺寸。
eg.

<div>我是父元素div<p>我是子元素p</p>
</div>
div {font-size: 40px;width: 10em; /* 400px */height: 10em;border: solid 1px black;
}
p {font-size: 0.5em; /* 20px */ width: 10em; /* 200px */height: 10em;border: solid 1px red;
}

但是要注意的是,浏览器默认的最小字体是12px,如果要实现更小,只能用transform:scale来缩放比例。

vw、vh

相对于视口的宽度/高度。把视口分成一百份。

%

相对于包含块的高宽或字体大小来取值。
如果是静态定位和相对定位,则相对于父元素取值;
如果是绝对定位元素,则相对于离它最近的position非static值的祖先元素;
如果是固定定位元素,则相对于视口取值。

视口viewport

上述讲述网页中的计量单位是提到了视口的概念,因此在这里也提一下。

PC端中,视口就是指浏览器的可视区域,宽度由浏览器的窗口的宽决定的,用户可以手动缩放窗口来改变视口大小。

移动端就分成三种情况:布局视口(Layout Viewport)、视觉视口(Visual Viewport)和理想视口(Ideal Viewport)。

布局视口layout viewport

一般移动设备的浏览器都默认设置了一个 viewport 元标签,定义一个虚拟的布局视口,以解决早期的页面在手机上显示的问题。其大小由浏览器厂商决定,一般设置成980px。html内的元素都是以布局视口为基准进行布局的,如果需要显式的修改布局视口的大小,可以用meta标签设置。

布局视口的宽度/高度可以通过document.documentElement.clientWidth / Height 获取。

视觉视口visual viewport

顾名思义就是用户可见区域,可以把它就当作是手机屏幕的那个框。用户可以通过缩放的操作来调整视觉视口,而不会影响布局视口。用户放大时,视觉视口将会变小,CSS 像素将跨越更多的物理像素。
默认情况下,移动端浏览器会将视觉视口缩放到与layout 布局视口相同,也就是默认打开页面就能看到整个布局视口里的内容。

视觉视口的宽度/高度可以通过
window.innerWidth / window.innerHeight 获取。

理想视口ideal viewport

理想视口就是布局视口的宽度和屏幕同宽,它并不是一种真实存在的视口。

实现方法:

<meta name="viewport" content="width=device-width">

利用meta标签设置viewport

一些重要的属性如下:

width:控制布局视口的大小。 height:和 width 相对应,指定高度。
initial-scale:初始缩放比例,也即是当页面第一次 load 的时候缩放比例。
maximum-scale:允许用户缩放到的最大比例。 minimum-scale:允许用户缩放到的最小比例。
user-scalable:用户是否可以手动缩放

移动端适配方案

终于来到我们要讲的最后重点——移动端适配。它实现的方案有四种:

  1. rem布局
    先用meta标签设置布局视口等于设备宽度,实现理想视口。
<meta name="viewport"  content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0,minimum-scale=1.0">

然后根据屏幕分辨率动态设置html的字体大小,达到等比缩放的功能,且需要保证html最终算出来的字体大小,不能小于12px。
这一步我一般使用flexible.js,js内容如下:

(function flexible(window, document) {var docEl = document.documentElementvar dpr = window.devicePixelRatio || 1// adjust body font sizefunction setBodyFontSize() {if (document.body) {document.body.style.fontSize = (12 * dpr) + 'px'} else {document.addEventListener('DOMContentLoaded', setBodyFontSize)}}setBodyFontSize();// set 1rem = viewWidth / 10function setRemUnit() {var rem = docEl.clientWidth / 10docEl.style.fontSize = rem + 'px'}setRemUnit()// reset rem unit on page resizewindow.addEventListener('resize', setRemUnit)window.addEventListener('pageshow', function(e) {if (e.persisted) {setRemUnit()}})// detect 0.5px supportsif (dpr >= 2) {var fakeBody = document.createElement('body')var testElement = document.createElement('div')testElement.style.border = '.5px solid transparent'fakeBody.appendChild(testElement)docEl.appendChild(fakeBody)if (testElement.offsetHeight === 1) {docEl.classList.add('hairlines')}docEl.removeChild(fakeBody)}
}(window, document))

可以看到,它会把设备宽度分为10等份,然后将一等份的大小作为html根元素的font-size值。因此1rem就等于设备宽度的1等份。

由于实际开发中不可能每次都自己计算rem值,因此这里推荐一个vscode插件:px to rem & rpx & vw (cssrem)。例如,设计稿一般为750px,那么1等份就是75px,基准值就可以设置成75px,之后开发时直接在css文件里写px会自动提示相应的rem值。
则px换算成rem公式为: px值 / 75 = rem, 例如:100px=100/75=1.33rem

  1. 媒体查询

通过查询设备的宽度来执行不同的 css 代码,最终达到界面的配置。

  1. vw/vh布局
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">

把所有需求适配屏幕大小等比缩放的元素都使用 vw 作为单位。不需要缩放的使用 px 做单位。

但是缺点是px转换成vw不一定能整除,会有一定的像素差;而且当容器使用 vw,margin 采用 px 时,很容易造成整体宽度超过 100vw,从而影响布局效果。但是使用 padding 代替 margin,结合 calc()函数使用等等方法来避免。

  1. Flex布局
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">

高度固定,宽度自适应

参考文章

设备像素、设备独立像素、CSS像素、分辨率、PPI、devicePixelRatio 的区别

物理像素,逻辑像素(pt),css像素(px),像素比(dpr)都是什么?px,em,rem等 都是什么?有什么区别?

尚硅谷-前端移动端适配方案

浅谈移动端中的视口(viewport)

理解flexible.js所需的viewport知识

移动端适配方案

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

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

相关文章

【CSS3】

文章目录 1.简介2.边框3.圆角4.背景5.渐变CSS3 径向渐变6.文本效果7.字体8.2D转换9.3D转换10.过渡11.动画12.多列13.用户界面14.按钮 ​ 1.简介 模块 CSS3 被拆分为"模块"。旧规范已拆分成小块&#xff0c;还增加了新的。 一些最重要 CSS3 模块如下&#xff1a; 选…

时序数据库

时序数据库在许多应用领域中得到广泛应用,包括物联网(IoT)监控、应用性能监控(APM)、日志分析、金融数据分析、工业自动化和能源管理等。一些知名的开源和商业时序数据库包括InfluxDB、Prometheus、OpenTSDB、TimescaleDB和Kdb+等。 上图是一个典型的时序数据示意图,由…

慢查询SQL如何优化

一.什么是慢SQL? 慢SQL指的是Mysql中执行比较慢的SQL,排查慢SQL最常用的方法是通过慢查询日志来查找慢SQL。Mysql的慢查询日志是Mysql提供的一种日志记录&#xff0c;它用来记录Mysql中响应时间超过long_query_time值的sql,long_query_time的默认时间为10s. 二.查看慢SQL是否…

网络原理(一)网络基础,包括IP ,网络相关的定义

网络基础&#xff0c;包括IP &#xff0c;网络相关的定义 网络基础冲突域广播域DNSNATNAPT 网络基础 以下图片是书上的网图。 什么是IP地址&#xff1f; IP地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址&#xff0c;又译为网际协议地址。P地址是…

PHP自己的框架2.0设置常量并绑定容器(重构篇三)

目录 1、设置常量并绑定容器 2、容器增加设置当前容器的实例和绑定一个类实例当容器 3、将常量绑定到容器中 4、运行效果 1、设置常量并绑定容器 2、容器增加设置当前容器的实例和绑定一个类实例当容器 //设置当前容器的实例public static function setInstance($instance){…

SW的stp文件转成CAD格式文件学习笔记

SW的stp文件转成CAD格式文件 文章目录 SW的stp文件转成CAD格式文件另存为part文件&#xff08;零件图&#xff09;另存为CAD文件 另存为part文件&#xff08;零件图&#xff09; 如图一个STP文件&#xff0c;右上角标注是什么文件呢 另存为零件图&#xff0c;即另存为part …

Python语言概述

​ 视频版教程 Python3零基础7天入门实战视频教程 Python作为一门非常流行的高级编程语言&#xff0c;自从22年开始&#xff0c;TIOBE编程语言排行榜Python一直排第一。 Python简洁高效&#xff0c;丰富的应用场景&#xff0c;受到广大程序员&#xff0c;科研工作者的喜爱。 …

为什么浮点数不能和0直接比较

在嵌入式软件中&#xff0c;一般不建议将浮点数和0直接做比较&#xff0c;例如&#xff1a; float a; exp1. if (a 0) exp2. if (a > 0) exp3. if (a < 0) exp4. if (a - 1 0)诸如此类&#xff0c;都是不可取的&#xff0c;这里就和浮点数在计算机内存中的表示方法有关…

基于图像形态学处理和边缘提取算法的路面裂痕检测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 [Rr,Cc] size(Image1);% 获取 Image1 矩阵的大小&#xff08;行数和列数&#xff09; % 创…

哨兵1号(Sentinel-1)SAR卫星介绍

1. 哥白尼计划 说起欧空局的哨兵1号&#xff0c;就不得不先说一下欧空局的“哥白尼计划”。 欧空局的哥白尼计划&#xff08;Copernicus Programme&#xff09;是欧空局与欧盟合作的一项极其重要的地球观测计划。该计划旨在提供免费开放的、可持续的地球观测数据&#xff0c…

合宙Air724UG LuatOS-Air lvgl字库

目录 LVGL 简介1. lvgl自带字库 特点使用场景2. lvgl加载外部字体 软件接口使用场景3. lvgl 矢量字体 软件接口硬件外接SPI字库芯片详细使用示例使用场景常见问题 LVGL 简介 LVGL字库有3种方式可以使用&#xff0c;刚接触的客户可能不太了解怎样选用&#xff0c;以下对这3种…

服务器时间正确,Java程序时区不对问题解决

服务器执行date命令显示时间正确 执行timedatectl status命令结果如下&#xff1a; 看起来是Time zone没有设置好&#xff0c;但是登录另外一台正常的服务器&#xff0c;执行timedatectl status也是一样的 直接写一个简单的Java程序TestTimeZone.java&#xff1a; import ja…

Tomcat安装与配置(详细教程)

Tomcat安装与配置&#xff08;详细教程&#xff09;_tomcat安装及配置教程_蒋洋大盗的博客-CSDN博客

【linux基础(六)】Linux中的开发工具(中)--gcc/g++

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到开通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux中的开发工具 1. 前言2.…

适合初学者的云服务器——观星云

一款适合初学者的云服务器 官方网址&#xff1a;[观星云](https://www.guanxingyun.com/)活动地址&#xff1a;[观星云免费计划](https://www.guanxingyun.com/act/freecloud.html)B站官方&#xff1a;[酷友玩官方](https://space.bilibili.com/1906135621?spm_id_from333.337…

selenium 网页自动化-在访问一个网页时弹出的浏览器窗口,我该如何处理?

前言 相信大家在使用selenium做网页自动化时&#xff0c;会遇到如下这样的一个场景&#xff1a; 在你使用get访问某一个网址时&#xff0c;会在页面中弹出如上图所示的弹出框。 首先想到是利用Alert类来处理它。 然而&#xff0c;很不幸&#xff0c;Alert类处理的结果就是没…

基于YOLOv7算法的混凝土结构表面裂缝自主识别

Autonomous surface crack identification of concrete structures based on the YOLOv7 algorithm 1、模型接受1.1 yolov7架构:1.2 骨干网中增加一个Aatten模块1.3 加入Myswin模块的YOLOv7网络1.3 加入FEEM模块YOLOv7网络2、实验在本研究中,我们使用了一个改进的网络,名为Y…

LeetCode——动态规划篇(二)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整…

【转存】从 JMM 透析 volatile 与 synchronized 原理

在面试、并发编程、一些开源框架中总是会遇到 volatile 与 synchronized 。synchronized 如何保证并发安全&#xff1f;volatile 语义的内存可见性指的是什么&#xff1f;这其中又跟 JMM 有什么关系&#xff0c;在并发编程中 JMM 的作用是什么&#xff0c;为什么需要 JMM&#…

ArcGIS 10.2安装教程!

软件介绍&#xff1a;ArcGIS是一款专业的电子地图信息编辑和开发软件&#xff0c;提供一种快速并且使用简单的方式浏览地理信息&#xff0c;无论是2D还是3D的信息。软件内置多种编辑工具&#xff0c;可以轻松的完成地图生产全过程&#xff0c;为地图分析和处理提供了新的解决方…