如何在 CSS 中使用 position 屬性

定位可以讓我們決定元素在螢幕上的出現位置和方式。

您可以移動元素並將它們放在希望的位置。

在這篇文章中,我們還將看到不同 position 屬性的元素之間互動時,在頁面上的變化。

我們有一個主要的 CSS 屬性:position

它可以有以下5個值:

  • static
  • relative
  • absolute
  • fixed
  • sticky

靜態定位

這是元素的預設值。靜態定位的元素會按照正常的頁面流程顯示。

相對定位

如果在元素上設置position: relative,就可以使用偏移屬性來定位它,這些偏移屬性是:

  • top
  • right
  • bottom
  • left

它們被稱為偏移屬性。它們接受長度值或百分比。

看一下我在 Codepen 上創建的這個例子。我創建了一個父容器、一個子容器和一個帶有一些文本的內部框:

<div class="parent">
 <div class="child">
 <div class="box">
 <p>Test</p>
 </div>
 </div>
</div>

用一些 CSS 來賦予顏色和填充,但不會影響定位:

.parent {
 background-color: #af47ff;
 padding: 30px;
 width: 300px;
}

.child {
 background-color: #ff4797;
 padding: 30px;
}

.box {
 background-color: #f3ff47;
 padding: 30px;
 border: 2px dotted #333;
 font-family: courier;
 text-align: center;
 font-size: 2rem;
}

這是結果:

您可以嘗試將我之前提到的任何屬性(toprightbottomleft)添加到.box,不會發生任何事情。位置是static的。

現在,如果我們將position: relative設置為框架,一開始似乎沒有什麼變化。但是,這個元素現在可以使用toprightbottomleft屬性來移動,你可以相對於包含框架的元素來改變它的位置。

例如:

.box {
 /* ... */
 position: relative;
 top: -60px;
}

top屬性的負值會使框架相對於其容器向上移動。

或者

.box {
 /* ... */
 position: relative;
 top: -60px;
 left: 180px;
}

請注意,框架所佔用的空間仍在容器中保留,就像它仍然在原地一樣。

現在可以正常工作的另一個屬性是z-index,用於改變z軸的位置。我們稍後會談到它。

絕對定位

在元素上設置position: absolute會將其從文檔流中刪除,並且不再遵循原始的頁面定位流程。

記得在相對定位中,我們注意到元素原先所佔用的空間即使移動了位置也會被保留嗎?

使用絕對定位,一旦在.box上設置了position: absolute,它的原始空間就會塌陷,只剩下原點(x,y坐標)保持不變。

.box {
 /* ... */
 position: absolute;
}

現在,我們可以使用toprightbottomleft屬性隨意移動框架:

.box {
 /* ... */
 position: absolute;
 top: 0px;
 left: 0px;
}

或者

.box {
 /* ... */
 position: absolute;
 top: 140px;
 left: 50px;
}

座標是相對於最靠近且不是static的容器。這意味著,如果在.child元素上添加了position: relative,並將topleft設置為0,框架將不會定位在視窗的左上角邊緣,而是會定位在.child的0, 0 座標:

.child {
 /* ... */
 position: relative;
}

.box {
 /* ... */
 position: absolute;
 top: 0px;
 left: 0px;
}

如果.child是靜態的(默認值),則會發生以下情況:

.child {
 /* ... */
 position: static;
}

.box {
 /* ... */
 position: absolute;
 top: 0px;
 left: 0px;
}

就像相對定位一樣,您可以使用z-index來改變z軸的位置。

固定定位

和絕對定位一樣,當一個元素被設置為position: fixed時,它將從頁面的流中移除。

絕對定位的區別在於:元素現在始終相對於窗口定位,而不是相對於第一個非靜態的容器。

.box {
 /* ... */
 position: fixed;
}

.box {
 /* ... */
 position: fixed;
 top: 0;
 left: 0;
}

另一個重大的區別是,元素不受滾動的影響。一旦您將一個粘性元素放在某個地方,滾動頁面不會將其從可見部分中移除。

粘性定位

儘管上面的值已經存在很長時間了,但這個值是最近引入的,而且仍然相對不支持(請參見 caniuse.com)。

當我想到position: sticky時,UITableView iOS元件就會浮現在我的腦海中。您知道當您在聯繫人列表中滾動時,第一個字母會固定在頂部的位置,以便讓您知道您正在查看該特定字母的聯繫人嗎?

我們使用 JavaScript 來模擬它,但這是 CSS 採用的方法,以允許它在本地實現。