CSS3中开发中的常用单位
CSS3 常用长度单位
CSS 中的长度单位主要分为两类:
- 绝对长度单位:如
px,不直接依赖父元素的尺寸。 - 相对长度单位:如
%、em、rem、vw、vh等,根据不同的参照对象计算实际大小。
px(像素)
px 是 CSS 中最常用的长度单位,表示 CSS 像素。
基本使用
.box { width: 300px; height: 200px; font-size: 16px; padding: 20px; border: 1px solid black;}特点:
- 数值明确,容易控制元素尺寸。
- 不依赖父元素的宽度或字体大小。
- 适合边框、图标、固定尺寸元素、细节间距等。
px 不等于物理像素
CSS 中的 1px 不一定对应屏幕上的一个物理像素。例如,在设备像素比(DPR)为 2 的情况下,正常缩放时:1 CSS px 通常对应 2 × 2 个物理像素。因此,px 不是永远固定的物理尺寸。
开发场景
.card { width: 320px; padding: 16px; border-radius: 8px; border: 1px solid #ddd;}px 适合需要精确控制尺寸的场景,但大量使用固定宽高可能导致小屏幕溢出,因此响应式开发通常需要搭配其他单位。
百分号(%)
% 是相对单位,通常根据相关属性对应的包含块尺寸计算,而不是所有属性都相对于父元素的同一个尺寸。
基本使用
<div class="parent"> <div class="child"></div></div>.parent { width: 500px; height: 300px;}
.child { width: 50%; height: 50%;}计算结果:
- 子元素宽度:
500 × 50% = 250px - 子元素高度:
300 × 50% = 150px
不同属性的百分比参照对象
| 属性 | 百分比主要参照 |
|---|---|
width | 包含块宽度 |
height | 包含块高度(需要满足相应的高度计算条件) |
padding | 包含块宽度 |
margin | 包含块宽度 |
font-size | 父元素字体大小 |
transform: translateX() | 元素自身的参考盒宽度 |
transform: translateY() | 元素自身的参考盒高度 |
注意,padding-top: 10% 通常也是根据包含块的宽度计算,而不是高度。
开发场景
.container { width: 80%; max-width: 1200px; margin: 0 auto;}适合:
- 流式布局。
- 容器宽度自适应。
- 子元素占据父容器一定比例。
em
em 是相对字体大小的长度单位。
基本规则
- 用在
font-size上:相对于父元素计算后的字体大小。 - 用在其他长度属性上:相对于当前元素计算后的字体大小。
基本使用
.parent { font-size: 20px;}
.child { font-size: 1.5em; padding: 2em;}计算过程:
.child字体大小:20 × 1.5 = 30px.child内边距:30 × 2 = 60px
虽然都使用 em,但因为属性不同,计算参照对象也不同。
em的嵌套问题
<div class="box"> 第一层 <div class="box"> 第二层 <div class="box">第三层</div> </div></div>body { font-size: 16px;}
.box { font-size: 1.5em;}嵌套计算结果:
| 层级 | 字体大小 |
|---|---|
| 第一层 | 24px |
| 第二层 | 36px |
| 第三层 | 54px |
这就是 em 容易出现字体逐层放大的原因。
开发场景
em 适合希望元素的间距、尺寸跟随自身字体大小变化的组件。
.button { font-size: 16px; padding: 0.5em 1em; border-radius: 0.5em;}当按钮字体大小变化时,内边距和圆角也会按比例变化。
rem
rem 是相对于根元素 <html> 的字体大小计算的单位。
基本使用
html { font-size: 16px;}
.box { width: 20rem; height: 10rem; font-size: 1.5rem;}计算结果:
20rem = 320px10rem = 160px1.5rem = 24px
rem 与 em 的区别
html { font-size: 16px;}
.parent { font-size: 20px;}
.child { font-size: 2em; padding: 2rem;}2em = 40px,相对于父元素字体大小计算。2rem = 32px,相对于根元素字体大小计算。
rem 不会像 em 那样因为普通父元素的字体设置而不断累积放大。
rem 的响应式应用
通过修改根元素的字体大小,可以统一调整使用 rem 的尺寸。
html { font-size: 16px;}
.card { width: 20rem; padding: 1.5rem;}
@media (max-width: 600px) { html { font-size: 14px; }}注意:这种做法仅改变使用 rem 的尺寸,不代表页面自动完成响应式布局。另外,修改根字号也会影响使用 rem 的文字大小,需要考虑可读性。
开发场景
适合:
- 全局字体大小。
- 组件内外边距。
- 统一间距系统。
- 需要跟随根字体大小调整的元素尺寸。
vw/vh/vmax/vmin
这四种单位都相对于**视口(Viewport)**计算,而不是父元素。
vw(视口宽度)
1vw = 视口宽度的 1%假设视口宽度为 1000px:
1vw = 10px50vw = 500px100vw = 1000px
.box { width: 50vw;}无论父元素宽度多少,元素的指定宽度始终根据视口宽度计算。
vh(视口高度)
1vh = 视口高度的 1%假设视口高度为 800px:
1vh = 8px50vh = 400px100vh = 800px
.hero { height: 100vh;}适合首页首屏、全屏背景等场景。
注意:移动端浏览器工具栏会影响可见区域,现代开发中需要真正贴合动态可见高度时,可以考虑 100dvh。
vmax(视口较大边)
1vmax = max(视口宽度, 视口高度) × 1%vmin(视口较小边)
1vmin = min(视口宽度, 视口高度) × 1%例如,视口为 1200 × 800px 时:
| 单位 | 参照 | 结果 |
|---|---|---|
1vw | 宽度 1200px | 12px |
1vh | 高度 800px | 8px |
1vmax | 较大边 1200px | 12px |
1vmin | 较小边 800px | 8px |
开发场景
/* 全屏首屏 */.hero { min-height: 100dvh;}
/* 根据视口宽度调整标题大小 */.title { font-size: clamp(24px, 4vw, 48px);}
/* 始终保持正方形 */.square { width: 30vmin; height: 30vmin;}
/* 根据视口较大边创建背景圆形 */.circle { width: 50vmax; height: 50vmax; border-radius: 50%;}其中 vmin 很适合需要同时考虑横屏和竖屏的场景。
常用单位总结
| 单位 | 参照对象 | 常见用途 |
|---|---|---|
px | CSS 像素 | 边框、图标、固定尺寸 |
% | 取决于属性 | 容器宽度、流式布局 |
em | 当前或父元素字体大小 | 组件内部比例、按钮 |
rem | 根元素字体大小 | 字体、全局间距系统 |
vw | 视口宽度 | 视口相关尺寸、流体字号 |
vh | 视口高度 | 全屏布局、首屏区域 |
vmax | 视口较大边 | 大型背景、装饰元素 |
vmin | 视口较小边 | 自适应正方形、圆形 |
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!














