理解CSS中的浮動

浮動(float)是CSS中一個重要的定位及布局屬性,float 屬性可以接受以下幾個值:

  • none :元素不浮動,默認值。
  • left :將元素浮動到容器左側。
  • right:將元素浮動到容器右側。
  • inherit:元素繼承其父元素的浮動方向。

注意:浮動的元素會自動添加display: block。

什么是浮動

要理解什么是浮動,可以參考傳統的印刷設計。在傳統印刷布局中,可以設置圖片被文字環繞。如下所示:

傳統印刷布局

在傳統頁面布局軟件(例如MS Word)中,文本框可以設置是否要文字環繞。如果忽略文字環繞,圖片會被認為脫離了文本流,這時文字會穿過圖片,好像圖片并不存在。

網頁布局

在網頁設計中,設置了浮動的元素就好像傳統印刷布局中設置了文字環繞的圖片。和絕對定位元素不同,浮動元素雖然脫離了正常的文檔流,但并沒有脫離文本流,意思是正常文檔流中的塊級元素會按照浮動元素不存在一樣排列,但是文本并不會和浮動元素重疊。

與之相對,絕對定位元素完全脫離了頁面的文檔流和文本流,類似傳統印刷中忽略文字環繞的情況。絕對定位的元素不會影響其他元素的位置也不會受其他元素的影響。下面是一個浮動前后對比的例子:

圖 | 浮動前:

浮動前

圖 | 浮動后:

浮動后

浮動的框可以向左或向右移動,直到它的外邊緣碰到包含框或另一個浮動框的邊框為止。

浮動布局

除了實現簡單的文字環繞效果,浮動還能夠用來做整個頁面的布局,如下所示:

頁面布局

除此之外,相對于絕對定位元素,使用浮動元素可以使布局更加靈活,例如下面這個使用浮動布局的名片,當照片尺寸發生變化時,右側的文字會自適應重新布局,不影響整體顯示效果:

浮動布局

然而如果使用絕對定位的照片,雖然初始的顯示效果是相同的,但是當照片尺寸變化時,文字就可能被遮擋,顯然這種布局的靈活性并不好,如下所示:

絕對定位布局

清除浮動

說到浮動就不能不提它的兄弟屬性clearclear 屬性指定:一個元素是緊挨著前面的浮動元素,還是必須移動到它們的下面。CSS屬性既可以用于浮動元素,也可以用于非浮動元素。

當應用于非浮動元素時,它將元素的邊框邊界移動到所有相關浮動元素外邊界的下方,這時候外邊距塌陷不起作用。

當應用于浮動元素時,它將元素的外邊界移動到所有相關浮動元素外邊界的下方。這會影響后面浮動元素的布局,后面的浮動元素的位置無法高于它之前的元素。

圖 | 清除浮動前

清除浮動前

上面這個例子中, sidebar浮動到了右側,并且其長度小于正文容器。如果footer也設置了浮動,就可能出現如上圖所示的情況。為了避免這種情況出現,需要用到清除浮動,使footer移動到所有浮動元素的下方。

圖 | 清除浮動后

清除浮動后

這里為footer設置的是clear: bothclear屬性有四個可能的參數,最常用的就是both,會清除兩個方向的浮動。使用leftright可以清除相應方向上的浮動。none 是默認值,inherit表示該元素繼承其父元素的clear屬性的值。

容器的塌陷問題

使用浮動時遇到的一個很棘手的問題是浮動對容器的影響。如果容器內除了浮動元素外沒有其他元素,那么它的高度就會塌陷為0。如果父元素背景透明的話,這種塌陷并不容易被覺察到,如下所示:

容器的塌陷

如果想避免容器的塌陷,可以將容器浮動(形成塊級格式上下文),或者在浮動元素和容器尾部之間設置清除浮動,后者可以通過偽元素 :after實現:

#container:after {
 content: "";
 display: block;
 clear: both;
}

清除浮動的技巧

在一些復雜的情況下,需要一些特別的方法來清除浮動。

  • 使用空的DIV元素
    顧名思義,就是在需要清除浮動的位置放置一個空的div。
<div style="clear:both;"></div>
  • 設置overflow
    通過為父元素設置overflowautohidden可以使父元素將浮動元素包含在內,避免了浮動元素對之后元素的影響。這個方法的原理也是形成了塊級格式上下文。

  • 利用偽類:after
    利用偽類:after可以實現清除浮動的目的,只需要為容器添加一個類,如"clearfix",然后定義如下css樣式:

.clearfix:after { 
    content: "";
    visibility: hidden;
    display: block;
    height: 0;
    clear: both
}

舉個例子說明,例如以下一組色塊:

圖 | 清除浮動前

清除浮動前

如果想實現每一行一種顏色的效果,有兩種策略:

  • 為每種顏色的四個色塊外套一層div,然后為div設置 overflowautohidden,或像上面提到的利用偽類 :after。

  • 在每種顏色的最后一個色塊后面添加一個空的div,并為其設置 clear: both。

最后的效果如下:

圖 | 清除浮動后

清除浮動后

參考文獻

[1] float
[2] clear
[3] CSS 浮動

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,814評論 1 92
  • relative:生成相對定位的元素,通過top,bottom,left,right的位置相對于其正常位置進行定位...
    zx9426閱讀 969評論 0 2
  • CSS中的float屬性簡介 幾乎所有會WEB前端開發的同學都知道CSS中有一個float屬性用于實現HTML元素...
    歐陽大哥2013閱讀 2,846評論 5 26
  • 浮動(float),一個利于布局又影響布局的屬性,先看下w3c上的解釋 A float is a box that...
    蔥油澆蛋閱讀 941評論 0 1
  • 攝于2017年2月19日,剛開學的時候,還記得在火車上認識了一個學姐,我搬著沉重的行李一步一步挪在火車車道里挪移,...
    喬帥閱讀 472評論 0 1