面试官:说一下 px、em、rem、vw/vh?em和rem的区别?

本文详细解释了CSS中的像素单位(如px、设备像素、逻辑像素和CSS像素),介绍了DPR和PPI的概念,以及响应式设计中的rem单位、媒体查询和viewport单位vw/vh的运用,探讨了rem的阶梯性问题和网页视口尺寸计算。

关于PX

CSS中有非常多的长度单位

整体可以分成两类: 

绝对长度单位(Absolute length units); 

相对长度单位(Relative length units);

px(绝对长度单位)

像素是影响显示的基本单位。(比如屏幕上看到的画面、一幅图片);

pix是英语单词picture的常用简写,加上英语单词“元素”element,就得到pixel;

 “像素”表示“画像元素”之意,有时亦被称为pel(picture element);

我们经常说一个电脑的分辨率、手机的分辨率,还有CSS当中的像素又是什么关系呢?

像素单位常见的有三种像素名称:

  • 设备像素(也称之为物理像素); 
  • 设备独立像素(也称之为逻辑像素);
  • CSS像素;

设备像素,也叫物理像素。

  • 设备像素指的是显示器上的真实像素,每个像素的大小是屏幕固有的属性,屏幕出厂以后就不会改变了;
  • 我们在购买显示器或者手机的时候,提到的设备分辨率就是设备像素的大小;
  • 比如iPhone X的分辨率 1125x2436,指的就是设备像素;

设备独立像素,也叫逻辑像素。

  • 如果面向开发者,使用设备像素显示一个100px的宽度,那么在不同屏幕上显示效果会是不同的
  • 开发者针对不同的屏幕很难进行较好的适配,编写程序必须了解用户的分辨率来进行开发;
  • 所以在设备像素之上,操作系统为开发者进行抽象,提供了逻辑像素的概念
  • 比如你购买了一台显示器,在操作系统上是以1920x1080设置的显示分辨率,那么无论你购买的是2k、4k的显示器,对于开发者来说,都是 1920x1080的大小。

CSS像素

  • CSS中我们经常使用的单位也是pixel,它在默认情况下等同于设备独立像素(也就是逻辑像素);
  • 逻辑像素面向开发者;

我们可以通过JavaScript中的screen.width和screen.height获取到电脑的逻辑分辨率:

DPR:device pixel ratio

2010年,iPhone4问世,不仅仅带来了移动互联网,还带来了Retina屏幕;

Retina屏幕翻译为视网膜显示屏,可以为用户带来更好的显示;

在Retina屏幕中,一个逻辑像素在长度上对应两个物理像素,这个比例称之为设备像素比(device pixel ratio);

可以通过window.devicePixelRatio获取到当前屏幕上的DPR值;

PPI:每英寸像素(英语:Pixels Per Inch,缩写:PPI)

通常用来表示一个打印图像或者显示器上像素的密度;

1英寸=2.54厘米,在工业领域被广泛应用;

问题考点——响应式

1.rem是什么?

em是一个相对长度单位,相对于父元素

rem也是一个相对长度单位,相对于根元素,常用于响应式布局

(rem:r’是“root”的缩写,相对于根元素<html>的字体大小。)

rem与其他长度单位的区别

  • px,绝对长度单位,最常用
  • em,相对长度单位,相对于父元素,不常用(相对于父元素,各个元素的父元素不一,没有统一标准)
  • rem,相对长度单位,相对于根元素,常用于响应式布局

2.响应式布局(移动端适配)的常用方案

  • media-query,根据不同的屏幕宽度设置根元素font-size
  • rem,基于根元素的相对单位

然后使用rem设置 总体字体大小 和 div1的宽度

在iphone6/7/8机型上(html {font-size: 100px;})可以看到,

div1盒子的字号为16px(0.16×100=16px)

宽度为100px(1×100=100px)

iPhone也一样,宽度为375px

在iphone6/7/8 Plus机型上(html {font-size: 110px;})

div1盒子的字号为17.6px(0.16×110=17.6px)

宽度为110px(1×110=110px)

接着就可以对任何元素的属性实现响应式,比如:line-height行高、padding内边距、margin外边距……

3.rem的弊端——“阶梯”性

有弊端,但还是能用

“阶梯”性 —— 在某一阶梯的整个跨度中无变化。

如果想要实现,376px比375px大一点?或者413px比375px大?(需要产生变化)

4.网页视口尺寸

  • window.screen.height      //屏幕宽度(手机点亮屏幕)
  • window.innerHeight          //网页视口高度(浏览器去除头尾,可以显示内容的部分)
  • document.body.clientHeight        //body高度(内容高度)

