余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

px/em/rem的区别与应用

xiyangw 2023-09-26 14:17 31 浏览 0 评论

1px有多大?

我们先了解几个概念:

关键概念

设备像素:设备屏幕实际拥有的像素点一般来说:宽度方向有1920个像素点,长度方向有1080个像素点。

逻辑像素:CSS 的像素单位(就是我们这次要讨论的css的px),其尺寸大小是相对的,也称为独立像素

分辨率:屏长的设备像素 × 屏宽的设备像素(1920 * 1080)

ppi(pixels per inch):像素密度,表示沿对角线每英寸长度的像素数目(单位是dpi),越大显示的越细腻

缩放因子(Scale Factor):逻辑像素相对于设备像素的放大比例,可通过` window.devicePixelRatio `获得,pc上可以用个个性化来设置,但二者并不完全等同

上面概念直接的关系

关系一:

  设备尺寸 × 像素密度 = 分辨率(设备像素)

举例:

  iphone6s 对角线长度为5.5 inches,像素密度401 ppi,分辨率 1920 * 1080,计算可得对角线的设备像素为2205.5。

  5.5 * 401 = 2205.5

关系二:

  逻辑像素(css的px) = 设备像素 × 缩放因子

举例:

  iphone6逻辑像素为375 * 667,分辨率为750 * 1334,缩放因子为2

  1个逻辑像素(1px) = 设备宽度的1/375

  1个设备像素 = 设备宽度的1/750

  1/375 = 1/750 * 2


由公式得出的结论

PC端分辨率一样的情况下,屏幕尺寸越大,显示的越模糊(因为dpi越小)。

举例说明:

我们的台式机电脑屏幕一般是32英寸,分辨率为:1920 * 1080。而一般笔记本是15.6英寸,分辨率也是:1920*1080的。由公式一:当分辨率一样时,设备尺寸越大,像素密度越小。所以32寸的台式电脑看上去模糊一些。

相同分辨率,相同缩放因子情况下,不同设备尺寸下,表现是一致的举例说明:

平时我们在pc上24英寸的电脑上开发的网页直接写的(px),在不做任何兼容处理的情况下,在15.6英寸的笔记本上也能正常显示。由公式二:因为一般pc端,默认情况下缩放因子为1(window.devicePixelRatio = 1),分辨率也一样(1920 * 1080),那么得到的**逻辑像素(css的px)**也是一样的。所以你在分辨率一样的情况下,在大屏电脑上设置的100px,在小屏电脑上也是100px。只是他们表现出来的大小不一致,小屏上面的1px更小。

如何将pc网页放到手机上展示?

我们可以调整网页在移动端上的缩放比例,这个值就是viewport。默认情况下,移动端浏览器会将 viewport 宽度设为980px(也有可能是1024px 或其它值),也就是说1px = 设备屏幕宽度的1/980。这跟缩放因子没有任何关系。这时的1px 非常小,所有的元素都变得非常小,移动端浏览器之所以这么做,是为了尽可能完整的显示 PC 端的网页,然后允许用户通过缩放来查看细节。显然体验就别的特别差了,很多本来就比较小的元素看都看不清了。第二种方式是我们设置一个适当的缩放比例。一般我们这样设置:

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

那么对于iphone6来说根据公式:1px = 1/750(分辨率) * 2(缩放因子) = 1/ 375。显然比刚才的1/980大了不少,那么我们的元素如果还是按照原来的px去设置,那么屏幕肯定展示不下去了,这时候,如果我们的元素的px值能根据1px的大小是动态调整,我们的网页就完美了,这时候em,rem就派上用场了。

em是什么?

上面提到,想让我们的网页在不同分辨率的设备(移动端)上正常显示,最好我们的元素长宽,外边距,内边距等都是动态的

方式一:

上面说到,我们在移动端一般这样设置:

<meta name="viewport" content="width=device-width;initial-scale=1" >

这个时候我们1px的大小就已知,iPhone6上为:1px = 1/750(分辨率) * 2(缩放因子) = 1/ 375。既然1px的大小固定了,那么我们只能动态改变一个元素设置的px了,比如说在iPhone8上是120px;而在iPhone6上需要是100px。这时候我们可以用js去动态计算,根据屏幕大小。但是显然很麻烦,需要对每一个元素的长宽,内边距,外边距都需要调整,这显然是一个巨大的工程。这时候我们就可以用到em这个单位了,em单位的名称为相对长度单位,是根据它父元素的字体大小来计算的,一般默认情况下:16px = 1em。如果父元素font-size:16px,子元素margin:0.8em。那么得到的大小就是:0.8 * 16 =12.8。当所有单位都采用em时,我们只需要改变body的font-size,那么其他的元素宽度就能动态变化了,显然方便很多。

rem是什么?

'rem’是’css3’新增的一个相对长度单位,它的出现是为了解决em的缺点,em可以说是相对于父级元素的字体大小,当父级元素字体大小改变时,又得重新计算。rem出现就可以解决这样的问题,rem只相对于根目录,即HTML元素。有了rem这个单位,我们只需要调整根元素html的font-size就能达到所有元素的动态适配了,附上一段常用适配代码:

 /**
    * ================================================
    *   设置根元素font-size
    * 当设备宽度为375(iPhone6)时,根元素font-size=16px; 
    × ================================================
    */
