1. 程式人生 > >CSS深入理解之float浮動

CSS深入理解之float浮動

1、什麼是 CSS Float(浮動)?

       CSS 的 Float(浮動),會使元素向左或向右移動,其周圍的元素也會重新排列。Float(浮動),往往是用於影象,但它在佈局時一樣非常有用。CSS float 屬性定義元素在哪個方向浮動,浮動元素會生成一個塊級框,直到該塊級框的外邊緣碰到包含框或者其他的浮動框為止。

2、浮動的原始意義?

       我們使用float浮動做了很多其本職工作以外的事情,於是我們會混淆,我們會回看不清float真正的面目。浮動真正的意義在哪裡呢?要知道這個問題的答案很簡單,假設現在CSS中沒有浮動(float)屬性,那麼會變成一個什麼樣子。我們會發現,目前流行採用浮動方法實現的無論是分欄佈局,還是列表排列我們都可以用其他一些CSS屬性(不考慮table

)代替實現,唯一一個實現不了的就是“文字環繞圖片”,我是想不出來能有什麼方法可以讓文字環繞圖片顯示。好,這個替代不了的作用才是float真正的意義所在。所以,請記住,浮動出現的意義其實只是用來讓文字環繞圖片而已,僅此而已

3、元素怎樣浮動?

       元素的水平方向浮動,意味著元素只能左右移動而不能上下移動。一個浮動元素會盡量向左或向右移動,直到它的外邊緣碰到包含框或另一個浮動框的邊框為止。浮動元素之後的元素將圍繞它。浮動元素之前的元素將不會受到影響。

float的可能值為:left或right或none。

  • left - 使左邊緣接觸包含塊的左邊緣或另一浮動塊的右邊緣。
  • right - 使右邊緣接觸包含塊的右邊緣或另一浮動塊的左邊緣。
  • none - 元素不浮動。

預設情況下,浮動元素將堆疊在一起。

clear屬性清除堆疊。

它指定浮動元素的一個或兩個邊緣必須不與另一個浮動元素的邊緣鄰接。

其可能的值為:

  • left - 元素的左邊緣可能不與另一個浮動元素鄰接。
  • right - 元素的右邊緣可能不與另一個浮動元素鄰接。
  • both - 兩邊都不能與另一個浮動元素鄰接。
  • none - 元素不被清除,並且任一邊緣可以鄰接另一個浮動元素

4、浮動的“破壞性”?

       文字之所以會環繞含有float屬性的圖片是因為浮動破壞了正常的line boxes。由於line boxes的高度是由其內部最高的inline boxes的高度決定的,所以這裡line boxes的高度就是圖片的高度。此時圖片與文字是同一box型別的元素(都是inline boxes),是在同一行上的,所以,預設狀態下,一張圖片只能與一行文字對齊。而要想讓一張圖片要與多行文字對齊,唯一能做的就是破壞正常的line boxes模型。正常情況下,圖片自身就是個inline boxes,與兩側的文字inline boxes共同組成了line boxes,但是,一旦圖片加入了浮動,情況就完全變了。我認為是浮動徹底破壞了img

圖片的inline boxes特性,至少有一點我可以肯定,圖片的inline boxes不存在了,一旦圖片失去了inline boxes特性就無法與inline boxes的文字排在一行了,其會從line boxes上脫離出來,跟隨自身的方位屬性,靠邊排列。這種狀態跟限制性內切酶起作用幾乎一致,一條基因鏈上(line boxes)有很多的基因(inline boxes),然後限制性內切酶(float)會切除特定的DNA序列,此序列(float元素)就會從基因鏈上脫離出來。

       浮動破壞了圖片的inline box,產生了兩個結果:一是圖片無法與文字同行顯示,脫離了其原來所在的line box鏈;二是沒有了高度(無inline box -> 無line box -> 無高度)。而這些結果恰恰是文字環繞圖片顯示所必須的。

5、解決高度塌陷的問題 – 清除浮動

高度塌陷:高度塌陷是指當容器內包含浮動元素,容器並未像如同這些元素不浮動般的自動擴充套件延伸。在文件流中,父元素的高度預設是被子元素撐開的, 也就是子元素多高,父元素就多高。但是當為子元素設定浮動以後,子元素會完全脫離文件流,此時將會導致子元素無法撐起父元素的高度,導致父元素的高度塌陷。由於父元素的高度塌陷了,則父元素下的所有元素都會向上移動,這樣將會導致頁面佈局混亂。  所以在開發中一定要避免出現高度塌陷的問題,  我們可以將父元素的高度寫死,以避免塌陷的問題出現, 但是一旦高度寫死,父元素的高度將不能自動適應子元素的高度,所以這種方案是不推薦使用的。

