什么是clearfix (一文搞清楚css清除浮動clearfix)
什么是 clearfix ?
clearfix 是一種 CSS 技巧,可以在不添加新的 html 標簽的前提下,解決讓父元素包含浮動的子元素的問題。這個技巧的版本是很多的,最流行的一個是 Micro Clearfix Hack 。這個也是 Bootstrap 采用的方案(可以 google 一下 “bootstrap clearfix” 來查看詳情)。
Micro Clearfix Hack 的作者給出的原始方案,內容如下:
/**
* For modern browsers
* 1. The space content is one way to avoid an Opera bug when the
* contenteditable attribute is included anywhere else in the document.
* Otherwise it causes space to appear at the top and bottom of elements
* that are clearfixed.
* 2. The use of `table` rather than `block` is only necessary if using
* `:before` to contain the top-margins of child elements.
*/
.cf:before,
.cf:after {
content: " "; /* 1 */
display: table; /* 2 */
}
.cf:after {
clear: both;
}
/**
* For IE 6/7 only
* Include this rule to trigger hasLayout and contain floats.
*/
.cf {
*zoom: 1;
}
但是我的習慣是支持到 IE9+ ,同時習慣了用 “ clearfix ” 作為 class 名,所有稍微修改后的版本如下:
.clearfix:before,
.clearfix:after {
content: " ";
display: table;
}
.clearfix:after {
clear: both;
}
百度用的代碼
.clearfix:after{content:'\20';display:block;height:0;clear:both}
.clearfix{zoom:1}
.clear{clear:both;height:0;line-height:0;font-size:0;visibility:hidden;overflow:hidden}
腳本之家用的
.clear{clear: both;overflow: hidden;line-height: 0;height: 0;zoom:1}
.clear:after {display: block; height: 0px; visibility: hidden; clear: both; content: ""}
.clearfix{ *zoom:1;}
.clearfix:before,
.clearfix:after {content: ".";display: block;height: 0;overflow: hidden;visibility: hidden;}
.clearfix:after{clear: both}
用了這個方法很長時間之后,都覺得上面的代碼就是天書,尤其是對 display: table 這一行不理解。其實,這些代碼為的是解決兩個實際中經常遇到,而且非常讓人惱火的問題。問題搞清楚了,代碼也就明白了。
自清除子元素浮動
-
先說第一個問題和解決方案。
-
div 布局的一個非常讓新手頭疼的問題就是,如果一個父元素中包含若干個子元素,那么當給所有的子元素都設置了浮動( e.g float: left ),那么父元素的高度就會為0。
比如有這樣的 html 代碼:
<div class="container"> <div class="item">1</div> <div class="item">2</div> </div>
如果子元素沒有浮動,那么顯示是這樣的:

但是一旦所有子元素都浮動了,那么父元素的高度變?yōu)?,就成了這樣的惡心效果:

解決方法如下:
html 中添加 clearfix
<div class="container clearfix"> <div class="item">1</div> <div class="item">2</div> </div>
如果只是解決這個問題,那么下面的代碼就夠了。
.clearfix:after {
content: " ";
display: block;
clear: both;
}
但是注意,文章開始的代碼中使用 display: table 而不是這里的 display: block ,可以同樣解決這個問題。但是,下面這個問題中使用 display: table 就是必須的了。
Margin Collapse 外邊距重疊問題
再來說第二個問題。
外邊距重疊也是一個很讓人討厭的問題。來描述一下癥狀。
container 之中包含一個 item 子元素,代碼如下
<div class="container">
<div class="item">
item
</div>
</div>
比如默認顯示成這樣:

這時,我給 item 加了 margin-top: 30px ,本來這時候我期待的結果是,item 塊本身應該距離 container 青色區(qū)域的上邊界 30px 。同時一個副作用是青色區(qū)域應該拉高 30px 。但是實際上得到的卻是下面的效果:

造成這個的原因是,父子元素的 margin-top 是會重疊的,即使是像上面的情況中,父元素 container 自身 margin-top 為 0 的情況下也一樣。這樣造成的一個現(xiàn)象就是父元素“包不住”子元素的 margin-top ,溢出了。類似的問題也會發(fā)生在 margin-bottom 身上。
要解決這個問題,就要給 container 添加 clearfix ,html 代碼如下
<div class="container clearfix">
<div class="item">
item
</div>
</div>
如果只是針對這一種問題,最簡單的 clearfix 實現(xiàn)是這樣:
.clearfix:before,
.clearfix:after
{
content: " ";
display: table;
}
注意,display: table 換成 dispaly: block 是不行的。
效果圖