(function (doc, win) {
  var docEl = win.document.documentElement;
  var resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize';
  
  var refreshRem = function () {
    var clientWidth = win.innerWidth
                      || doc.documentElement.clientWidth
                      || doc.body.clientWidth;

    console.log(clientWidth)
    if (!clientWidth) return;
    var fz;
    var width = clientWidth;
    fz = 16 * width / 375;
    docEl.style.fontSize = fz + 'px';//这样每一份也是16px,即1rem=16px
  };

  if (!doc.addEventListener) return;
  win.addEventListener(resizeEvt, refreshRem, false);
  doc.addEventListener('DOMContentLoaded', refreshRem, false);
  refreshRem();

})(document, window);

总结

  1. 逻辑像素(css的px) = 设备像素 × 缩放因子
  2. 为了移动端更好的适配我们引入了em和rem这2个动态单位
  3. em的大小与父元素的font-size有关,rem的大小与根元素html的font-size有关
  4. 一般在移动端我们会使用js动态计算跟节点html的font-size来达到自适应的目的。


相关推荐

华为交换机配置命令总结

1、配置文件相关命令[Quidway]displaycurrent-configuration显示当前生效的配置[Quidway]displaysaved-configuration显示fla...

解决账户无法登录的故障
解决账户无法登录的故障

在优化系统时错误地根据网上的提示,将唯一的Administrator账户设置为禁用,导致重启后无法进入系统。类似的故障还有使用组策略限制本地账户登录,导致重启后...

2023-10-11 17:16 xiyangw

S5720交换机登录提示初始密码存在安全风险
S5720交换机登录提示初始密码存在安全风险

问题描述客户每次登录输密码时,提示初始密码不安全,现在客户嫌麻烦想要去掉:Username:huaweiPassword:Warning:Theinitia...

2023-10-11 17:15 xiyangw

Springboot,Mybatis修改登录用户的密码
Springboot,Mybatis修改登录用户的密码

一、Mybatis.xml<updateid="changePassword"parameterType="string...

2023-10-11 17:15 xiyangw

PHP理论知识之沐浴更衣重看PHP基础(二)
PHP理论知识之沐浴更衣重看PHP基础(二)

接上篇,咱们继续讲解PHP基础八、标准PHP组件和框架的数量很多,随之产生的问题就是:单独开发的框架没有考虑到与其他框架的通信。这样对开发者和框架本身都是不利的...

2023-10-11 17:15 xiyangw

新鲜出炉UCloud云主机“数据方舟”评测报告(5)— — 关其城
新鲜出炉UCloud云主机“数据方舟”评测报告(5)— — 关其城

2015年10月29日,UCloud云主机黑科技——“数据方舟”功能正式上线,首轮内测随即开放。截止至2015年12月6日,我们共收到了534位用户的评测申...

2023-10-11 17:14 xiyangw

业余无线电Q简语及英文缩语
业余无线电Q简语及英文缩语

Q简语:语音通信及CW通信通用(加粗为常用)QRA电台何台QRB电台间之距离QRG告之正确频率QRH频率是否变动QRI发送音调QRJ能否收到QRK信号之可...

2023-10-11 17:14 xiyangw

非常详细!如何理解表格存储的多版本、生命周期和有效版本偏差
非常详细!如何理解表格存储的多版本、生命周期和有效版本偏差

表格存储在8月份推出了容量型实例,直接支持了表级别最大版本号和生命周期,高性能实例也将会在9月中旬支持这两个特性。那么,最大版本号和生命周期以及特有的...

2023-10-11 17:14 xiyangw

H3C交换机恢复出厂和各种基本配置,这20个要点你知道吗?
H3C交换机恢复出厂和各种基本配置,这20个要点你知道吗?

私信“干货”二字,即可领取138G伺服与机器人专属及电控资料!H3C交换机不知道密码如何恢复出厂设置1、开机启动,Ctrl+B进入bootrom菜单,选择恢复出...

2023-10-11 17:13 xiyangw

在使用移动支付系统的时候如何保护信息安全?

移动支付的方式近年来不断被更新,使得Venmo(据嘉丰瑞德理财师了解,此为美国的“支付宝”)之类的支付方式已经可以某种意义上代替随身携带现金了。但是你必须防范那些第三方应用程序轻松地获取你的银行卡以及...

界面控件DevExpress WinForms MVVM入门指南——登录表单(下)

从本文档中,您将了解如何向应用程序添加登录表单。在本节教程中着重讨论了如何实现此任务,这基本上是附加应用程序功能的一部分。DevExpressUniversalSubscription官方最新版免...

linux基础命令(一)
linux基础命令(一)

为啥要学linux?您可能熟悉WindowsXP、Windows7、Windows10和MacOSX等操作系统。Linux就是这样一种强大的操...

2023-10-11 17:13 xiyangw

MySQL数据库密码忘记了,怎么办?

#头条创作挑战赛#MySQL数据库密码忘记了且没有其他可以修改账号密码的账户时怎么办呢?登录MySQL,密码输入错误/*密码错误,报如下错误*/[root@TESTDB~]#mysql-u...

MobaXterm忘记Session密码,如何查看已保存的密码
MobaXterm忘记Session密码,如何查看已保存的密码

MobaXterm工具登录过SSH终端后,如果存储了Session(存储后再连接ssh的时候只需要输入账号不需要输入密码就可以直接连接上ssh),则可以...

2023-10-11 17:12 xiyangw

华为交换机密码丢失修改方法
华为交换机密码丢失修改方法

华为S2300交换机找回密码设置一、目的交换机的console和telnet密码丢失,无法登录设备。交换机已进行过数据配置,要把密码恢复而数据配置不能丢失。二、...

2023-10-11 17:12 xiyangw

取消回复欢迎 发表评论: