首頁 > web前端 > css教學 > CSS關於clearfix清除浮動方法

CSS關於clearfix清除浮動方法

高洛峰
發布: 2017-03-17 16:26:10
原創
1833 人瀏覽過

一,什麼是.clearfix

你只要到Google或Baidu隨便一搜"css清除浮動",就會發現很多網站都講到"盒子清除內部浮動時可用到.clearfix"。

1

2

3

4

5

6

7

8

9

10

11

.clearfix:after {

  content: " ";

  display: block;

  clear: both;

  height: 0;

}

.clearfix {

  zoom: 1;

}<p class="clearfix">

  <p class="floated"></p>

</p>

登入後複製

上面的程式碼是.clearfix的定義和應用,簡單的說下.clearfix的原理:

1、在IE6, 7下zoom: 1會觸發hasLayout,從而使元素閉合內部的浮動。

2、在標準瀏覽器下,.clearfix:after這個偽類會在應用到.clearfix的元素後面插入一個clear: both的塊級元素,從而達到清除浮動的作用。

1

2

3

4

<p>

  <p class="floated"></p>

</p>

<p style="clear: both"></p>

登入後複製

二,.clearfix的弊端

在上面的程式碼中可以看到,拋開IE6, 7不談,.clearfix在標準瀏覽器下插入了一個clear: both的元素,這樣很可能清除掉不必要的浮動。舉例來說明:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

<!DOCTYPE html>

<html>

<head>

  <title>Demo</title>

  <style type="text/css">

    html, body { padding: 0; margin: 0; }

    ul { margin: 0; padding: 0; }

   

    .clearfix:after {

      content: " ";

      display: block;

      clear: both;

      height: 0;

    }

    .clearfix {

      zoom: 1;

    }

   

    .left-col {

      background: red;      float: left;

      width: 100px;

      height: 300px;

    }

    .right-col {

      margin-left: 100px;

    }

    .menu {

      border: 1px solid #000;

    }

    .menu li {      float: left;

      display: block;

      padding: 0 1em;

      margin: 0 1em 0 0;

      background: #ccc;

    }

    .placeholder {

      background: yellow;

      height: 400px;

    }  </style>

</head>

<body>

  <p class="left-col">

  </p>

  <p class="right-col">

    <ul class="menu">

      <li>Menu Item</li>

      <li>Menu Item</li>

      <li>Menu Item</li>

      <li>Menu Item</li>

      <li>Menu Item</li>

      <li>Menu Item</li>

    </ul>

    <p class="placeholder"></p>

  </p>

</body>

</html>

登入後複製

上面的程式碼構成一個兩列佈局的頁面。注意.menu這個選單設定了邊框,但是由於.menu的li元素是左浮動的,導致.menu沒有高度,於是可以用.clearfix來清除.menu內部的浮動。程式碼如下:

1

2

3

4

5

6

7

8

<ul class="menu clearfix">

  <li>Menu Item</li>

  <li>Menu Item</li>

  <li>Menu Item</li>

  <li>Menu Item</li>

  <li>Menu Item</li>

  <li>Menu Item</li>

</ul>

登入後複製

但是應用完.clearfix後,在標準瀏覽器下頁面變得很亂,這是因為.clearfix:after把.left-col的浮動也給清除掉了。

三,重構.clearfix

在遭遇到上面的錯誤之後,分析一下除了.clearfix:after這種方式之外還有沒有別的方法清除元素內部的浮動。答案是有的,在白話Block Formatting Contexts這篇文章中提到過構成Block Formatting Context的元素可以清除內部元素的浮動。那就只要讓.clearfix形成Block Formatting Context就好了。構成Block Formatting Context的方法有以下幾種:

  • float的值不為none。

  • overflow的值不為visible。

  • display的值為table-cell, table-caption, inline-block中的任何一個。

  • position的值不為relative和static。

很明顯,float和position不合適我們的需求。那隻能從overflow或display中選取一個。因為是應用了.clearfix和.menu的菜單極有可能是多級的,所以overflow: hidden或overflow: auto也不滿足需求(會把下拉的菜單隱藏掉或者出滾動條),那麼只能從display下手。

我們可以將.clearfix的display值設為table-cell, table-caption, inline-block中的任何一個,但是display: inline-block會產生多餘空白,所以也排除掉。剩下的只有table-cell, table-caption,為了確保相容可以用display: table來使.clearfix形成一個Block Formatting Context,因為display: table會產生一些匿名盒子,這些匿名盒子的其中一個(display值為table-cell)會形成Block Formatting Context。這樣我們新的.clearfix就會閉合內部元素的浮動。下面是重構之後的.clearfix。

1

2

3

4

5

.clearfix {

  zoom: 1;

  display: table;

  width: 100%;

}

登入後複製

四,總結

在IE6, 7下面只要是觸發了hasLayout的元素就可以清除內部浮動了。而在標準瀏覽器下面清除元素內部浮動的方法有很多,除了.clearfix:after這種方式,其餘的方法無非就是產生新的Block Formatting Context以達到目的。如果可以做到在什麼條件下用哪種方法,我認為這樣就足夠了......

更多CSS之關於clearfix清除浮動方法相關文章請關注PHP中文網!

相關文章:

深入解析clearfix清除浮動

css之clearfix的用法深入理解

#淺談css清除浮動clearfix和clear的用法介紹

#整理的最全的css clearfix清除浮動的方法

#
相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板