Skip to content

CSS 定位排版 position:五種定位方式與 z-index

CSS 定位排版 position:五種定位方式

CSS 的定位屬性用於控制元素在頁面上的位置。透過靈活運用定位屬性,可以實現多樣化的排版效果,提升頁面設計的靈活性與美觀性,讓網頁的版型不再是死板板的水平、垂直排列了。

position

此屬性的值不為 static 時,便可以使用 toprightbottomleftz-index 這些屬性。

  • static: 所有元素的預設定位方式。
  • relative: 元素相對於其正常位置進行偏移。
  • absolute: 元素相對於最近的 已定位祖先position 不是 static 的祖先)進行定位。若完全沒有已定位的祖先,則以整份文件為基準,捲動時會跟著移動。
  • fixed: 元素相對於視窗進行定位,無論頁面滾動與否,位置都保持不變。
  • sticky: 元素在特定的滾動範圍內表現為相對定位,超出範圍後變為固定。

top

元素的上緣處,相對於定位基準的距離。

left

元素的左緣處,相對於定位基準的距離。

bottom

元素的下緣處,相對於定位基準的距離。

元素的右緣處,相對於定位基準的距離。

z-index

z-index 是 CSS 中用來控制元素堆疊順序的屬性。當元素重疊時,z-index 決定了哪個元素會顯示在上面。

注意事項

  • toprightbottomleftz-index 這些屬性必須在 position 不為 static 才能使用。
  • 使用 absolutefixed 時,需注意元素可能會脫離文檔流,影響其他元素的排版。
  • sticky 定位需要設置 topleft 等屬性,並且其父容器不能有 overflow: hidden
  • 規劃相互覆蓋網頁元素的 z-index 範圍,而不是一昧地將數字設定很高。否則,以後只會道高一尺,魔高一丈!
  • 有設定 left,就不要設定 right;同樣地,有設定 top 就不要設定 bottom。若是要還原為預設,則不再此限。

五種定位的差別

行為佔空間
static預設,照正常文件流排列
relative相對原本位置偏移,常當作定位基準
absolute相對最近的已定位祖先擺放
fixed相對視窗固定
sticky捲到指定位置前正常、之後黏住
css
.parent { position: relative; }        /* 建立定位基準 */
.badge  { position: absolute; top: 8px; right: 8px; }

常見的踩坑

  • fixed 的祖先若設定了 transformfilterperspective,它會改為相對那個祖先定位。
  • sticky 需要指定方向與距離,且父層不能有溢出隱藏的設定。
  • z-index 只對非 static 的元素有效,且比較只在 同一個堆疊環境 內進行。

常見問題

absolute 是相對於誰定位?

相對於最近一個 position 不是 static 的祖先元素;都沒有的話就以整份文件為準。因此使用前通常會先在父層加上 relative

fixed 為什麼失效了?

祖先元素若設定了 transformfilterperspective,就會成為新的定位基準,fixed 會改為相對它定位而不是視窗。這是最常見的原因。

sticky 沒有黏住怎麼辦?

確認三件事:有沒有指定方向與距離、父層是不是有溢出隱藏的設定、以及父層高度是否足以讓它滑動。三者缺一都會沒有效果。

z-index 設很大還是被蓋住?

層級的比較只在同一個堆疊環境內進行。父層若因為透明度或變形建立了新的堆疊環境,子元素再大的數值也跳不出去。

延伸閱讀