CSS 盒模型(Box Model)
瀏覽器把每個元素當成一層盒子來排。盒子由內而外是 content → padding → border → margin。寬高到底包不包 padding,由 box-sizing 決定。
四個部分(Anatomy)
| 部分 | 作用 | 主要屬性 |
|---|---|---|
| Content | 文字、圖片、子元素 | width、height、min/max-width |
| Padding | 內容到邊框的距離,仍在背景裡 | padding |
| Border | 邊線 | border |
| Margin | 與其他盒子的距離,背景畫不到這裡 | margin |
box-sizing
| 值 | width / height 包含什麼 |
日常建議 |
|---|---|---|
content-box(初始值) |
只有 content | 心算很累 |
border-box |
content + padding + border | 一律用這個 |
標準模式下,上面例子的佔寬是:
(若把 margin 算進「佔版面」;相鄰垂直 margin 還可能合併,見下節。)
設成 border-box 後,width: 200px 就是你在版面上看到的框寬(不含 margin)。Grid / Flex 裡比較不容易意外撐破欄位。
outline 不是盒子的一部分
outline 與 box-shadow 不佔布局空間,不會把鄰居推開。焦點環請用 outline 或 box-shadow,不要靠很厚的 border 硬擠。
Margin 合併(collapse)
兩個區塊在垂直方向的 margin 相遇時,通常取較大者,不是相加。
常見情況:
- 相鄰兄弟的上下 margin
- 父元素沒有 padding / border /
overflow時,子元素的上下 margin 會「漏」到父層外面
避免漏出的方法:給父層一點 padding、border,或使用 Flex / Grid(彈性與網格容器內不會垂直合併)。
水平 margin 不會合併。
視覺與佔位:overflow、visibility
內容比盒子大時:
| 屬性 | 隱藏後還佔空間? |
|---|---|
display: none |
否 |
visibility: hidden |
是 |
opacity: 0 |
是,且仍可點到(除非再配 pointer-events: none) |
總結
- 先想像四層盒子,再決定改的是內距還是外距。
- 專案開頭就設
box-sizing: border-box。 - 垂直 margin 會合併;用 Flex / Grid 排版時這個問題少很多。
接著把 margin 與 padding 的寫法練熟,再看 邊框與陰影。