CSS 屬性篇(一):relative與absolute

Madman0621發表於2019-02-20

一、position的屬性值

首先基本瞭解下position的各個屬性值:
1、static:預設值。沒有定位,元素在正常顯示出現(它將忽略top、bottom、left、right、z-index宣告)
2、relative:生成相對定位的元素,相對於其正常位置進行移動。元素的位置通過 "left", "top", "right" 以及 "bottom" 屬性進行規定。
3、absolute:生成絕對定位的元素,相對於position屬性定義為static之外的第一個父元素進行定位。元素的位置通過 "left", "top", "right" 以及 "bottom" 屬性進行規定。
4、fixed:生成絕對定位的元素,相對於瀏覽器視窗進行定位。元素的位置通過 "left", "top", "right" 以及 "bottom" 屬性進行規定。
5、sticky:在螢幕範圍(viewport)時該元素的位置並不受到定位影響(設定是top、left等屬性無效),當該元素的位置將要移出偏移範圍時,定位又會變成fixed,根據設定的left、top等屬性成固定位置的效果。

這篇文章我們主要對relative屬性值和absolute屬性值進行說明。

二、relative

1、定位為relative的元素,雖然可以脫離正常的文件流進行移動,但是其本身在文件流中佔據的位置仍然保留。如下圖所示:

在這裡插入圖片描述
relative元素進行移動是相對於其本身原來位置進行移動,並且當它移動之後,它仍然佔據著原來位置的空間。

三、absolute

定位為absolute的元素,也是脫離正常的文件流,並且其本身在文件流中佔據的位置不再保留。如下圖所示:

在這裡插入圖片描述

其中黃色背景為absolute的元素,藍色背景被普通元素,紅色背景為二者的父元素(父元素被定義為relative)。
如圖所示,absolute元素進行移動是相對於離它最近的定義了position屬性並且屬性值不為static的父層元素進行移動(這個父層元素可以不是其直接父層)。如果其父層全部都未定義除static之外的position屬性,那麼它將相對於瀏覽器顯示窗體元素進行移動而非html標籤元素。

1、absolute元素的父元素並沒有設定position屬性,而其祖父元素設定了position屬性,absolute元素則相對祖父元素進行移動。

CSS 屬性篇(一):relative與absolute

2、absolute元素的父元素並設定position:static屬性,而其祖父元素設定了position:relative屬性,absolute元素則相對祖父元素進行移動。 CSS 屬性篇(一):relative與absolute


3、absolute元素的父元素並設定position:relative屬性,祖父元素也設定了position:relative屬性,absolute元素則相對父元素進行移動。 CSS 屬性篇(一):relative與absolute


4、absolute元素的父元素和祖父元素都沒有設定position屬性,absolute元素則相對瀏覽器顯示窗體元素(注意:不是html元素)進行移動。 CSS 屬性篇(一):relative與absolute


5、如下圖所示,在沒有設定移動屬性(left,right,top,bottom)時,absolute元素處於正常佈局中所處的位置,只是屬於“浮在空中”的狀態,不佔據文件流空間。

在這裡插入圖片描述

四、注意

對於上文中,absolute元素如果其父層全部都未定義除static之外的position屬性,那麼它將相對於瀏覽器顯示窗體元素進行移動而非html標籤元素有異議的,我們可以試試一下的程式碼一試便知。

body,html {
	margin-top:50px;
	height:300px;
}
div {
	width:200px;
	height:200px;
	background:red;
	position:absolute;
	top:20px;
}
複製程式碼

結果分析:
1、如果div元素距離頂部只有20px,則div是相對瀏覽器顯示視窗移動。
2、如果div元素距離頂部為70px(html的margin-top:50px + top:20px),則div是相對html元素移動。
3、如果div元素距離頂部為120px(html的margin-top:50px + body的margin-top:50px + top:20px),則div是相對body元素移動。

程式碼傳送門:案例程式碼 by madman0621 (@madman0621) on CodePen.

相關文章