position屬性可以讓你讓你隨意控制一個特定元素在浏覽器何處以及如何顯示。比方說我們用position:fixed 讓一個圖片顯示在浏覽器的左上角.即使出現滾動條他依然可以在浏覽器的左上角.posotion屬性有4個取值.由於static為默認的方式。所以實際上可用的值只有3個 為了方便閱讀~
以下統稱為:固定(fixed)、相對(relative)、 絕對(absolute).
第1:固定定位(fixed)
固定定位可以讓某一元素固定在屏幕的某個位置.其效果和背景的background-attachment:fixed屬性相似!但是IE6以及更早的版本不支持.所以以下例子請在非IE6以下浏覽器下浏覽
例子:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
第2:相對定位(relative)
相對定位是依據設置定位屬性的4個方向上的任意值來實現相對與其本來在文檔中正常顯示的位置的偏移;
當相對定位的元素偏移出其本來的文檔流的位置:其他元素仍然認為那個位置為其的邏輯文檔流區域.而不會去補上去,雖然我們感官上認為那裡是沒有東西的~
例子:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
其中第2個色塊就是相對於其本來的文檔流中的位置依據left:10px;top:20px;的定位屬性值進行偏移.
其後面的第3個色塊依然認為前面的空白(就是第3的原本的文檔流的位置)為第3個色塊的文檔流區域 則不會自動填充上去.
當相對定位的父元素出現滾動條時,IE浏覽器的特殊情況
例子:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
當相對定位的父元素有滾動條的時候,該相對定位元素再IE的表現很詭異(其後面的元素依然認為那個位置為該元素的默認位置,而表現出相對定位的特性,但是拉動滾動條時,在FF下正常即相對定位的元素和文檔一起滾動,但是在IE系列裡面,相對定位的色塊依然在原地不動,此時元素的特性有點像絕對定位)
當相對定位同時擁有定位屬性的4個方向的值和margin屬性。相對定位的定位屬性 top right bottom left和margin-top margin-right margin-bottom margin-left;各個方向上一至的時候其值會產生疊加效果,而按照方向執行疊加後的數值的偏移
例子:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
第3:絕對定位(absolute)
當元素設置絕對定位後.則會從正常的文檔流中脫離.其後面的元素會完全忽視這個絕對定位的元素.就好像正常文檔流中不存在這個元素一樣.然後根據離其最近的一個具有position屬性的父對象的邊緣為定位基點(如果沒有沒有這樣一個父對象 那麼默認依據窗口元素定位),根據設置定位屬性的4個方向的值來實現絕對的定位布局.
例子:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
我們可以看到.當色塊2設置絕對定位之後.後面的第3色塊忽視其存在,自動填補到正常的文檔流中(這個是根據窗口元素定位)
我們再來看一下IE中依據窗口元素定位的一個特殊情況
例子:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
此DEMO與position:absolute的定位工作方式無關~只是作為IE中特殊的情況列出來
除了上面的基本的position:absolute特點,其還有下面幾點;
1.如果我們只設置了position:absolute而沒有設置定位屬性的4個方向值的話.那麼該絕對定位的元素依然遵循其在文檔流中的正常位置,它仍然受前一元素的文檔流位置影響,按照正常文檔流進行布局。只不過現在是從正常的文檔流中抽出.其後面的元素會忽視其存在.而自動補上去.因為絕對定位的元素是不占文檔流的布局空間的。
例子:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
例子中第2個紅色的色塊就是一個只具有position:absolute屬性的元素,它仍然在正常的布局位置呈現,只不過後面的元素會忽視其存在
2.絕對定位會自動把一個元素轉化為塊元素
例子:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
按照標准的渲染方式.行間元素設置的寬度和高度是被忽略的,但是當給元素絕對定位之後,該元素會具有塊元素的特性,而可以設置寬度和高度(雖然絕對定位的元素不占布局空間)
3.在IE下沒有設置定位屬性4個方向的值的絕對定位的塊元素的表現是inline-block 再FF下其是block
例子:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
這個其實是浏覽器的差異,在FF下在塊元素擁有position:absolute屬性後,其依然作為一個塊元素,而相對於前面的文檔流而換行,所以為了統一,在這種使用情況下,可以加上display:inline即可保證各個浏覽器統一
4.絕對定位元素依據其定位基點進行絕對定位時會忽視其定位基點的padding空間
例子:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
圖中的紅色區域是一個高度和寬度為500px且padding:100px;因為絕對定位元素忽視其定位基點的padding屬性,所以在頂部呈現
5.設置任何一個方向的定位屬性.該絕對元素除該方向按照定位屬性的值依據其具有position屬性最近的父元素為基點進行定位.其另外方向上的邏輯位置依然受前一文檔流中的元素影響.按照正常的位置進行布局:
例子:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
我們可以看到圖中的紅色區域,除按照left:40這個屬性偏移40像素後,其垂直方向的位置依然為正常文檔流中的位置
6.當元素設置為絕對定位後改元素內的浮動會自動清除
例子:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
7.當絕對定位同時擁有定位屬性和margin屬性、絕對定位的的定位屬性 top right bottom left和margin-top margin-right margin-bottom margin-left;各個方向上一至的時候其值會產生疊加效果,而按照方向執行疊加後的數值的偏移
例子:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
我們會發現這個紅色的色塊距離左邊200PX.left+margin-left
小結:
當元素同時擁有浮動和絕對定位時.絕對定位的優先權大於浮動.因為浮動受文檔的邏輯結構位置限制。而絕對定位不會。
所以當絕對定位脫離文檔流,絕對定位的元素不受浮動影響.即float:left會失效,
數學上我們知道.X軸上一個數值 Y軸上的一個數值即可確定一個點,感官上left right屬於x軸bottom top屬於Y軸。
我們完全可以設置一個無寬度和高度絕對定位的元素同時擁有top right bottom left來實現其根據其參考的定位基點的父元素的的大小來自適應大小.
但是IE6不支持.IE6只能識別left的值而忽視right.所以下面例子請在非IE6以及一下浏覽器浏覽
例子:
運行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運行]
實際應用:(個人的習慣)