1. rem
(Root EM)
参照对象
基准:相对于 根元素(
<html>
)的font-size
计算。默认情况下,浏览器的根
font-size
为16px
(即1rem = 16px
),但可通过 CSS 修改:html { font-size: 20px; /* 此时 1rem = 20px */ }
不同分辨率下的表现
变化规则:
rem
的值 只取决于根元素的font-size
,与视口大小无关。若根
font-size
固定(如20px
),1rem
永远等于20px
。若根
font-size
动态设置(如通过媒体查询或 JS 根据视口调整),rem
会按比例变化。
常见用法:
/* 动态调整根 font-size(适配移动端) */ html { font-size: calc(100vw / 375 * 16); /* 基于设计稿宽度 375px */ }
2. vh
(Viewport Height)
参照对象
基准:相对于 视口(Viewport)高度的 1%。
1vh = 1% 的视口高度
(如视口高度为1000px
,则1vh = 10px
)。
不同分辨率下的表现
变化规则:
vh
的值 随视口高度变化。在移动端,浏览器地址栏的显示/隐藏会动态改变视口高度,导致
vh
值波动(可用dvh
解决)。
常见用法:
.full-screen { height: 100vh; /* 始终占满视口高度 */ }
3. vw
(Viewport Width)
参照对象
基准:相对于 视口(Viewport)宽度的 1%。
1vw = 1% 的视口宽度
(如视口宽度为1200px
,则1vw = 12px
)。
不同分辨率下的表现
变化规则:
vw
的值 随视口宽度变化。适用于响应式布局(如替代百分比,避免嵌套元素计算问题)。
常见用法:
.responsive-box { width: 50vw; /* 始终占视口宽度的一半 */ }
4. 对比总结
单位 | 参照对象 | 是否随视口变化 | 典型应用场景 |
---|---|---|---|
rem |
根元素的 font-size |
否(除非动态修改根字号) | 字体大小、间距、整体缩放 |
vh |
视口高度 | 是 | 全屏布局、高度自适应 |
vw |
视口宽度 | 是 | 响应式宽度、栅格系统 |
5. 特殊注意事项
移动端 vh
的问题
问题:在移动端浏览器中,
100vh
可能包含地址栏高度,导致内容被遮挡。解决方案:
使用 CSS 新单位
dvh
(Dynamic Viewport Height,动态视口高度):.mobile-section { height: 100dvh; /* 自动排除地址栏高度 */ }
或通过 JavaScript 动态计算:
document.documentElement.style.setProperty('--vh', `${window.innerHeight}px`);
.mobile-section { height: calc(var(--vh, 1vh) * 100); }
vw
的替代方案
若需避免
vw
计算复杂性,可使用 CSS 容器查询(cqw
)或 Flex/Grid 布局。
6. 不同分辨率下的计算示例
视口尺寸 | 1rem (根 font-size: 16px ) |
1vh (视口高度 900px ) |
1vw (视口宽度 1200px ) |
---|---|---|---|
桌面端 | 16px |
9px |
12px |
移动端竖屏 | 16px |
6.5px (含地址栏) |
3.75px (宽度 375px ) |
移动端横屏 | 16px |
3.75px (高度 375px ) |
6.5px (宽度 650px ) |
7. 如何选择单位?
全局缩放:用
rem
(结合媒体查询动态调整根font-size
)。视口适配:用
vw/vh
(或dvh
解决移动端问题)。精确控制:结合
calc()
使用(如calc(1rem + 1vw)
)。
通过合理选择单位,可以轻松实现跨设备的响应式布局。