如何在 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;
}
這是結果:
您可以嘗試將我之前提到的任何屬性(top
,right
,bottom
,left
)添加到.box
,不會發生任何事情。位置是static
的。
現在,如果我們將position: relative
設置為框架,一開始似乎沒有什麼變化。但是,這個元素現在可以使用top
,right
,bottom
,left
屬性來移動,你可以相對於包含框架的元素來改變它的位置。
例如:
.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;
}
現在,我們可以使用top
,right
,bottom
,left
屬性隨意移動框架:
.box {
/* ... */
position: absolute;
top: 0px;
left: 0px;
}
或者
.box {
/* ... */
position: absolute;
top: 140px;
left: 50px;
}
座標是相對於最靠近且不是static
的容器。這意味著,如果在.child
元素上添加了position: relative
,並將top
和left
設置為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 採用的方法,以允許它在本地實現。