CSS 定位 (Positioning) 屬性容許你對元素進行定位。css
CSS 爲定位和浮動提供了一些屬性,利用這些屬性,能夠創建列式佈局,將佈局的一部分與另外一部分重疊,還能夠完成多年來一般須要使用多個表格才能完成的任務。瀏覽器
定位的基本思想很簡單,它容許你定義元素框相對於其正常位置應該出現的位置,或者相對於父元素、另外一個元素甚至瀏覽器窗口自己的位置。顯然,這個功能很是強大,也很讓人吃驚。要知道,用戶代理對 CSS2 中定位的支持遠勝於對其它方面的支持,對此不該感到奇怪。工具
另外一方面,CSS1 中首次提出了浮動,它以 Netscape 在 Web 發展初期增長的一個功能爲基礎。浮動不徹底是定位,不過,它固然也不是正常流佈局。咱們會在後面的章節中明確浮動的含義。佈局
div、h1 或 p 元素經常被稱爲塊級元素。這意味着這些元素顯示爲一塊內容,即「塊框」。與之相反,span 和 strong 等元素稱爲「行內元素」,這是由於它們的內容顯示在行中,即「行內框」。spa
您可使用 display 屬性改變生成的框的類型。這意味着,經過將 display 屬性設置爲 block,可讓行內元素(好比 <a> 元素)表現得像塊級元素同樣。還能夠經過把 display 設置爲 none,讓生成的元素根本沒有框。這樣的話,該框及其全部內容就再也不顯示,不佔用文檔中的空間。代理
可是在一種狀況下,即便沒有進行顯式定義,也會建立塊級元素。這種狀況發生在把一些文本添加到一個塊級元素(好比 div)的開頭。即便沒有把這些文本定義爲段落,它也會被看成段落對待:code
<div> some text <p>Some more text.</p> </div>
在這種狀況下,這個框稱爲無名塊框,由於它不與專門定義的元素相關聯。blog
塊級元素的文本行也會發生相似的狀況。假設有一個包含三行文本的段落。每行文本造成一個無名框。沒法直接對無名塊或行框應用樣式,由於沒有能夠應用樣式的地方(注意,行框和行內框是兩個概念)。可是,這有助於理解在屏幕上看到的全部東西都造成某種框。圖片
CSS 有三種基本的定位機制:普通流、浮動和絕對定位。ip
除非專門指定,不然全部框都在普通流中定位。也就是說,普通流中的元素的位置由元素在 (X)HTML 中的位置決定。
塊級框從上到下一個接一個地排列,框之間的垂直距離是由框的垂直外邊距計算出來。
行內框在一行中水平佈置。可使用水平內邊距、邊框和外邊距調整它們的間距。可是,垂直內邊距、邊框和外邊距不影響行內框的高度。由一行造成的水平框稱爲行框(Line Box),行框的高度老是足以容納它包含的全部行內框。不過,設置行高能夠增長這個框的高度。
在下面的章節,咱們會爲您詳細講解相對定位、絕對定位和浮動。
經過使用 position 屬性,咱們能夠選擇 4 種不一樣類型的定位,這會影響元素框生成的方式。
position 屬性值的含義:
提示:相對定位實際上被看做普通流定位模型的一部分,由於元素的位置相對於它在普通流中的位置。
CSS 定位屬性容許你對元素進行定位。
屬性 | 描述 |
---|---|
position | 把元素放置到一個靜態的、相對的、絕對的、或固定的位置中。 |
top | 定義了一個定位元素的上外邊距邊界與其包含塊上邊界之間的偏移。 |
right | 定義了定位元素右外邊距邊界與其包含塊右邊界之間的偏移。 |
bottom | 定義了定位元素下外邊距邊界與其包含塊下邊界之間的偏移。 |
left | 定義了定位元素左外邊距邊界與其包含塊左邊界之間的偏移。 |
overflow | 設置當元素的內容溢出其區域時發生的事情。 |
clip | 設置元素的形狀。元素被剪入這個形狀之中,而後顯示出來。 |
vertical-align | 設置元素的垂直對齊方式。 |
z-index | 設置元素的堆疊順序。 |
設置爲相對定位的元素框會偏移某個距離。元素仍然保持其未定位前的形狀,它本來所佔的空間仍保留。
相對定位是一個很是容易掌握的概念。若是對一個元素進行相對定位,它將出如今它所在的位置上。而後,能夠經過設置垂直或水平位置,讓這個元素「相對於」它的起點進行移動。
若是將 top 設置爲 20px,那麼框將在原位置頂部下面 20 像素的地方。若是 left 設置爲 30 像素,那麼會在元素左邊建立 30 像素的空間,也就是將元素向右移動。
#box_relative { position: relative; left: 30px; top: 20px; }
以下圖所示:
注意,在使用相對定位時,不管是否進行移動,元素仍然佔據原來的空間。所以,移動元素會致使它覆蓋其它框。
設置爲絕對定位的元素框從文檔流徹底刪除,並相對於其包含塊定位,包含塊多是文檔中的另外一個元素或者是初始包含塊。元素原先在正常文檔流中所佔的空間會關閉,就好像該元素原來不存在同樣。元素定位後生成一個塊級框,而不論原來它在正常流中生成何種類型的框。
絕對定位使元素的位置與文檔流無關,所以不佔據空間。這一點與相對定位不一樣,相對定位實際上被看做普通流定位模型的一部分,由於元素的位置相對於它在普通流中的位置。
普通流中其它元素的佈局就像絕對定位的元素不存在同樣:
#box_relative { position: absolute; left: 30px; top: 20px; }
以下圖所示:
絕對定位的元素的位置相對於最近的已定位祖先元素,若是元素沒有已定位的祖先元素,那麼它的位置相對於最初的包含塊。
對於定位的主要問題是要記住每種定位的意義。因此,如今讓咱們複習一下學過的知識吧:相對定位是「相對於」元素在文檔中的初始位置,而絕對定位是「相對於」最近的已定位祖先元素,若是不存在已定位的祖先元素,那麼「相對於」最初的包含塊。
註釋:根據用戶代理的不一樣,最初的包含塊多是畫布或 HTML 元素。
提示:由於絕對定位的框與文檔流無關,因此它們能夠覆蓋頁面上的其它元素。能夠經過設置 z-index 屬性來控制這些框的堆放次序。
浮動的框能夠向左或向右移動,直到它的外邊緣碰到包含框或另外一個浮動框的邊框爲止。
因爲浮動框不在文檔的普通流中,因此文檔的普通流中的塊框表現得就像浮動框不存在同樣。
請看下圖,當把框 1 向右浮動時,它脫離文檔流而且向右移動,直到它的右邊緣碰到包含框的右邊緣:
再請看下圖,當框 1 向左浮動時,它脫離文檔流而且向左移動,直到它的左邊緣碰到包含框的左邊緣。由於它再也不處於文檔流中,因此它不佔據空間,實際上覆蓋住了框 2,使框 2 從視圖中消失。
若是把全部三個框都向左移動,那麼框 1 向左浮動直到碰到包含框,另外兩個框向左浮動直到碰到前一個浮動框。
以下圖所示,若是包含框太窄,沒法容納水平排列的三個浮動元素,那麼其它浮動塊向下移動,直到有足夠的空間。若是浮動元素的高度不一樣,那麼當它們向下移動時可能被其它浮動元素「卡住」:
在 CSS 中,咱們經過 float 屬性實現元素的浮動。
浮動框旁邊的行框被縮短,從而給浮動框留出空間,行框圍繞浮動框。
所以,建立浮動框可使文本圍繞圖像:
要想阻止行框圍繞浮動框,須要對該框應用 clear 屬性。clear 屬性的值能夠是 left、right、both 或 none,它表示框的哪些邊不該該挨着浮動框。
爲了實現這種效果,在被清理的元素的上外邊距上添加足夠的空間,使元素的頂邊緣垂直降低到浮動框下面:
這是一個有用的工具,它讓周圍的元素爲浮動元素留出空間。
讓咱們更詳細地看看浮動和清理。假設但願讓一個圖片浮動到文本塊的左邊,而且但願這幅圖片和文本包含在另外一個具備背景顏色和邊框的元素中。您可能編寫下面的代碼:
.news { background-color: gray; border: solid 1px black; } .news img { float: left; } .news p { float: right; } <div class="news"> <img src="news-pic.jpg" /> <p>some text</p> </div>
這種狀況下,出現了一個問題。由於浮動元素脫離了文檔流,因此包圍圖片和文本的 div 不佔據空間。
如何讓包圍元素在視覺上包圍浮動元素呢?須要在這個元素中的某個地方應用 clear:
不幸的是出現了一個新的問題,因爲沒有現有的元素能夠應用清理,因此咱們只能添加一個空元素而且清理它。
.news { background-color: gray; border: solid 1px black; } .news img { float: left; } .news p { float: right; } <div class="news"> <img src="news-pic.jpg" /> <p>some text</p> </div>.clear { clear: both; }<div class="clear"></div>
這樣能夠實現咱們但願的效果,可是須要添加多餘的代碼。經常有元素能夠應用 clear,可是有時候不得不爲了進行佈局而添加無心義的標記。
不過咱們還有另外一種辦法,那就是對容器 div 進行浮動:
.news { background-color: gray; border: solid 1px black; } .news img { float: left; } .news p { float: right; } <div class="news"> <img src="news-pic.jpg" /> <p>some text</p> </div>float: left;
這樣會獲得咱們但願的效果。不幸的是,下一個元素會受到這個浮動元素的影響。爲了解決這個問題,有些人選擇對佈局中的全部東西進行浮動,而後使用適當的有意義的元素(經常是站點的頁腳)對這些浮動進行清理。這有助於減小或消除沒必要要的標記。