如何清除浮動

本文概述

本文的框架圖如下:

image

一、浮動到底是什么?

W3school中給出的浮動定義為<b>浮動的框可以向左或向右移動,直到它的外邊緣碰到包含框或另一個浮動框的邊框為止。</b>由于浮動框脫離文檔的普通流中,所以文檔的普通流中的塊框表現(xiàn)得就像浮動框不存在一樣。


css浮動

二、浮動有什么特點?

浮動的特點,可以用八個字總結(jié):脫標(biāo)、貼邊、字圍和收縮。

為了更好說明,請看下圖:
當(dāng)框 1 向左浮動時,它脫離文檔流(脫標(biāo))并且向左移動(貼邊),直到它的左邊緣碰到包含框的左邊緣。因為它不再處于文檔流中,所以它不占據(jù)空間,實際上覆蓋住了框 2,使框 2 從視圖中消失。如果框2中有文字,就會圍著框1排開(字圍)。

如果把所有三個框都向左浮動,那么框 1 向左浮動直到碰到包含框,另外兩個框向左浮動直到碰到前一個浮動框。


CSS 浮動實例 - 向左浮動的元素

下面著重講解下第四個特點--收縮

一個浮動的內(nèi)聯(lián)元素(比如span img標(biāo)簽)不需要設(shè)置display:block就可以設(shè)置寬度。

<style>
        div{
            float: left;
            background-color: greenyellow;
        }
    </style>
</head>
<body>
<div>
    這是一段文字
</div>
</body>

得到以下的效果:


image

我們都知道div標(biāo)簽是塊級元素,會獨占一行,然而上面的例子中將div設(shè)置為左浮后,其寬度不再是占滿一行,而是收緊為內(nèi)部元素的寬度,這就是浮動第四個特征的含義。

三、浮動有什么缺點?

先看下面這段代碼:

  <style>
      .parent{
          border: solid 5px;
          width:300px;
      }
      .child:nth-child(1){
          height: 100px;
          width: 100px;
          background-color: yellow;
          float: left;
      }
      .child:nth-child(2){
          height: 100px;
          width: 100px;
          background-color: red;
          float: left;
      }
      .child:nth-child(3){
          height: 100px;
          width: 100px;
          background-color: greenyellow;
          float: left;
      }
    </style>
</head>
<body>
<div class="parent">
    <div class="child"></div>
    <div class="child"></div>
    <div class="child"></div>
</div>
</body>

我們想讓父容器包裹著三個浮動元素,然而事與愿違,得到卻是這樣的結(jié)果:


父容器高度塌陷

這就是浮動帶來副作用----父容器高度塌陷,于是清理浮動就顯著至關(guān)重要。

四、如何清理浮動?

清除浮動不是不用浮動,清除浮動產(chǎn)生的父容器高度塌陷。

套路1:給浮動元素的父元素添加高度(擴(kuò)展性不好)

如果一個元素要浮動,那么它的父元素一定要有高度。高度的盒子,才能關(guān)住浮動??梢酝ㄟ^直接給父元素設(shè)置height,實際應(yīng)用中我們不大可能給所有的盒子加高度,不僅麻煩,并且不能適應(yīng)頁面的快速變化;另外一種,父容器的高度可以通過內(nèi)容撐開(比如img圖片),實際當(dāng)中此方法用的比較多。

套路2:clear:both;

在最后一個子元素新添加最后一個冗余元素,然后將其設(shè)置clear:both,這樣就可以清除浮動。這里強(qiáng)調(diào)一點,即在父級元素末尾添加的元素必須是一個塊級元素,否則無法撐起父級元素高度

    <div id="wrap">
        <div id="inner"></div>
        <div style="clear: both;"></div>
    </div>
    #wrap{
          border: 1px solid;
    }
    #inner{
          float: left;
          width: 200px;
          height: 200px;
          background: pink;
    }

套路3:偽元素清除浮動

