【正視CSS 08】巔峰對武之float你為什么要坍塌我的元素!!!


前言

事情還要回答一個月前,當時寒冬老師搞了一道position的面試題,我當時有幸給看到了,而且正是我要去外地的那天。

於是我那天上午便開始入魔了,寫完了博客才急急忙忙上飛機:

各位周末結束后都累了吧,那我們一起來看看【寒冬】的面試題吧(據說阿里的喲)

當時只是草草的回答了那道題,卻沒想到今天會再拿出來說事!對的,我還是搞不懂為什么float會導致元素坍塌!!!!

近期狀況

我CSS的名師是:張鑫旭(自認入門的)

最近引導者:寒冬

我CSS方面的東西除了之前的積累,基本來源於此兩人,各位可以關注下。

多數知識來源於張鑫旭,寒冬讓我把整個知識串了起來,雖然素不相識,在此謝過了。

引出問題

我最近一直在思考float實現的原理。
我最開始根據各種學習后產生了一個認識,float破壞了行內框inline boxes
從而導致塊級元素坍塌,因為塊級元素的高是line-height撐起來的,而line-height又來源於line boxes。
但是最近學習了BFC后,知道float觸發了bfc,導致其獨立了出來,所以元素被包裹了,這也是overflow清楚浮動的原理。
那么float到底做了些什么事情呢???

雖然我昨天病了,這個問題卻在腦中揮之不去,所以今天搞完js后,覺得還是有必要深究一下。

不研究就算了,一研究又發現一個高手,好像是前端觀察,只不過我不認識罷了。。。我這里也不管他是誰了,開始今天的學習吧。

clear:none=>閉合浮動

關於這個問題,我其實也必將迷糊的,因為我在用自己形成的CSS世界觀解釋問題時候一說到清楚浮動就感覺奇怪!

clear對應屬性:left, right, both, none
按道理說clear: none才是清除浮動啦

所以我們這里為他取名閉合浮動較為合理。而且他也解釋了為什么overflow可以導致坍陷消失。

haslayout與block formatting contexts

IE7以下特有的layout以及BFC再次光臨了,我都不知道最近有多少次提到他了。

通過之前我們的學習(清除浮動的具體例子我這里就不管了),想要解決高度塌陷的問題無非兩種方案:

① 在浮動元素末尾加上clear: both 屬性,強制其閉合元素

② 設置overflow或者display: table屬性觸發BFC(這里寒冬老師有不同的認識,他認為對名詞觸發不合適),從而解決坍塌問題。

關於BFC(現在他換了個馬甲叫做flow root),大家應該相對熟悉了。

我的理解是所有normal flow的元素皆處於同一BFC,float元素處於一個BFC,每個絕對定位單獨一個BFC

PS:此處有誤請提出來

我們的BFC可以解決上外邊距疊加,可以強制包含float元素,通俗點說:

BFC就是一個獨立的盒子,里面的子元素不會再布局上影響外面元素,BFC依然屬於普通流

overflow閉合浮動的真相便是:

父級元素擁有了新的BFC,具有BFC的塊級元素可以包含浮動!

以上好像是官方定義了,再往下面挖就沒意思了。

IE6/7中沒有BFC這個概念,其自身實現的haslayout基本等同於BFC。

所以我們在IE6/7中閉合浮動時候要加上一句,zoom: 1的屬性觸發haslayout

真相到此為止?

以上就是追尋后得到的真相,雖然我還是不太滿意,雖然我還有點迷迷糊糊但是暫時這樣吧,在今后一段時間里面,我還會再回來回看這個問題。

屆時,我希望自己能找到自己想要的答案。

意外之喜

此次找尋答案過程中雖然沒有完全得到我想要的答案,卻意外得到了其它東西,他的名字便是inline-block。

對的,你沒有看錯,我要說的就是inline-block!

