文檔流,指的是元素排版布局過程中,元素會自動從左往右,從上往下的流式排列。并最終窗體自上而下分成一行行,并在每行中按從左到右的順序排放元素。脫離文檔流即是元素打亂了這個排列,或是從排版中拿走。
讓元素脫離文檔流的方法有:浮動和定位。
CSS定位方式有四種:默認定位(static)、相對定位(relative)、絕對定位(absolute)和固定定位(fixed)
static:默認值。沒有定位,元素在正常的流中,top,right,bottom,left和z-index屬性無效。示例如下:
relative:生成相對定位的元素,通過top,bottom,left,right的位置相對于其正常位置進行定位。其中的相對指的是相對于元素在默認流中的位置。
注意:
1.將元素position屬性設置為relative之后,再通過top,bottom,left,right屬性對其進行相對于原來位置的偏移;
2.元素偏移之后,他本來在默認文檔流中占據的位置仍然存在,其緊挨其后的元素的定位依據它本來的位置定位;
3.該元素偏移之后,可能存在覆蓋其他元素的情況,可以使用z-index屬性顯示層級有限級別。
示例:
第二個盒子元素相對于之前的位置(虛線部分)向下平移了20px,向右平移了30px。
要想使第三個塊級元素被遮擋的部分浮現出來,我們可以使用如下代碼實現:
注意:使用z-index必須保證元素的樣式中含有定位方式,之前忘了給box3添加定位方式,導致z-index對box3不起作用。
absolute:生成絕對定位的元素,相對于static定位外的第一個父元素進行定位。
注意:
1.絕對定位的元素已經脫離了文檔流,普通流中其他元素的布局就像絕對元素不存在一樣;
2.絕對定位的元素的位置是相對于最近的已定位的祖先元素,如果元素沒有已定位的祖先元素,它的位置就相對于body;
3.絕對定位的框可以覆蓋頁面的其他元素。
示例:
這種情況是離box2最近的父元素已定位的情況,如果離box2最近的父元素沒有定位的話,示例如下:
fixed:本質上是一種絕對定位,不為元素預留空間。通過指定相對于屏幕視窗的位置來指定元素的空間,且元素的位置在屏幕滾動時不會發生變化。應用于很多網站頂端的固定導航、右下角的固定廣告等等。
示例:
absolute偏移的參考點是:相對于最近的已定位的父元素,如果沒有,則相對于body元素;
relative偏移的參考點是:相對于元素在普通流中的原來位置;
fixed偏移的參考點是:相對于瀏覽器窗口。
z-index屬性用于設置節點的堆疊順序,擁有更高堆疊順序的節點將顯示在堆疊順序較低的節點前面。
使用方法:示例
1.z-index僅對定位元素有效(position:relative||absolute||fixed);
2.z-index只可比較同級元素
position:relative和負margin都可以使元素位置發生偏移,二者的區別表現在:
負margin會使元素在文檔流中的位置發生偏移,它會放棄偏移之前占據的空間,緊挨其后的元素會填充這部分空間;
相對定位后元素位置發生偏移,它仍會堅守原來占據的空間,不會讓文檔流的其他元素流入。
示例:
可以使用絕對定位和負margin,示例:
浮動元素的特征有:
1.塊在一排顯示;
2.內聯元素支持寬高;
3.無論是塊元素還是內聯元素,沒有寬度時默認內容撐開寬度;
4.脫離文檔流;
5.提升層級半級。
對其他浮動元素的影響:后浮動的元素永不會超過先浮動元素的頂端。
對普通元素的影響:浮動元素會從文檔正常流中刪除,使得緊挨它的元素位置發生偏移,影響布局。
對文字的影響:浮動元素向下延伸時,不會影響正常文本的顯示,文本會相對于浮動元素進行偏移。但部分文本背景會被浮動元素遮住。(可參考大話FLOAT)
浮動示例:
清除浮動指的是:在非IE瀏覽器(如Firefox)下,當容器的高度為auto,且容器的內容中有浮動(float為left或right)的元素,在這種情況下,容器的高度不能自動伸長以適應內容的高度,使得內容溢出到容器外面而影響布局的現象,為了防止這個現象的出現而進行的CSS處理,就叫CSS清除浮動。
清除浮動的方法:
1.使用帶clear屬性的空元素
在浮動元素后使用一個空元素如 <p class="clear"></p>
,并在CSS中賦予 .clear{clear:both;}
屬性即可清理浮動。亦可使用 <br class="clear" />
或 <hr class="clear" />
來進行清理。
2.使用CSS的overflow屬性
給浮動元素的容器添加overflow:hidden;或overflow:auto;可以清除浮動,另外在 IE6 中還需要觸發 hasLayout ,例如為父元素設置容器寬高或設置 zoom:1。
3.使用CSS的:after偽元素
附加:關于使用clear:both清除浮動,一直都不太明白,還有就是對清除浮動的理解有誤,以為清除浮動之后,元素的渲染順序和普通流一樣,實際不是這樣的,下面給出我自己的理解,不足之處,歡迎大家批評指正。
關于浮動
如下代碼中:
在父容器中添加一個背景圖片,圖片會按照普通流渲染
若是在此基礎上給背景圖片添加浮動,效果如下:
我們可以看到父元素高度塌陷,背景圖片脫離文檔流,所以此時父容器p補給高度了,讓我們給父容器添加點文字看看它的高度變化
父容器的高度被撐開了,有木有!有木有!
所以子元素浮動使得父元素塌陷的原因是:因為沒有預先設置p高度,所以p高度由其包含的子元素高度決定。而浮動脫離文檔流,所以圖片并不會被計算高度。此時的p中,相當于p中子元素高度為0。
一個困擾我很久的問題,和大家分享下,上代碼吧:
我不理解的點是:為什么情況二中box2的寬度比情況一中box2的寬度大,情況二中的box2可以浮動上去,而情況一中的不可以呢?
答案是:因為情況一中寬度限制100px,所以box2文字不能靠右圍繞,所以只能往下。 對于情況2,因為寬度為200px,所以box2在這個寬度內可以圍繞box1
關于clear:both 的理解:
Clear:both;其實就是利用清除浮動來把外層的p撐開,所以有時候,我們在將內部p都設置成浮動之后,就會發現,外層p的背景沒有顯示,原因就是外層的p沒有撐開,太小,所以能看到的背景僅限于一條線。
示例如下:
關于CSS浮動、定位的知識先說這么多,有什么不足的地方歡迎大家指正。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com