淺析CSS中的position屬性

position簡介

CSS屬性選擇用于定位元素的替代規則,被設計為對腳本動畫效果有用。是 CSS中常用的布局屬性之一。

取值

static

該關鍵字指定元素使用正常的布局行為,即元素在文檔流中當前的布局位置。此時 top, right, bottom, left 和 z-index 屬性無效。

relative

該關鍵字下,元素先放置在未添加定位時的位置,再在不改變頁面布局的前提下調整元素位置(因此會在此元素未添加定位時所在位置留下空白)。position:relative 未定義對 table-*-group, table-row, table-column, table-cell, table-caption 元素應用的效果。

absolute

不為元素預留空間,通過指定元素相對于最近的非 static 定位祖先元素的偏移,來確定元素位置。絕對定位的元素可以設置外邊距(margins),且不會與其他邊距合并。

fixed

不為元素預留空間,而是通過指定元素相對于屏幕視口(viewport)的位置來指定元素位置。元素的位置在屏幕滾動時不會改變。打印時,元素會出現在的每頁的固定位置。fixed 屬性會創建新的棧上下文。當元素祖先的 transform 屬性非 none 時,容器由視口改為該祖先。

關于inherit

在一開始查找position的相關資料中發現,有說position有五種取值的,即static 、relative、absolute、fixed、inherit。有說四種取值即static 、relative、absolute、fixed的。這。。。。

Paste_Image.png

那inherit到底是不是position的取值呢?
我去查了下 MDN
QQ截圖20170327225.png

全局值是什么?我又去查了下w3c。原來是CSS-wide keywords. 即所有CSS屬性都接受的值。
好了,那看來屬于position的值只有static 、relative、absolute、fixed了。(sticky是一個實驗性的API,盡量不要使用它)

示例

我們來看看如何使用這四個屬性。

static

static,無特殊定位,它是html元素默認的定位方式,即我們不設定元素的position屬性時默認的position值就是static,它遵循正常的文檔流對象。

relative(相對定位)

還是在文檔流中,但是要動一下。怎么動呢?我來上代碼演示下。

QQ截圖e1.png
QQ截圖e.png

我們看到1和2位置并沒有因為紅色方塊的變化為變化,還是處在原來的位置。

fixed(固定定位)

這個屬性是相對于viewport來定位的。

QQ截圖f.png
QQ截圖f1.png

通過代碼可以看到,我將窗口調大后不管如何滾動紅色方塊都不會改變位置。當然fixed不在文檔流中。

absolute(絕對定位)

相對定位的元素并未脫離文檔流,而絕對定位的元素則脫離了文檔流。在布置文檔流中其它元素時,絕對定位元素不占據空間。絕對定位元素相對于最近的非 static 祖先元素定位。當這樣的祖先元素不存在時,則相對于根級容器定位。

下面的示例中,"Three" 元素不存在應用了定位的祖先元素,因此該元素相對于緊鄰的祖先(iframe 中的 <body> 元素)絕對定位。


QQ截圖a.png

等等,這是普通情況。我們來看一下極端點情況。

QQ截圖q.png

父類都沒有定位該相對于誰定位呢?我們來查下文檔w3c,通過文檔我們知道絕對定位的元素是相對于它的containing block來定位的。
所以上圖代碼中child在父類祖先類都沒有定位的時候是相對于它的包含塊定位的。

總結

  • static 是默認值
  • relative是相對自己定位的。
  • fixed是相對于viewport 視口來定位的。
  • absolute相對于最近的非 static 祖先元素定位的。如果祖先類都沒有定位則相對于包含塊定位。

position只是CSS布局中常用的屬性之一,但包含的內容確實不少。這是我的一些認識,如果有錯誤的地方還請各位多多指點。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容