统一缩放单位基础(px、em、rem)

一、先别死记概念,先理解"尺子"

前端里的:

  • px → 固定尺子
  • em → 看父元素的尺子
  • rem → 看根元素(html)的尺子

你可以把它们理解成:

单位 参考对象 类比
px 固定像素 固定长度的钢尺
em 当前/父级字体大小 会继承的弹性尺
rem html根字体大小 全局统一缩放尺

二、px(像素)------ 最容易理解
1. 什么是 px
TypeScript 复制代码
font-size: 16px;
width: 200px;

意思:

  • 字体固定16像素
  • 宽度固定200像素

这是最"死板"的单位

2. px 的特点
优点
精准

适合:

  • 边框
  • 阴影
  • 小图标
  • 细节控制
缺点
不会跟着用户字体习惯变化

比如:

  • 用户系统字体调大
  • 浏览器缩放
  • 无障碍模式

px 不够灵活


三、em ------ 最容易把人绕晕的单位

很多人学不会 em。

原因:

没理解"它到底参考谁"。


1. em 到底参考谁?
font-size 时

参考父元素字体大小。

其他属性时

参考当前元素自己的字体大小。

这是最容易懵的地方。


2. 看一个例子
TypeScript 复制代码
<div class="parent">
  <div class="child">
    Hello
  </div>
</div>
css 复制代码
.parent {
  font-size: 20px;
}

.child {
  font-size: 2em; // 2em = 父元素20px × 2 = 40px
}

3. em 会"连锁放大"

这是它最危险的地方。

TypeScript 复制代码
<div class="a">
  <div class="b">
    <div class="c">文本</div>
  </div>
</div>
css 复制代码
.a {
  font-size: 16px;
}

.b {
  font-size: 2em; // b = 16 × 2 = 32px
}

.c {
  font-size: 2em; // c = 32 × 2 = 64px
}

会层层叠加。

这叫:

em 的继承陷阱

4. em 更适合什么?
适合组件内部比例缩放

例如按钮:

css 复制代码
.button {
  font-size: 16px;
  padding: 0.5em 1em;
  // 上下 padding = 16 × 0.5 = 8px
  // 左右 padding = 16 × 1 = 16px
}

这就是 em 的价值:

相对该元素自己的 font-size,进行"组件自适应缩放"

四、rem ------ 现代前端最重要的单位

现在:

  • React
  • Vue
  • Ant Design
  • Tailwind
  • 移动端适配

大量使用 rem。


1. rem 是什么?
root em

root = 根元素

也就是:

rem 永远参考 html
css 复制代码
html {
  font-size: 16px;
}

1rem = 16px
2rem = 32px
0.5rem = 8px
3. rem 最大优势
全局统一缩放

例如,如果改:

css 复制代码
html {
  font-size: 20px;
}

整个网站自动变大。

这就是:

rem 的核心价值

五、为什么现代项目更喜欢 rem?

因为:

更适合响应式
1. 以前的移动端适配
TypeScript 复制代码
html.style.fontSize = window.innerWidth / 37.5 + 'px'
// 37.5 的由来:设计稿 375px 宽时,希望 1rem = 10px,方便心算:
// 设计稿标 100px → 写 10rem
// 设计稿标 37.5px → 写 3.75rem
// 公式:根字号 = 屏宽 / 37.5,所以在 375 屏上 1rem = 10px。
css 复制代码
width: 10rem;

页面会整体缩放。

这就是:

淘宝 flexible 方案

2. 20年以前的移动端(H5)适配

vw + flex/grid 配合 postcss-px-to-viewport(自动把 px 转 vw)

postcss.config.ts
TypeScript 复制代码
module.exports = {
  plugins: {
    'postcss-px-to-viewport': {
      viewportWidth: 375, // 设计稿宽度
      unitPrecision: 6, // 保留小数位
      minPixelValue: 1, // 小于多少 px 不转换
      exclude: [/node_modules/], // 排除
    },
  },
};

正常写:width: 100px;

打包自动变:width: 26.6667vw;

3. 现在的移动端(H5)适配
  • 布局:flex/grid
  • 字体:rem(或 clamp()
  • 尺寸:rem + 断点 media query
  • 安全区适配用 env(safe-area-inset-*)(刘海屏、底部手势区)。
  • 补充:dvh/svh + safe-area + max-width 容器约束
4、小程序
  • 布局:flex + rpx
  • 宽高/间距:都按 x * 750 / 350 转 rpx
  • 字体:可用 rpx(常见),也可少量 px 做精细控制
  • 1px 线:用小程序常见发丝线方案(transform: scaleY(0.5) 等)
css 复制代码
@function r($px) {
  @return ($px * 750 / 350) * 1rpx;
}
.card {
  padding: r(16);
  font-size: r(14);
}
2. 用户无障碍友好

如果用户浏览器字体调大:

rem 会跟着变化。

体验更好。


六、现代企业项目推荐方案
场景 推荐单位
字体 rem
页面布局 rem / % / flex
组件内部间距 em
边框 px
阴影 px
圆角 px
图标 px
超细线 px
相关推荐
心平气和量大福大43 分钟前
C#-WPF-Window主窗体
开发语言·c#·wpf
从零开始的代码生活_2 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸2 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++
GIS阵地3 小时前
QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)
开发语言·前端·c++·qt·qgis
yaoxin5211233 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
groundhappy3 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
gis开发之家4 小时前
《Vue3 从入门到大神35篇》Vue3 源码详解(五):effect 依赖收集原理——track 与 trigger 是如何工作的?
javascript·typescript·前端框架·vue3·vue3源码
小钻风33664 小时前
Spring Boot 文件上传详解:深入理解 MultipartFile 的使用与原理
java·开发语言
橘子星5 小时前
我一个前端切图仔,凭什么能在浏览器里跑大模型?
前端·javascript·前端框架
qq_452396235 小时前
第二篇:《Go 开发环境搭建:SDK、IDE、Module 与 Hello World》
开发语言·ide·golang