上面那種辦法固然可以清除浮動,但是我們不想在頁面中添加這些沒有意義的冗余元素,此時如何清除浮動嗎?
結(jié)合 :after 偽元素和 IEhack ,可以完美兼容當(dāng)前主流的各大瀏覽器,這里的 IEhack 指的是觸發(fā) hasLayout。

<div id="wrap" class="clearfix">
    <div id="inner"></div>
</div>
      #wrap {
        border: 1px solid;
      }
      #inner {
        float: left;
        width: 200px;
        height: 200px;
        background: pink;
      }
      /*開啟haslayout*/
      .clearfix {
        *zoom: 1;
      }
      /*ie6 7 不支持偽元素*/
      .clearfix:after {
        content: '';
        display: block;
        clear: both;
        height:0;
        line-height:0;
        visibility:hidden;//允許瀏覽器渲染它,但是不顯示出來
      }

給浮動元素的父容器添加一個clearfix的class,然后給這個class添加一個:after偽元素,實現(xiàn)元素末尾添加一個看不見的塊元素來清理浮動。這是通用的清理浮動方案,推薦使用

套路4:給父元素使用overflow:hidden;

這種方案讓父容器形成了BFC(塊級格式上下文),而BFC可以包含浮動,通常用來解決浮動父元素高度坍塌的問題。

<b>BFC的觸發(fā)方式</b>

我們可以給父元素添加以下屬性來觸發(fā)BFC:

  • float 為 left | right

  • overflow 為 hidden | auto | scorll

  • display 為 table-cell | table-caption | inline-block

  • position 為 absolute | fixed

這里可以給父元素設(shè)置overflow:auto,但是為了兼容IE最好使用overflow:hidden。

但這種辦法有個缺陷:如果有內(nèi)容出了盒子,用這種方法就會把多的部分裁切掉,所以這時候不能使用。

BFC的主要特征:

  • BFC容器是一個隔離的容器,和其他元素互不干擾;所以我們可以用觸發(fā)兩個元素的BFC來解決垂直邊距折疊問題。

  • BFC不會重疊浮動元素

  • BFC可以包含浮動,這可以清除浮動。

套路5:br標(biāo)簽清浮動

br標(biāo)簽存在一個屬性:clear。這個屬性就是能夠清除浮動的利器,在br標(biāo)簽中設(shè)置屬性clear,并賦值all。即能清除掉浮動。

    <div id="wrap">
      <div id="inner"></div>
      <br clear="all" />
    </div>
      #wrap {
        border: 1px solid;
      }
      #inner {
        float: left;
        width: 200px;
        height: 200px;
        background: pink;
      }

本文于2018.11.9重新修改,如果對你有些許幫助,歡迎在我的GitHub博客點贊和關(guān)注,感激不盡!

參考文章

br清浮動的原理與clear:both的兼容

清浮動 | 如何清除浮動

CSS-清除浮動

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補...
    _Yfling閱讀 14,104評論 1 92
  • 在非IE瀏覽器(如Firefox)下,當(dāng)容器的高度為auto,且容器的內(nèi)容中有浮動(float為left或righ...
    Maggie_77閱讀 1,670評論 1 3
  • relative:生成相對定位的元素,通過top,bottom,left,right的位置相對于其正常位置進(jìn)行定位...
    zx9426閱讀 1,070評論 0 2
  • 浮動,從誕生那天起,它就是個特別的屬性——既為網(wǎng)頁布局帶來新的方法,卻又隨之產(chǎn)生一系列的問題。當(dāng)然,隨著時間的推移...
    郝特么冷閱讀 907評論 0 6
  • 1.浮動元素有什么特征?對父容器、其他浮動元素、普通元素、文字分別有什么影響? 何謂浮動元素?有什么特征?所謂浮動...
    草鞋弟閱讀 921評論 0 1

友情鏈接更多精彩內(nèi)容