position定位有哪幾種?各有什么特點?

我們在布局的時候經(jīng)常會使用到position的屬性,那么你真的完全了解它嗎?

position概念

position 屬性把元素放置到一個靜態(tài)的、相對的、絕對的、或固定的位置中。

position屬性值:

position的屬性值共有四個常用的:static、relative、absolute、fixed。還有不常用的:inherit、initial、sticky。

知識詳解

Static

所有元素在默認的情況下position屬性均為static,而我們在布局上經(jīng)常會用到的相對定位和絕對定位常用的屬性top、bottom、left、right或者 z-index 聲明在position為static的情況下無效。其用法為:在改變了元素的position屬性后可以將元素重置為static讓其回歸到頁面默認的普通流中。

Relative

俗稱的相對定位,重點在于對相對理解。我們此前說過每個元素在頁面的普通流中會有“占用”一個位置,這個位置可以理解為默認位置,而相對定位就是將元素偏離元素的默認位置,但普通流中依然保持著原有的默認位置,并沒有脫離普通流,只是視覺上發(fā)生的偏移。


strong { background: #808080; }

em { background: #ffd800; }

span { background: #b6ff00; position: relative; top: 10px; left: 10px; width: 100px; }strongemspan


請注意看,在這里我是有對span進行width屬性的賦值(為100px)。但是我們可以看到span在運用了relative這個position屬性值后,依然對width屬性無效,換而言之,position: relative并沒有改變行內(nèi)元素的Display屬性,這個概念非常重要(注意與接下來的absolute的區(qū)別)。

Absolute

俗稱的絕對定位,絕對定位是相對而言的,怎么理解呢?應(yīng)用了position: absolute的元素會循著節(jié)點樹中的父(祖)元素來確定“根”,然后相對這個“根”元素來偏移。如果在其節(jié)點樹中所有父(祖)元素都沒有設(shè)置position屬性值為relative或者absolute則該元素最終將對body進行位置偏移。應(yīng)用了position: absolute的元素會脫離頁面中的普通流并改變Display屬性(重點)!


現(xiàn)在我們對A-2這個div設(shè)置絕對定位(Top: 0, Left: 0),而沒有對它的父元素(A、A-1)設(shè)置任何的position值


可以看到(A-2)最終是根據(jù)body來產(chǎn)生了位移


從上面的圖,我們可以總結(jié)以下幾個結(jié)論。

1)塊狀元素在position(relative/static)的情況下width為100%,但是設(shè)置了position: absolute之后,會將width變成auto(會受到父元素的寬度影響)。

2)元素設(shè)置了position:

absolute之后,如果沒有設(shè)置top、bottom、left、right屬性的話,瀏覽器會默認設(shè)置成auto,而auto的值則是該元素的“默認位置”。即設(shè)置position: absolute前后的offsetTop和offsetLeft屬性值不變。

特殊情況:

Firefox的話會直接將top、left設(shè)置成offsetTop和offsetLeft的值而非auto。

IE7下的表現(xiàn)更類似于float,會附加到父元素的末尾。


Fixed

在很長的時間里,這個屬性值因為兼容性問題,并沒有得到非常廣泛的應(yīng)用(IE6未實現(xiàn)該屬性值)。fixed和absolute有很多共同點:

1.會改變行內(nèi)元素的呈現(xiàn)模式,使display之變更為block。

2.會讓元素脫離普通流,不占據(jù)空間。

3.默認會覆蓋到非定位元素上。

fixed與absolute最大的區(qū)別在于:absolute的”根元素“是可以被設(shè)置的,而fixed則其”根元素“固定為瀏覽器窗口。即當你滾動網(wǎng)頁,其元素與瀏覽器窗口之間的距離是恒定不變的。

拓展知識

1)應(yīng)用了position: relative/absolute的元素,margin屬性仍然有效,以position:relative來舉例。如果設(shè)置了left、top、bottom、right的屬性,建議大家不要設(shè)置margin數(shù)據(jù),因為很難精確元素的定位,盡量減少干擾因素。


2)position: absolute忽略根元素的padding。

3)在IE6/7中設(shè)置position屬性后會導(dǎo)致z-index屬性失效

解決方案,父元素設(shè)置一個更大的z-index值即可

4)行內(nèi)元素在應(yīng)用了position:absolute之后會改變display。


因此,要注意到relative是并沒有改變行內(nèi)元素的呈現(xiàn)模式,而absolute是會改變行內(nèi)元素的呈現(xiàn)模式,如果設(shè)置了absolute并不需要顯式的的將元素display改成block。

5)應(yīng)用了position: absolute / relative之后,會覆蓋其他非定位元素(即position為static的元素),如果你不想覆蓋到其他元素,也可以將z-index設(shè)置成-1。

absolute是一個能夠獨當一面的屬性,其使用可以不要relative,當然,也可以不使用z-index。在默認情況下,元素應(yīng)用了非static的position屬性后,其就會有一個隱晦的層級,會居于普通元素之上,無需額外設(shè)置z-index屬性值。


1)元素同時應(yīng)用了position: relative、float、(top / left / bottom / right)屬性后,則元素先浮動到相應(yīng)的位置,然后再根據(jù)(top / left / bottom / right)所設(shè)置的距離來發(fā)生偏移。


左圖中的div是沒有設(shè)置top、left值的,而右邊則設(shè)置了50px的偏移。

2)元素同時應(yīng)用了position: absolute及float屬性,則float失效。

3)第一個元素應(yīng)用了position之后會覆蓋著接下來的float元素(如果兩個元素所處的位置相同)

如果你不將float的元素的position設(shè)置成relative的話,你想通過設(shè)置float元素的z-index來的達到覆蓋position:absolute是無效的。同理,float元素下面存在position: absolute的子元素,如果你不將float的元素的position設(shè)置成relative的話,absolute元素是不會定位到float元素的。

4)同時應(yīng)用position: absolute和float: left會導(dǎo)致清除浮動無效(position: relative則可以清除浮動)。

常用的清除浮動的方法有兩種:

1.通過在容器中添加一個標簽,設(shè)置該標簽的樣式為 clear: both

2.容器設(shè)置overflow: hidden

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 大家好,我是IT修真院鄭州分院第6期的學(xué)員王棟,一枚正直、純潔、善良的前端程序員 今天給大家分享一下,修真院官網(wǎng)C...
    17064閱讀 2,276評論 0 1
  • 今天給大家分享一下,深度思考中的知識點——position定位有哪幾種?各有什么特點? 一、背景介紹POSITIO...
    南木小屋閱讀 15,680評論 1 12
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽?zāi)J的外補...
    _Yfling閱讀 14,099評論 1 92
  • 各種純css圖標 CSS3可以實現(xiàn)很多漂亮的圖形,我收集了32種圖形,在下面列出。直接用CSS3畫出這些圖形,要比...
    劍殘閱讀 9,977評論 0 8
  • 學(xué)習(xí)建議 定位、浮動是 CSS 核心知識點,必須熟練掌握。 1.文檔流的概念指什么?有哪種方式可以讓元素脫離文檔流...
    饑人谷_任磊閱讀 1,156評論 0 3

友情鏈接更多精彩內(nèi)容