細說css中的position屬性

有過css開發經驗的同窗,對於position這個屬性必定不會陌生,然而這個熟悉的屬性確是面試題中的常客,也就說明了該屬性在css的世界是有必定的江湖地位的,那麼咱們就來詳細的說說position這個屬性。
w3school中是這樣解釋position屬性的css

定義和用法

position 屬性規定元素的定位類型。html

說明

這個屬性定義創建元素佈局所用的定位機制。任何元素均可以定位,不過絕對或固定元素會生成一個塊級框,而不論該元素自己是什麼類型。相對定位元素會相對於它在正常流中的默認位置偏移。git

CSS 定位機制github

CSS 有三種基本的定位機制:普通流、浮動和絕對定位。
除非專門指定,不然全部框都在普通流中定位。也就是說,普通流中的元素的位置由元素在 (X)HTML 中的位置決定。
塊級框從上到下一個接一個地排列,框之間的垂直距離是由框的垂直外邊距計算出來。
行內框在一行中水平佈置。可使用水平內邊距、邊框和外邊距調整它們的間距。可是,垂直內邊距、邊框和外邊距不影響行內框的高度。由一行造成的水平框稱爲行框(Line Box),行框的高度老是足以容納它包含的全部行內框。不過,設置行高能夠增長這個框的高度。

position屬性對應的值有面試

  1. position: static;
  2. position: inherit;
  3. position: relative;
  4. position: absolute;
  5. position: fixed;
  6. position: sticky;(新的屬性值)

一、position: static

默認值。沒有定位,元素出如今正常的流中(忽略 top, bottom, left, right 或者 z-index 聲明)。元素框正常生成。塊級元素生成一個矩形框,做爲文檔流的一部分,行內元素則會建立一個或多個行框,置於其父元素中。瀏覽器

二、position: inherit

inherit值如同其餘css屬性的 inherit 值,即繼承父元素的position值。佈局

三、position: relative

相對定位,相對於本身的初始位置,不脫離文檔流。也就是說元素框偏移某個距離,元素仍保持其未定位前的形狀,它本來所佔的空間仍保留。
舉個例子,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;
}

結果
imagessr

其中紅色框爲div2的初始位置,因爲div2設置了position:relative;top: 40px;left: 40px;,因此該元素相對於本身的初始位置的上面40px、左邊40px。同時,其餘元素的位置未被改變。

四、position: absolute

絕對定位的元素的位置相對於最近的已定位祖先元素,若是元素沒有已定位的祖先元素,那麼它的位置相對於最初的包含塊
例子中咱們把div2的樣式稍做改動

.div2 {
    background: #00ff00;
    position: absolute;
    top: 40px;
    left: 40px;
}

image

因爲div2的祖先元素都沒有定位,因此相對於最初的包含塊也就是body,同時因爲絕對定位脫離文檔流,因此div3佔了div2原來的位置。

五、position: fixed

fixed元素脫離正常的文檔流,因此它與absolute元素很類似,一樣會被周圍元素忽略,支持top,bottom,left,right屬性,但fixed 元素正如它的名字同樣,它是固定在屏幕的某個位置,它不會隨着瀏覽器滾動條的滾動而一塊兒滾動。好比咱們常見的回到頂部的功能,按鈕一直在瀏覽器的左下方,無論滾動條如何滾動,該按鈕都會在左下方的固定的位置,這個需求就可使用position: fixed來完成。
但須要注意的是,position: fixed是有兼容性問題的,不支持IE六、IE七、IE8。能夠經過給該元素設置position: absolute並獲取滾動條距離頂部高度加上某個固定高度來實現。

六、position: sticky

不少同窗會對該屬性比較陌生,這是一個相對來說比較新的屬性值。
sticky 的本意是粘貼,能夠稱之爲粘性定位,但在 css 中的表現更像是吸附。這是一個結合了 position:relativeposition:fixed 兩種定位功能於一體的特殊定位。常見的吸頂、吸底(網站的頭部返回欄,底部切換欄之類)的效果用這個屬性很是適合。例以下面淘寶這個效果

image

當元素距離頁面視口(Viewport,也就是fixed定位的參照)頂部距離大於 0px 時,元素以 relative 定位表現,而當元素距離頁面視口小於 0px 時,元素表現爲 fixed 定位,也就會固定在頂部。

注意

  • 須指定 top、right、bottom、left 四個閾值其中之一,纔可以使粘性定位生效。不然其行爲與相對定位相同。

而且 topbottom 同時設置時,top 生效的優先級高,leftright 同時設置時,left 的優先級高。

  • 設定爲 position:sticky 元素的任意父節點的 overflow 屬性必須是 visible,不然 position:sticky 不會生效。若是 position:sticky 元素的任意父節點定位設置爲 overflow:hidden,則父容器沒法進行滾動,因此 position:sticky 元素也不會有滾動而後固定的狀況。若是 position:sticky 元素的任意父節點定位設置爲 position:relative | absolute | fixed,則元素相對父元素進行定位,而不會相對 viewport 定位。
  • 達到設定的閥值,也就是設定了 position:sticky 的元素表現爲 relative 仍是 fixed是根據元素是否達到設定了的閾值決定的。

兼容性 caniuse

image

相關文章
相關標籤/搜索