咱們在平常代碼生活中,或多或少會利用浮動來佈局,例如導航佈局,以下圖所示:html
可是,咱們在實現的時候,常常會遇到父元素「塌陷」以及清除浮動問題。例如瀏覽器
<!DOCTYPE html> <head> <title>Float</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style> *{ margin:0; padding:0; } ul { border:1px solid pink; } li { width:100px; height:100px; margin-left:10px; background:green; float:left; list-style-type:none; } .div1 { width:100px; height:100px; background:black; } </style> </head> <body> <ul> <li></li> <li></li> </ul> <div class="div1"></div> </body> </html>
上圖中的子元素(綠色),就沒有被父元素(粉紅色的線條)包裹住,這就是塌陷問題。上圖中的黑色div本該在兩個綠色下方,但如今倒是這樣,這就是沒有清除浮動帶來的問題。ide
咦,那浮動這個東東,怎麼會如此壞的呢?!!佈局
其實,也不怪人家,原本float的設計初衷就不是用在佈局,而是文字環繞,無奈,被用在了佈局上。優化
強扭的瓜不甜嘛,不過也解渴。ui
針對它的特性對症下藥就行了,哈哈哈。spa
浮動框不屬於文檔中的普通流,當一個元素浮動以後,不會影響到塊級框的佈局而只會影響內聯框(一般是文本)的排列,文檔中的普通流就會表現得和浮動框不存在同樣,當浮動框高度超出包含框的時候,也就會出現包含框不會自動伸高來閉合浮動元素(「高度塌陷」現象)。顧名思義,就是漂浮於普通流之上,像浮雲同樣,可是隻能左右浮動。 正是由於浮動的這種特性,致使本屬於普通流中的元素浮動以後,包含框內部因爲不存在其餘普通流元素了,也就表現出高度爲0(高度塌陷)。設計
好了,瞭解了它的要點,就開始對症下藥了哦,哈哈哈。3d
常規的解決方法就是利用clear來清除浮動,以及浮動帶來的塌陷問題。code
<!DOCTYPE html> <head> <title>Float</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style> *{ margin:0; padding:0; } ul { border:1px solid pink; } li { width:100px; height:100px; margin-left:10px; background:green; float:left; list-style-type:none; } .div1 { width:100px; height:100px; background:black; } </style> </head> <body> <ul> <li></li> <li></li> <!--在尾部加入一個帶有clear的塊級元素--> <div style="clear:both;"></div> </ul> <div class="div1"></div> </body> </html>
運行代碼,效果圖見下:
這樣作目的是達到了,可是它是向頁面中添加內容來達到效果的,破壞告終構以及毫無語義。
由此,咱們引入僞元素來解決這樣的問題。PS:修改的代碼中,引入了Nicolas Gallagher大師的代碼。
<!DOCTYPE html> <head> <title>Float</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style> *{ margin:0; padding:0; } ul { border:1px solid pink; } /*用after僞元素,向ul追加一個清除浮動元素*/ ul:after { content:''; display:table; clear:both; } li { width:100px; height:100px; margin-left:10px; background:green; float:left; list-style-type:none; } .div1 { width:100px; height:100px; background:black; } </style> </head> <body> <ul> <li></li> <li></li> </ul> <div class="div1"></div> </body> </html>
啊哈,真是這樣的。
But,:after?!!IE六、7尼瑪又不支持它。
是哈,咱們再來想辦法看看怎麼優化優化。
因爲IE六、7有個hasLayout,這個hasLayout是麼子東西呢,當hasLayout屬性值爲false的時候,元素的尺寸和位置就由最近擁有佈局的祖先控制;當爲true時,會達到與BFC相似的效果。因此咱們能夠利用這一點解決IE六、7對:after的藐視。。
利用zoom來觸發IE六、7是一個比較通用的作法,因此咱們結合zoom和after,就獲得了一個相對靠譜的解決方案了。
代碼以下:
/*hack手段針對IE六、7*/ .fix { *zoom:1; } /*大衆瀏覽器*/ .fix:after { content:""; display:table; clear:both; }
修改上面的demo代碼以下:
<!DOCTYPE html> <head> <title>Float</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style> *{ margin:0; padding:0; } ul { border:1px solid pink; /*hack手段觸發IE六、7的haslayout*/ *zoom:1; } /*用after僞元素,向ul追加一個清除浮動元素*/ ul:after { content:''; display:table; clear:both; } li { width:100px; height:100px; margin-left:10px; background:green; float:left; list-style-type:none; } .div1 { width:100px; height:100px; background:black; } </style> </head> <body> <ul> <li></li> <li></li> </ul> <div class="div1"></div> </body> </html>