有過css
開發經驗的同窗,對於position
這個屬性必定不會陌生,然而這個熟悉的屬性確是面試題中的常客,也就說明了該屬性在css
的世界是有必定的江湖地位的,那麼咱們就來詳細的說說position
這個屬性。
在w3school中是這樣解釋position
屬性的css
定義和用法
position 屬性規定元素的定位類型。html
說明
這個屬性定義創建元素佈局所用的定位機制。任何元素均可以定位,不過絕對或固定元素會生成一個塊級框,而不論該元素自己是什麼類型。相對定位元素會相對於它在正常流中的默認位置偏移。git
CSS 定位機制github
CSS 有三種基本的定位機制:普通流、浮動和絕對定位。
除非專門指定,不然全部框都在普通流中定位。也就是說,普通流中的元素的位置由元素在 (X)HTML 中的位置決定。
塊級框從上到下一個接一個地排列,框之間的垂直距離是由框的垂直外邊距計算出來。
行內框在一行中水平佈置。可使用水平內邊距、邊框和外邊距調整它們的間距。可是,垂直內邊距、邊框和外邊距不影響行內框的高度。由一行造成的水平框稱爲行框(Line Box),行框的高度老是足以容納它包含的全部行內框。不過,設置行高能夠增長這個框的高度。
position
屬性對應的值有面試
position: static;
position: inherit;
position: relative;
position: absolute;
position: fixed;
position: sticky;
(新的屬性值)默認值。沒有定位,元素出如今正常的流中(忽略 top, bottom, left, right
或者 z-index
聲明)。元素框正常生成。塊級元素生成一個矩形框,做爲文檔流的一部分,行內元素則會建立一個或多個行框,置於其父元素中。瀏覽器
inherit
值如同其餘css
屬性的 inherit
值,即繼承父元素的position
值。佈局
相對定位,相對於本身的初始位置,不脫離文檔流。也就是說元素框偏移某個距離,元素仍保持其未定位前的形狀,它本來所佔的空間仍保留。
舉個例子,html
結構網站
<div class="div1">div1</div> <div class="div2">div2</div> <div class="div3">div3</div>
css
樣式spa
div { width: 100px; height: 100px; } .div1 { background: #ffff00; } .div2 { background: #00ff00; position: relative; top: 40px; left: 40px; } .div3 { background: #0000ff; }
結果 ssr
其中紅色框爲div2
的初始位置,因爲div2
設置了position:relative;top: 40px;left: 40px;
,因此該元素相對於本身的初始位置的上面40px
、左邊40px
。同時,其餘元素的位置未被改變。
絕對定位的元素的位置相對於最近的已定位祖先元素,若是元素沒有已定位的祖先元素,那麼它的位置相對於最初的包含塊。
例子中咱們把div2
的樣式稍做改動
.div2 { background: #00ff00; position: absolute; top: 40px; left: 40px; }
因爲div2
的祖先元素都沒有定位,因此相對於最初的包含塊也就是body
,同時因爲絕對定位脫離文檔流,因此div3
佔了div2
原來的位置。
fixed
元素脫離正常的文檔流,因此它與absolute
元素很類似,一樣會被周圍元素忽略,支持top,bottom,left,right
屬性,但fixed
元素正如它的名字同樣,它是固定在屏幕的某個位置,它不會隨着瀏覽器滾動條的滾動而一塊兒滾動。好比咱們常見的回到頂部
的功能,按鈕一直在瀏覽器的左下方,無論滾動條如何滾動,該按鈕都會在左下方的固定的位置,這個需求就可使用position: fixed
來完成。
但須要注意的是,position: fixed
是有兼容性問題的,不支持IE六、IE七、IE8
。能夠經過給該元素設置position: absolute
並獲取滾動條距離頂部高度加上某個固定高度來實現。
不少同窗會對該屬性比較陌生,這是一個相對來說比較新的屬性值。
sticky 的本意是粘貼,能夠稱之爲粘性定位,但在 css 中的表現更像是吸附。這是一個結合了 position:relative
和 position:fixed
兩種定位功能於一體的特殊定位。常見的吸頂、吸底(網站的頭部返回欄,底部切換欄之類)的效果用這個屬性很是適合。例以下面淘寶這個效果
當元素距離頁面視口(Viewport,也就是fixed定位的參照)頂部距離大於 0px 時,元素以 relative 定位表現,而當元素距離頁面視口小於 0px 時,元素表現爲 fixed 定位,也就會固定在頂部。
top、right、bottom、left
四個閾值其中之一,纔可以使粘性定位生效。不然其行爲與相對定位相同。而且 top
和 bottom
同時設置時,top
生效的優先級高,left
和 right
同時設置時,left
的優先級高。
position:sticky
元素的任意父節點的 overflow
屬性必須是 visible
,不然 position:sticky
不會生效。若是 position:sticky
元素的任意父節點定位設置爲 overflow:hidden
,則父容器沒法進行滾動,因此 position:sticky
元素也不會有滾動而後固定的狀況。若是 position:sticky
元素的任意父節點定位設置爲 position:relative | absolute | fixed
,則元素相對父元素進行定位,而不會相對 viewport
定位。position:sticky
的元素表現爲 relative
仍是 fixed
是根據元素是否達到設定了的閾值決定的。