水平置中看似基礎,但選錯方法往往要多加幾行補丁才能修正。以下五種寫法各有適用條件,選之前先確認目標元素是行內還是區塊、有無固定寬度、父容器是否允許改動。
1. text-align: center
作用在父容器,讓其中的行內元素或行內區塊元素水平置中。
1 | .parent { |
文字、<span>、<img>、display: inline-block 的元素都吃這個規則;display: block 的子元素不受影響。如果要置中的是區塊元素,這條沒用。
2. margin: auto
把區塊元素的左右邊距都設為 auto,瀏覽器會平均分配剩餘空間。
1 | .child { |
不想寫死寬度的話,可以用 width: fit-content,寬度跟著內容走,同樣能置中:
1 | .child { |
兩種寫法的前提一樣:元素必須是區塊元素,且寬度小於父容器。行內元素不適用。
3. Flexbox
把父容器設為 flex container,再用 justify-content 控制主軸(預設橫向)的排列。
1 | .parent { |
子元素不需要指定寬度,也不需要知道自己的尺寸。要同時垂直置中就加 align-items: center。Flexbox 是一維佈局工具,處理單行或單列排列是它的強項;現代瀏覽器全面支援,不需要擔心相容性問題。
4. Grid
把父容器設為 grid container,justify-content: center 會讓整個 grid 在父容器中水平置中:
1 | .parent { |
如果只有一個子元素,用 place-items: center 更簡潔(同時處理水平與垂直);或是在子元素上設 margin: auto,Grid 子元素的 margin: auto 會吃掉剩餘空間:
1 | /* 子元素自己置中 */ |
Grid 的核心優勢是二維佈局(同時控制行與列)。單純做水平置中的話,Flexbox 語意更直觀;需要同時管理行列結構時才值得拉 Grid 進來。
5. 絕對定位加 transform
父容器設相對定位,子元素用絕對定位推到 50% 再用 translateX 拉回自身一半寬度:
1 | .parent { |
子元素會脫離正常文件流,不佔據原本的空間,父容器高度也不會被它撐開。這個寫法的使用場景通常是 overlay、tooltip 或需要精確定位的浮層元件,而不是一般的內容置中。程式碼本身不複雜,但副作用(脫離文件流)是要留意的地方。
選哪個
| 情境 | 建議 |
|---|---|
| 行內元素、文字置中 | text-align: center |
| 區塊元素、寬度已知或用 fit-content | margin: auto |
| 一般元件置中,不需管垂直 | Flexbox justify-content: center |
| 要同時處理水平垂直、或二維格線佈局 | Grid |
| 浮層、overlay、需脫離文件流 | 絕對定位 + translateX(-50%) |




