什么是clearfix (一文搞清楚css清除浮動(dòng)clearfix)

什么是 clearfix ?
clearfix 是一種 CSS 技巧,可以在不添加新的 html 標(biāo)簽的前提下,解決讓父元素包含浮動(dòng)的子元素的問題。這個(gè)技巧的版本是很多的,最流行的一個(gè)是 Micro Clearfix Hack 。這個(gè)也是 Bootstrap 采用的方案(可以 google 一下 “bootstrap clearfix” 來查看詳情)。
Micro Clearfix Hack 的作者給出的原始方案,內(nèi)容如下:
/** * 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; }
但是我的習(xí)慣是支持到 IE9+ ,同時(shí)習(xí)慣了用 “ 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}
用了這個(gè)方法很長時(shí)間之后,都覺得上面的代碼就是天書,尤其是對 display: table 這一行不理解。其實(shí),這些代碼為的是解決兩個(gè)實(shí)際中經(jīng)常遇到,而且非常讓人惱火的問題。問題搞清楚了,代碼也就明白了。
自清除子元素浮動(dòng)
-
先說第一個(gè)問題和解決方案。
-
div 布局的一個(gè)非常讓新手頭疼的問題就是,如果一個(gè)父元素中包含若干個(gè)子元素,那么當(dāng)給所有的子元素都設(shè)置了浮動(dòng)( e.g float: left ),那么父元素的高度就會(huì)為0。
比如有這樣的 html 代碼:
<div class="container"> <div class="item">1</div> <div class="item">2</div> </div>
如果子元素沒有浮動(dòng),那么顯示是這樣的:
但是一旦所有子元素都浮動(dòng)了,那么父元素的高度變?yōu)?,就成了這樣的惡心效果:
解決方法如下:
html 中添加 clearfix
<div class="container clearfix"> <div class="item">1</div> <div class="item">2</div> </div>
如果只是解決這個(gè)問題,那么下面的代碼就夠了。
.clearfix:after { content: " "; display: block; clear: both; }
但是注意,文章開始的代碼中使用 display: table 而不是這里的 display: block ,可以同樣解決這個(gè)問題。但是,下面這個(gè)問題中使用 display: table 就是必須的了。
Margin Collapse 外邊距重疊問題
再來說第二個(gè)問題。
外邊距重疊也是一個(gè)很讓人討厭的問題。來描述一下癥狀。
container 之中包含一個(gè) item 子元素,代碼如下
<div class="container"> <div class="item"> item </div> </div>
比如默認(rèn)顯示成這樣:
這時(shí),我給 item 加了 margin-top: 30px ,本來這時(shí)候我期待的結(jié)果是,item 塊本身應(yīng)該距離 container 青色區(qū)域的上邊界 30px 。同時(shí)一個(gè)副作用是青色區(qū)域應(yīng)該拉高 30px 。但是實(shí)際上得到的卻是下面的效果:
造成這個(gè)的原因是,父子元素的 margin-top 是會(huì)重疊的,即使是像上面的情況中,父元素 container 自身 margin-top 為 0 的情況下也一樣。這樣造成的一個(gè)現(xiàn)象就是父元素“包不住”子元素的 margin-top ,溢出了。類似的問題也會(huì)發(fā)生在 margin-bottom 身上。
要解決這個(gè)問題,就要給 container 添加 clearfix ,html 代碼如下
<div class="container clearfix"> <div class="item"> item </div> </div>
如果只是針對這一種問題,最簡單的 clearfix 實(shí)現(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>
當(dāng)然,外邊距重疊不局限于上面的父子元素之間,也會(huì)發(fā)生在兄弟元素之間,甚至是一個(gè)高度為 0 的元素,自己的上下邊距也會(huì)重疊,這個(gè)就是 MDN Margin Collapse 文檔上給出的全部三種情況,但是后兩種在實(shí)際開發(fā)中不會(huì)帶來很大麻煩,也不是咱們的 clearfix 方法所關(guān)心的。
結(jié)語
上面兩個(gè)問題的解決代碼合并到一起,就是文章最初 Peter 給出的 clearfix 代碼了。 有了這個(gè)方法,當(dāng)給子元素添加浮動(dòng)或者是 margin 的時(shí)候,父元素的行為就非常符合正常的預(yù)期了,開發(fā)頁面布局變得非常簡單,所以 clearfix 方法對于按照 div 的 block 模型排版是非常有用的。
下面分享一段當(dāng)前比較常用的代碼
.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 會(huì)大行其道,flexbox 模型的特點(diǎn)是,不用 float ,并且子元素的 margin 也不會(huì)和父元素重疊。
到此這篇關(guān)于什么是clearfix (一文搞清楚css清除浮動(dòng)clearfix)的文章就介紹到這了,更多相關(guān)什么是clearfix內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
- 下面小編就為大家?guī)硪黄猚ss之clearfix的用法深入理解(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,祝大家游戲愉快哦2023-05-12
淺談css清除浮動(dòng)(clearfix和clear)的用法
下面小編就為大家?guī)硪黄獪\談css清除浮動(dòng)(clearfix 和clear)的用法,小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考,一起跟隨小編過來看看吧2023-05-12- 這篇文章主要介紹了CSS中使用clearfix清除浮動(dòng)的方法,作者列出了幾個(gè)clearfix的不同的使用方法進(jìn)行對比,需要的朋友可以參考下2015-07-09
用clearfix:after消除css浮動(dòng)解決外部div不能撐開問題
如果有一個(gè)DIV作為外部容器,內(nèi)部的DIV如果設(shè)置了float樣式,則外部的容器DIV因?yàn)閮?nèi)部沒有clear,導(dǎo)致不能被撐開。使用clearfix:after,可以解決這個(gè)問題2014-06-16css中clearfix清除浮動(dòng)的用法及其原理示例介紹
大家對css中clearfix并不陌生吧,它的作用就是清除浮動(dòng),下面對clearfix的定義及實(shí)現(xiàn)原理簡要的為大家做個(gè)介紹,另外還有個(gè)不錯(cuò)的示例,喜歡的朋友不要錯(cuò)過2013-11-05css清除浮動(dòng)clearfix:after的用法詳解(附完整代碼)
如果外部有一個(gè)div容器,其內(nèi)部div容器設(shè)置了float樣式,則外部的容器div因?yàn)閮?nèi)部沒有clear,導(dǎo)致不能撐開2023-05-12clear 萬能清除浮動(dòng)(clearfix:after)
有時(shí)候我們需要清楚浮動(dòng)的一些操作,這里介紹的是clearfix:after的實(shí)例代碼,需要的朋友可以參考下2023-05-12clearfix:after清除浮動(dòng)的用法及測試代碼
本文主要講解下css中的清除浮動(dòng)的使用,在網(wǎng)頁布局中此屬性的作用不可小視,它的存在對你的布局好壞有所影響,感興趣的朋友可以參考下哈2013-04-26overflow:hidden line-height clearfix:after使用方法介紹
overflow:hidden的作用是隱藏溢出,line-height指的是在DIV中的元素上下居中接下來詳細(xì)介紹它們的用法,感興趣的朋友可以了解下哦2013-01-08