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)
)。
通过合理选择单位,可以轻松实现跨设备的响应式布局。