如图,667是window.screen.height;553是window.innerHeight;内容高度为浏览器头部底到红色矩形底

模拟器没有头和底部工具栏,与实际不同。

document.body.clientHeight为内容高度(随网页内容变化)

5.vw/vh

  • vh网页视口高度(window.innerHeight)的1/100
  • vw网页视口宽度(window.innerHeight)的1/100
  • vmax取两者最大值,vmin取两者最小值

把手机上能显示网页的区域的高度与宽度平均分成100份,1个vh/vw就是1份。——“阶梯”性就没有了。

10vw/10vh就是网页视口的宽度/高度 百分之十 即 十分之一 

vmax取vw和vh的最大值(变成正方形)

再看看vmin

等式

### empxremvhvw前端开发中的使用场景及区别前端开发中,CSS 单位的选择直接影响页面布局的灵活性响应式设计的效果。以下是 `em`、`px`、`rem`、`vh` `vw` 的详细明及其使用场景: #### 1. **PX(像素)** - **特点**:绝对单位,表示屏幕上的一个物理像素点。 - **是否响应式**:否。 - **典型应用场景**: - 固定尺寸的元素,如边框宽度、图标大小等[^1]。 - 需要精确控制尺寸时,例如按钮的固定高度或宽度[^4]。 - **优点**:简单直观,适用于不需要随视口变化的场景。 - **缺点**:缺乏灵活性,不适应不同设备屏幕尺寸。 ```css .button { width: 100px; /* 固定宽度 */ height: 30px; /* 固定高度 */ } ``` --- #### 2. **EM(相对单位)** - **特点**:相对于当前元素或父元素的字体大小(`font-size`)。 - **是否响应式**:是。 - **典型应用场景**: - 文本相关的间距调整,如行高、外边距、内边距等[^3]。 - 按钮的内边距(padding),使其与字体大小成比例变化[^1]。 - **优点**:灵活适应父元素的字体大小,适合局部调整。 - **缺点**:继承性可能导致嵌套计算复杂化。 ```css .parent { font-size: 16px; } .child { margin: 1em; /* 相当于 16px */ } ``` --- #### 3. **REM(相对单位)** - **特点**:相对于根元素(`html`)的字体大小(`font-size`)。 - **是否响应式**:是。 - **典型应用场景**: - 响应式设计中,确保全局一致性,避免继承问题[^3]。 - 整体布局的宽度、高度、间距等。 - **优点**:独立于父元素,全局统一,易于维护。 - **缺点**:需要明确根元素的字体大小。 ```css html { font-size: 16px; } .container { width: 20rem; /* 相当于 320px */ } ``` --- #### 4. **VW(视口宽度百分比)** - **特点**:基于视口宽度的百分比单位,1vw 等于视口宽度的 1%。 - **是否响应式**:是。 - **典型应用场景**: - 全屏布局,例如背景图片、全屏广告等[^2]。 - 动态字号调整,结合 `clamp()` 函数实现流体字体[^2]。 - **优点**:直接响应视口变化,适合大尺寸布局。 - **缺点**:小屏幕上可能显得过大,需配合其他单位限制范围。 ```css .hero-section { width: 100vw; /* 占满视口宽度 */ } .title { font-size: clamp(2rem, 4vw, 3rem); /* 动态字体大小 */ } ``` --- #### 5. **VH(视口高度百分比)** - **特点**:基于视口高度的百分比单位,1vh 等于视口高度的 1%。 - **是否响应式**:是。 - **典型应用场景**: - 全屏布局,例如登录页、首页英雄区域等。 - 根据视口高度动态调整元素尺寸。 - **优点**:直接响应视口变化,适合垂直方向的布局。 - **缺点**:移动端地址栏可能影响实际高度,需额外处理[^2]。 ```css .full-screen { height: 100vh; /* 占满视口高度 */ } ``` --- ### 总结与实践建议 - **PX**:适用于固定尺寸的场景,但缺乏灵活性。 - **EM**:适用于局部调整,但需要注意嵌套计算。 - **REM**:推荐用于全局布局,确保一致性可维护性。 - **VW/VH**:适用于全屏布局或需要直接响应视口变化的场景,但需注意边界条件。 通过合理组合这些单位,可以实现更灵活、更适应多设备的前端设计。例如,结合 `Sass` 函数自动转换 `px` 到 `rem`,或使用 `clamp()` 实现动态字体调整。 ```scss @function rem($px) { @return ($px / 16) * 1rem; } .box { width: rem(320); /* 自动转换为 20rem */ } ``` ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值