其實我們還是很喜歡人雲亦雲的,比如說我就一直認為IE7之前沒有inline-block這個屬性,其實這是大錯特錯的!

 1 <html xmlns="http://www.w3.org/1999/xhtml">
 2 <head>
 3     <title></title>
 4     <style type="text/css">
 5         span { height: 100px; border: 1px solid black; }
 6         .ib { display: inline-block; }
 7     </style>
 8 </head>
 9 <body>
10     <span class="ib">葉小釵</span> <span>葉小釵</span> <span class="ib">葉小釵</span>
11 </body>
12 </html>

以上是標准瀏覽器,我們來看看我們的IE7:

大家看到了,雖然中間那塊有問題,但是我們的inline-block是沒有問題的!!!

其中中間那個家伙的底邊沒有了,大家知道是為什么的(layout)。

以上是行內元素,我們來看看塊級元素的表現。

 1 <html xmlns="http://www.w3.org/1999/xhtml">
 2 <head>
 3     <title></title>
 4     <style type="text/css">
 5         div { height: 100px; border: 1px solid black; *zoom: 1 }
 6         .ib { display: inline-block; }
 7     </style>
 8 </head>
 9 <body>
10     <div class="ib">
11         葉小釵</div>
12     <div class="ib">
13         葉小釵</div>
14     <div>
15         葉小釵</div>
16 </body>
17 </html>

我們來看看IE7的表現:

這家伙直接沒有理我啊!!!所以說,並不是inline-block沒有,而只是對塊級元素的支持有問題罷了,所以我們對於塊級元素需要這么干:

 1 <html xmlns="http://www.w3.org/1999/xhtml">
 2 <head>
 3     <title></title>
 4     <style type="text/css">
 5         div { height: 100px; border: 1px solid black;  }
 6         .ib { display: inline-block; *zoom: 1; *display: inline; }
 7     </style>
 8 </head>
 9 <body>
10     <div class="ib">
11         葉小釵</div>
12     <div class="ib">
13         葉小釵</div>
14     <div>
15         葉小釵</div>
16 </body>
17 </html>

雖然他們之間的間隔卻沒有了,卻達到了我們的目標。問題又來了:

inline-block為什么會有莫名的間隔?

注意看圖的朋友應該看到了,inline-block元素在現代瀏覽器中有間隔,我搞了很久查詢確實是有!

這是因為默認情況下inline元素之間就有間隔(IE7不會有間隔)!

 1 <html xmlns="http://www.w3.org/1999/xhtml">
 2 <head>
 3     <title></title>
 4     <style type="text/css">
 5         div { height: 100px; border: 1px solid black; margin: 0; display: inline;  }
 6     </style>
 7 </head>
 8 <body>
 9     <div class="ib">
10         葉小釵</div>
11     <div class="ib">
12         葉小釵</div>
13     <div>
14         葉小釵</div>
15 </body>
16 </html>


 

IE7

這個問題你抓破頭發都不會知道原因!!!

因為塊級元素搞成inline的時候,在編輯器中換號了,瀏覽器認為換行就是一個空格,所以將他們寫到一起吧!囧

 

此處我不再糾結下去了,附上抄來的解決空隙的代碼:

 1 .dib-wrap {
 2     font-size:0;/* 所有瀏覽器 */
 3     *word-spacing:-1px;/* IE6、7 */
 4 }
 5 .dib-wrap .dib{
 6     font-size: 12px;
 7     letter-spacing: normal;
 8     word-spacing: normal;
 9     vertical-align:top;
10 }
11 @media screen and (-webkit-min-device-pixel-ratio:0){
12 /* firefox 中 letter-spacing 會導致脫離普通流的元素水平位移 */
13      .dib-wrap{
14             letter-spacing:-5px;/* Safari 等不支持字體大小為 0 的瀏覽器, N 根據父級字體調節*/
15     }
16 }
17 .dib {
18     display: inline-block;
19     *display:inline;
20     *zoom:1;
21 }

結語

咳咳,其實我病了。。。我養傷去了,剛剛求妹子頂就有個兄弟踩了我下,現在求兄弟頂好吧。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM