[Medium] 🏷️ CSS Units
1. 請說明 px, em, rem, vw, vh 的差異
快速比較表
| 單位 | 類型 | 相對於 | 是否受父元素影響 | 常見用途 |
|---|---|---|---|---|
px | 絕對單位 | 螢幕像素 | ❌ | 邊框、陰影、小細節 |
em | 相對單位 | 父元素的 font-size | ✅ | 內距、邊距(需要跟隨字體大小) |
rem | 相對單位 | 根元素的 font-size | ❌ | 字體、間距、通用尺寸 |
vw | 相對單位 | 視窗寬度的 1% | ❌ | 響應式寬度、全寬元素 |
vh | 相對單位 | 視窗高度的 1% | ❌ | 響應式高度、全屏區塊 |
詳細說明
px (Pixels)
定義:絕對單位,1px = 螢幕上的一個像素點
特性:
- 固定大小,不會因為任何設定改變
- 精確控制,但缺乏彈性
- 不利於響應式設計和無障礙設計
使用時機:
/* ✅ 適合用於 */
border: 1px solid #000; /* 邊框 */
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* 陰影 */
border-radius: 4px; /* 小圓角 */
/* ❌ 不建議用於 */
font-size: 16px; /* 字體建議用 rem */
width: 1200px; /* 寬度建議用 % 或 vw */
em
定義:相對於父元素 font-size 的倍數
特性:
- 會累加繼承(巢狀結構會疊加)
- 彈性高但容易失控
- 適合需要跟隨父元素縮放的場景
計算範例:
.parent {
font-size: 16px;
}
.child {
font-size: 1.5em; /* 16px × 1.5 = 24px */
padding: 1em; /* 24px × 1 = 24px(相對於自己的 font-size)*/
}
.grandchild {
font-size: 1.5em; /* 24px × 1.5 = 36px(累加效應!)*/
}
使用時機:
/* ✅ 適合用於 */
.button {
font-size: 1rem;
padding: 0.5em 1em; /* 內距跟隨按鈕字體大小 */
}
.card-title {
font-size: 1.2em; /* 相對於卡片的基礎字體 */
margin-bottom: 0.5em; /* 間距跟隨標題大小 */
}
/* ⚠️ 小心巢狀累加 */
rem (Root em)
定義:相對於根元素(<html>)font-size 的倍數
特性:
- 不會累加繼承(始終相對於根元素)
- 易於管理和維護
- 方便實現全域縮放
- 最推薦的單位之一
計算範例:
html {
font-size: 16px; /* 瀏覽器預設 */
}
.element {
font-size: 1.5rem; /* 16px × 1.5 = 24px */
padding: 2rem; /* 16px × 2 = 32px */
margin: 1rem 0; /* 16px × 1 = 16px */
}
.nested .element {
font-size: 1.5rem; /* 還是 24px,不會累加! */
}
使用時機:
/* ✅ 最推薦用於 */
html {
font-size: 16px; /* 設定基準 */
}
body {
font-size: 1rem; /* 正文 16px */
}
h1 {
font-size: 2.5rem; /* 40px */
}
p {
font-size: 1rem; /* 16px */
margin-bottom: 1rem; /* 16px */
}
.container {
padding: 2rem; /* 32px */
max-width: 75rem; /* 1200px */
}
/* ✅ 方便實現暗黑模式或無障礙調整 */
@media (prefers-reduced-motion: reduce) {
html {
font-size: 18px; /* 所有 rem 單位自動放大 */
}
}
vw (Viewport Width)
定義:相對於視窗寬度的 1%(100vw = 視窗寬度)
特性:
- 真正的響應式單位
- 會隨瀏覽器視窗大小即時改變
- 注意:100vw 包含滾動條寬度