解決方案一:根據W3C的標準,在頁面中元素都有一個隱含的屬性叫做Block Formatting Context , 簡稱BFC,該屬性可以設定開啟或者關閉,預設是關閉的。當開啟元素的BFC以後,元素將會具有如下的特性:

i.父元素的垂直外邊距不會和子元素重疊

ii.開啟BFC的元素不會被浮動元素所覆蓋

iii.開啟BFC的元素可以包含浮動的子元素 

如何開啟元素的BFC ?

i.設定元素浮動 ,使用這種方式開啟,雖然可以撐開父元素,但是會導致父元素的寬度丟失 而且使用這種方式也會導致下邊的元素上移,不能解決問題 。

ii.設定元素絕對定位。

iii.設定元素為inline-block ,可以解決問題,但是會導致寬度丟失,不推薦使用這種方式 。

iv.將元素的overflow設定為一個非visible的值。

推薦方式:將overflow設定為hidden是副作用最小的開啟BFC的方式。 但是在IE6及以下的瀏覽器中並不支援BFC,所以使用這種方式不能相容IE6。在IE6中雖然沒有BFC,但是具有另一個隱含的屬性叫做hasLayout,該屬性的作用和BFC類似,所在IE6瀏覽器可以通過開hasLayout來解決該問題 。開啟方式很多,我們直接使用一種副作用最小的: 直接將元素的zoom設定為1即可 。zoom表示放大的意思,後邊跟著一個數值,寫幾就將元素放大幾倍。zoom:1表示不放大元素,但是通過該樣式可以開啟hasLayout。zoom這個樣式,只在IE中支援,其他瀏覽器都不支援。

  <body>        
      <div class="box1">
            <div class="box2"></div>
       </div>        
       <div class="box3"></div>        
   </body>
 .box1{
      border: 10px red solid;
      zoom:1;
      overflow: hidden;              
   }
            
 .box2{
      width: 100px;
      height: 100px;
      background-color: blue;
      float: left;            
    }
            
 .box3{
      height: 100px;
      background-color: yellow;
 }

解決方案二:可以直接在高度塌陷的父元素的最後,新增一個空白的div,由於這個div並沒有浮動,所以他是可以撐開父元素的高度的,然後在對其進行清除浮動,這樣可以通過這個空白的div來撐開父元素的高度, 基本沒有副作用 。使用這種方式雖然可以解決問題,但是會在頁面中新增多餘的結構。

 <body>
     <div class="box1">
       <div class="box2"></div>
       <div class="clear"></div>
     </div>
</body>
.box1{
     border: 1px solid red;
   }
.box2{
     width: 100px;
     height: 100px;
     background-color: blue;
     float: left;
    }
.clear{
     clear:both; 
}

解決方案三:可以通過after偽類向元素的最後新增一個空白的塊元素,然後對其清除浮動,這樣做和新增一個div的原理一樣,可以達到一個相同的效果,而且不會在頁面中新增多餘的div,這是我們最推薦使用的方式,幾乎沒有副作用。 在IE6中不支援after偽類, 所以在IE6中還需要使用hasLayout來處理。

<body>
    <div class="box1">
        <div class="box2"></div>
    </div>
</body>
  .box1{
       border: 1px solid red;
       }    
 
  .box2{
        width: 100px;
        height: 100px;
        background-color: blue;         
        float: left;
         }
           
   .clearfix:after{
        /*新增一個內容*/
         content: "";
        /*轉換為一個塊元素*/
         display: block;
        /*清除兩側的浮動*/
         clear: both;
        /*設為不可見*/
         visibility: hidden;
         height:0;
         }
         
    .clearfix{
          zoom:1;
         }

6、float與JavaScript

JavaScript可以改變CSS的屬性,其他些屬性還好,但是這個float值得一說,為何呢,因為float貌似是JavaScript中的一個關鍵字,不能使用obj.style.float="left";這樣的句子。得使用其他寫法。

IE瀏覽器:obj.style.styleFloat = "left";

其他瀏覽器:obj.style.cssFloat = "left";