天天看點

CSS之關于clearfix--清除浮動

一,什麼是.clearfix

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

.clearfix:after {

 content: " ";

 display: block;

 clear: both;

 height: 0;

}

.clearfix {

 zoom: 1;

<div class="clearfix">

 <div class="floated"></div>

</div>

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

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

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

<div>

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

二,.clearfix的弊端

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

<!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 {

     padding: 0 1em;

     margin: 0 1em 0 0;

     background: #ccc;

   .placeholder {

     background: yellow;

     height: 400px;

 </style>

</head>

<body>

 <div class="left-col">

 </div>

 <div class="right-col">

   <ul class="menu">

     <li>Menu Item</li>

   </ul>

   <div class="placeholder"></div>

</body>

</html>

上面的代碼構成一個兩列布局的頁面。注意.menu這個菜單設定了邊框,但是由于.menu的li元素是左浮動的,導緻.menu沒有高度,于是可以用.clearfix來清除.menu内部的浮動。代碼如下:

<ul class="menu clearfix">

 <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。

 display: table;

四,總結

在IE6,

7下面隻要是觸發了hasLayout的元素就可以清除内部浮動了。而在标準浏覽器下面清除元素内部浮動的方法有很多,除

了.clearfix:after這種方式,其餘的方法無非就是産生新的Block Formatting

Context以達到目的。如果可以做到在什麼條件下用哪種方法,我認為這樣就足夠了......

本文轉自:http://www.missage.com/1220.html

原文連結:http://www.45eggs.com/xhtml-css/2011/css-clearfix.html