現代 CSS clamp() 完整筆記
clamp() 常被稱為「媒體查詢殺手」,因為很多「只是字體、間距要跟著螢幕慢慢變大/變小」的情境,其實根本不需要一堆 @media,一行 clamp() 就能搞定。
1. 問題背景:為什麼會寫出 40+ 個媒體查詢?
典型情境:為了讓頁面在 375 / 768 / 1024 / 1440… 等尺寸都漂亮,你會寫:
h1 {
font-size: 24px;
} /* Mobile */
@media (min-width: 768px) {
h1 {
font-size: 32px;
} /* Tablet */
}
@media (min-width: 1024px) {
h1 {
font-size: 40px;
} /* Desktop */
}
@media (min-width: 1440px) {
h1 {
font-size: 48px;
} /* Large desktop */
}
一個標題就四個斷點、12 行 CSS;若所有標題、段落、按鈕、容器都這樣寫,很快就變成「媒體查詢地獄」,而且在 800px、1200px 這種「介於斷點之間」的寬度,字體會突然跳變,不夠流暢。
2. clamp() 是什麼?核心概念
語法:
property: clamp(min, preferred, max);
- min:最小值(數值不會小於它)
- preferred:首選值,通常會用
vw或vw + px,讓數值隨視窗寬度變化 - max:最大值(數值不會大於它)
瀏覽器會優先採用「首選值」,但若太小就用 min,太大就用 max。
/* 字體會在 24px ~ 48px 間,跟著視窗寬度線性縮放 */
font-size: clamp(24px, 5vw, 48px);
效果:
- 320px 手機:
5vw = 16px→ 被下限 24px clamp 起來 → 24px - 768px 平板:
5vw = 38.4px→ 落在 24–48 範圍 → 38.4px - 1920px 螢幕:
5vw = 96px→ 被上限 48px clamp → 48px
整段寬度之間會「平滑縮放」,不再是斷點跳變。
3. 實戰例子:用 clamp() 取代多數媒體查詢
3.1 響應式標題字體(Fluid Typography)
舊寫法:
h1 {
font-size: 28px;
}
@media (min-width: 640px) {
h1 {
font-size: 36px;
}
}
@media (min-width: 1024px) {
h1 {
font-size: 48px;
}
}
@media (min-width: 1440px) {
h1 {
font-size: 56px;
}
}
新寫法:
h1 {
font-size: clamp(28px, 4vw, 56px);
}
15 行變 3 行,且縮放更平滑。
3.2 容器內距 / 外距(Padding / Margin)
.container {
padding: clamp(16px, 4vw, 64px);
}
- 小螢幕時接近 16px
- 大螢幕時接近 64px
- 中間寬度則線性補間
3.3 卡片網格間距(Grid Gaps)
.grid {
gap: clamp(12px, 2vw, 32px);
}
小螢幕時卡片之間較緊,中大螢幕逐漸拉開。
3.4 其他很適合用 clamp() 的屬性
- 字體大小:
font-size - 內外距:
padding,margin - 寬度限制:
max-width - 卡片圓角:
border-radius - 元件高度:
height,min-height
4. 如何計算「首選值」的 vw?
如果想要更精準控制,可以用一個簡單公式來算中間那個 vw:
- 決定最小值 / 最大值
- 例如:字體最小 16px、最大 32px
- 決定對應的視窗寬度範圍
- 例如:375px(手機)到 1440px(桌機)
- 計算差值
- 尺寸差:
32 - 16 = 16px - 寬度差:
1440 - 375 = 1065px
- 尺寸差:
- 換成百分比
16 / 1065 ≒ 0.015 = 1.5%→ 就是 1.5vw
- 組合成
clamp()
font-size: clamp(16px, 1.5vw + 16px, 32px);
這樣可以保證在 375–1440px 這段範圍內,字體會從 16px 線性縮放到 32px。
懶人作法:直接從
2vw、3vw開始試,搭配 Clamp Calculator 之類工具微調就好。