完整測試代碼腳本的家專門提供
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.header{margin:0 auto;width:660px;color:white;font-size:18px;text-align:center;background-color:#fa1698;width:660px;height:70px;line-height:70px}
.container{margin:0 auto;width:660px;color:white;font-size:18px;text-align:center;background-color:#1a8081;}
.item{background-color:#fa653e;width:70px;height:70px;line-height:70px;margin-top: 30px}
.clearfix:before,
.clearfix:after
{
content: " ";
display: table;
}
.clearfix{zoom:1}
.clear{clear:both;height:0;line-height:0;font-size:0;visibility:hidden;overflow:hidden}
</style>
</head>
<body style="text-align:center;">
<div class="header">
header
</div>
<div class="container clearfix">
<div class="item">
item
</div>
</div>
</body>
</html>
當然,外邊距重疊不局限于上面的父子元素之間,也會發(fā)生在兄弟元素之間,甚至是一個高度為 0 的元素,自己的上下邊距也會重疊,這個就是 MDN Margin Collapse 文檔上給出的全部三種情況,但是后兩種在實際開發(fā)中不會帶來很大麻煩,也不是咱們的 clearfix 方法所關心的。
結語
上面兩個問題的解決代碼合并到一起,就是文章最初 Peter 給出的 clearfix 代碼了。 有了這個方法,當給子元素添加浮動或者是 margin 的時候,父元素的行為就非常符合正常的預期了,開發(fā)頁面布局變得非常簡單,所以 clearfix 方法對于按照 div 的 block 模型排版是非常有用的。
下面分享一段當前比較常用的代碼
.clearfix:after{content:'\20';display:block;height:0;clear:both}
.clearfix{zoom:1}
.clear{clear:both;height:0;line-height:0;font-size:0;visibility:hidden;overflow:hidden}
但是,順便提一下,未來 flexbox 會大行其道,flexbox 模型的特點是,不用 float ,并且子元素的 margin 也不會和父元素重疊。
到此這篇關于什么是clearfix (一文搞清楚css清除浮動clearfix)的文章就介紹到這了,更多相關什么是clearfix內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持腳本之家!
相關文章
- 下面小編就為大家?guī)硪黄猚ss之clearfix的用法深入理解(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,祝大家游戲愉快哦2023-05-12
- 下面小編就為大家?guī)硪黄獪\談css清除浮動(clearfix 和clear)的用法,小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考,一起跟隨小編過來看看吧2023-05-12
- 這篇文章主要介紹了CSS中使用clearfix清除浮動的方法,作者列出了幾個clearfix的不同的使用方法進行對比,需要的朋友可以參考下2015-07-09
用clearfix:after消除css浮動解決外部div不能撐開問題
如果有一個DIV作為外部容器,內部的DIV如果設置了float樣式,則外部的容器DIV因為內部沒有clear,導致不能被撐開。使用clearfix:after,可以解決這個問題2014-06-16- 大家對css中clearfix并不陌生吧,它的作用就是清除浮動,下面對clearfix的定義及實現(xiàn)原理簡要的為大家做個介紹,另外還有個不錯的示例,喜歡的朋友不要錯過2013-11-05
css清除浮動clearfix:after的用法詳解(附完整代碼)
如果外部有一個div容器,其內部div容器設置了float樣式,則外部的容器div因為內部沒有clear,導致不能撐開2023-05-12- 有時候我們需要清楚浮動的一些操作,這里介紹的是clearfix:after的實例代碼,需要的朋友可以參考下2023-05-12
- 本文主要講解下css中的清除浮動的使用,在網頁布局中此屬性的作用不可小視,它的存在對你的布局好壞有所影響,感興趣的朋友可以參考下哈2013-04-26
overflow:hidden line-height clearfix:after使用方法介紹
overflow:hidden的作用是隱藏溢出,line-height指的是在DIV中的元素上下居中接下來詳細介紹它們的用法,感興趣的朋友可以了解下哦2013-01-08

