為什麼我設定 300px 寬度的 div,實際上卻是 340px?為什麼按鈕周圍會出現神秘的空間?如果 CSS 間距對你來說像是黑魔法,你絕對不孤單。
我在學習 CSS 的第一個月,完全被元素尺寸搞糊塗了。我設定 width: 200px,但在 DevTools 裡測量卻是 250px。我試著讓一個方塊置中,結果總是稍微偏移。我創建了三張卡片要排成一列,第三張卻莫名其妙地換到下一行。
後來我發現了 CSS 盒模型(Box Model),一切都豁然開朗了。

CSS 盒模型是 CSS 布局的基礎——它是控制網頁上每個元素如何佔據空間的核心概念。大多數初學者在 CSS 間距上掙扎,是因為他們不理解這個單一概念。
讀完這篇 5 分鐘指南,你將會理解:
- CSS 盒子的 4 個組成部分及其作用
- 為什麼你的元素尺寸不如預期(以及如何修正)
- 能解決 90% 間距問題的
box-sizing屬性 - 初學者常犯的 3 個盒模型錯誤
讓我們一次搞懂 CSS 間距。
什麼是 CSS 盒模型?
你網頁上的每個 HTML 元素都是一個矩形盒子。沒有例外。就連用 border-radius 做出來的圓形,起點也是盒子。而每個盒子都有四個同心區域,決定了它的尺寸和間距:
┌─────────────────────────────────────┐
│ MARGIN(透明的外距) │
│ ┌───────────────────────────────┐ │
│ │ BORDER(可見的邊框) │ │
│ │ ┌─────────────────────────┐ │ │
│ │ │ PADDING(內距空間) │ │ │
│ │ │ ┌─────────────────┐ │ │ │
│ │ │ │ CONTENT │ │ │ │
│ │ │ │ (內容區域) │ │ │ │
│ │ │ └─────────────────┘ │ │ │
│ │ └─────────────────────────┘ │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────┘
四個區域詳解
1. Content Box(內容盒) — 最內層的區域,你的實際內容(文字、圖片、子元素)就在這裡。這是 width 和 height 預設控制的部分。
2. Padding(內距) — 內容與邊框之間的空間。Padding 在邊框內側,會套用元素的背景色。用它來給內容留點呼吸空間。
3. Border(邊框) — 包圍內距的可見輪廓。可以是實線、虛線、有顏色、粗細各異。就是你加上 border: 1px solid black 時看到的那條線。
4. Margin(外距) — 邊框外側的空間,完全透明。Margin 把其他元素推開,在元素之間創造間隙。
這裡有個會絆倒初學者的關鍵觀念:預設情況下,width 和 height 只控制內容盒,而非元素的總尺寸。
這就是為什麼你的 300px div 加上 padding 和 border 後,實際上不是 300px 寬。
盒模型實戰:真實範例
讓我們建立一個簡單的按鈕,看看盒模型如何運作。
HTML:
<button class="my-button">點我</button>
CSS:
.my-button {
width: 100px;
height: 40px;
padding: 10px 20px;
border: 2px solid #333;
margin: 15px;
background-color: #3498db;
color: white;
}
現在來個小測驗:這個按鈕的實際寬度是多少?
如果你猜 100px,那你的思維還是初學者模式(沒關係,我們都是這樣過來的)。讓我們來計算實際寬度:
- 內容寬度:
100px - 左側 padding:
20px - 右側 padding:
20px - 左側 border:
2px - 右側 border:
2px - 總寬度:
100 + 20 + 20 + 2 + 2 = 144px
按鈕實際上是 144px 寬,而不是 100px。Margin 不會加到元素尺寸裡——它只是把其他元素推開。
💡 **親自試試看:**在 Chrome 或 Firefox 打開這篇文章,右鍵點擊按鈕,選擇「檢查元素」。在 Styles 或 Computed 面板找到盒模型圖表。你會看到每個區域的確切像素值的視覺化呈現。DevTools 是理解盒模型的最佳夥伴。
這就是預設行為,叫做 content-box 尺寸計算方式。也是為什麼剛開始學習時,CSS 間距感覺如此不可預測。
改變遊戲規則的屬性:box-sizing
這是改變我一切的領悟:你可以改變盒模型計算尺寸的方式。
content-box 的問題
預設情況下,所有元素使用 box-sizing: content-box,意思是:
width和height只套用到內容區域- Padding 和 border 會加到你指定的尺寸上
- 每次加 padding 或 border 都要做心算
- 響應式設計變成計算的惡夢
解決方案:border-box
這是每個專業人士都在用的現代最佳實踐:
/* 套用到所有元素(複製這段到你的每個專案)*/
* {
box-sizing: border-box;
}
使用 box-sizing: border-box 後,行為完全改變:
width和height現在包含內容 + padding + border- 內容區域會自動縮小以容納 padding 和 border
- 元素的總尺寸正是你指定的數值
前後對比
讓我們實際看看差異:
之前(content-box):
.box {
width: 200px;
padding: 20px;
border: 5px solid black;
}
/* 實際寬度:200 + 40 + 10 = 250px */
之後(border-box):
.box {
box-sizing: border-box;
width: 200px;
padding: 20px;
border: 5px solid black;
}
/* 實際寬度:200px(padding 和 border 已包含在內)*/
為什麼這改變了一切
實際的好處非常巨大:
- 可預測的尺寸 — 當你設定
width: 300px,元素就真的是 300px 寬 - 更簡單的響應式設計 — 百分比會如你預期運作:
width: 50%真的是容器的一半 - 更簡單的網格布局 — 不需要計算機就能做出三等分欄位
- 更少的布局 bug — 元素不會意外溢出容器
✅ **專業提示:**每個現代 CSS 框架(Bootstrap、Tailwind CSS、Foundation)預設都使用
border-box。如果你還沒用,那就是在讓 CSS 變得比必要還難。
現在就把 * { box-sizing: border-box; } 這行加到你的 CSS 裡。我等你。
3 個常見的盒模型錯誤(以及如何修正)
即使使用 border-box,還是有陷阱在等著初學者。這是我最常看到的三個:
錯誤 #1:設定 100% 寬度又加 Padding
陷阱:
.container {
width: 100%;
padding: 20px; /* 即將溢出!*/
}
**會發生什麼:**即使用 border-box,如果你忘記設定它,這個元素會變成 100% + 40px 寬,產生水平捲軸。
修正方法:
.container {
box-sizing: border-box; /* 別忘了這行 */
width: 100%;
padding: 20px; /* 現在安全了 */
}
或者更好的做法,用 * 選擇器全域設定 border-box。
錯誤 #2:忘記 Margin 會折疊
陷阱:
.element1 { margin-bottom: 20px; }
.element2 { margin-top: 30px; }
/* 你預期有 50px 間隙,實際上只有 30px */
會發生什麼:區塊元素之間的垂直 margin 會折疊——較大的 margin 獲勝,它們不會相加。這是 CSS 最令人困惑的怪癖之一。
**修正方法:**只用 margin-bottom 來做垂直間距(不要同時用上下 margin),或使用 Flexbox 的 gap 屬性(不會折疊):
.flex-container {
display: flex;
flex-direction: column;
gap: 20px; /* 乾淨、可預測的間距 */
}
錯誤 #3:用行內樣式設定盒模型屬性
陷阱:
<div style="width: 200px; padding: 20px;">內容</div>
**為什麼不好:**行內樣式無法設定 box-sizing,優先權最高(難以覆蓋),而且讓你的 HTML 變得雜亂。
**修正方法:**使用類別搭配正確的盒模型設定:
.card {
box-sizing: border-box;
width: 200px;
padding: 20px;
}
<div class="card">內容</div>
你的 DevTools 超能力
掌握盒模型最快的方法就是視覺化地看到它。方法如下:
- 右鍵點擊這個頁面上的任何元素(或任何網頁)→ 選擇檢查元素
- 在 Styles 或 Computed 面板找到盒模型圖表(通常在 Chrome DevTools 的右下角)
- 將滑鼠移到圖表的不同區域上
你會看到每個區域用不同顏色直接在頁面上標示出來:
- 藍色 = content(內容)
- 綠色 = padding(內距)
- 黃色/棕色 = border(邊框)
- 橘色 = margin(外距)
**更棒的是:**點擊 DevTools 圖表裡的數字可以即時編輯它們。加 20px 的 padding?看著元素即時調整大小。這就是培養盒模型直覺的方法——透過實驗。
🎯 **練習:**現在就在這篇文章上打開 DevTools(F12 或 Cmd+Opt+I),檢查三個不同的元素。看看每個元素的盒模型如何變化。花 2 分鐘探索。這會比再讀一篇教學更有價值。
快速參考:必備的盒模型程式碼
把這個章節加入書籤。你會不斷參考它:
/* 步驟 1:永遠要全域設定 border-box */
* {
box-sizing: border-box;
}
/* 步驟 2:使用盒模型屬性 */
.element {
/* 內容尺寸 */
width: 300px;
height: 200px;
/* Padding(內距,有背景色)*/
padding: 20px;
/* Border(可見輪廓)*/
border: 2px solid #333;
/* Margin(外距,透明)*/
margin: 10px;
}
/* 簡寫語法 */
padding: 10px 20px 10px 20px; /* 上、右、下、左 */
padding: 10px 20px; /* 垂直、水平 */
padding: 10px; /* 四邊 */
重點整理
一旦你內化了這些真理,CSS 盒模型就不再神秘:
✅ 每個元素都是盒子,有四個區域:content、padding、border、margin
✅ 永遠使用 box-sizing: border-box,讓 width 和 height 的行為可預測
✅ 使用 DevTools 視覺化盒模型,當有東西看起來不對勁時
✅ 小心 margin 折疊,區塊元素之間的垂直 margin 會折疊
✅ Flexbox/Grid 的 gap 屬性比 margin 更乾淨,用來做間距
你的下一步
現在就這樣做,來鞏固這些知識:
- 把
* { box-sizing: border-box; }加到你的 CSS,如果你還沒加的話 - 打開 DevTools 檢查 5 個不同元素,在這個頁面或任何網站上
- **動手做點東西:**創建一個簡單的卡片元件,包含 content、padding、border 和 margin——看看改變每個區域如何影響布局
- 把這篇文章加入書籤,當你對間距感到困惑時,回來看快速參考章節
盒模型是那種一開始看起來很複雜,但透過練習會變成第二天性的概念。一旦你「懂了」,CSS 布局就不再像猜謎,而是變成你能精準控制的工具。
準備好更上一層樓了嗎?現在你理解了個別元素如何佔據空間,你已經準備好學習 Flexbox 和 Grid 了——這些現代布局系統讓你能將多個元素排列成精緻的設計。這些工具建立在你剛學到的盒模型基礎之上。
**你對盒模型的最大「恍然大悟」時刻是什麼?**在留言區告訴我——我會讀每一則留言並回覆。如果這篇指南對你有幫助,請按個讚 👏 讓更多初學者能找到它。
讓我們一起揭開 CSS 的神秘面紗,一次一個概念。🚀
#CSS #盒模型 #前端開發 #網頁設計 #程式教學 #初學者指南 #CSS教學 #前端入門 #響應式設計 #box-sizing













