清除浮动的方式

在CSS规范中,浮动定位不属于正常的页面流(page flow),是独立定位的。所以,只含有浮动元素的父容器,在显示时不考虑子元素的位置,就当它们不存在一样。这就造成了父容器好像空容器一样。

如图:

解决浮动的方法##

方法一、

手动设置父元素的高度为合适的值,达到撑起父元素的效果。这种方法的优点是简单、代码少、容易掌握;但是,只适合高度固定的布局,要给出精确的高度。如果高度和父级div不一样时,会产生问题。

方法二、

浮动父元素。索性将父容器也改成浮动定位,这样它就可以带着子元素一起浮动。这种方法不用修改HTML代码,但是缺点在于父容器变成浮动以后,会影响到后面元素的定位,而且有时候,父容器是定位死的,无法变成浮动。

方法三、

利用clear:both属性。在浮动元素下方添加一个非浮动元素:<div style="clear: both">,或者以类名的方式添加.clearfixclearfix{clear:both}。原理是父容器现在必须考虑非浮动子元素的位置,而后者肯定出现在浮动元素下方,所以显示出来,父容器就把所有子元素都包括进去了。优点是简单、代码少、浏览器支持好、不容易出现怪问题;缺点是如果页面浮动布局多,就要增加很多空div。在页面中增加冗余标签,违背了语义网的原则。

方法四、

让父容器变得可以自动"清理"(clearing)子元素的浮动,从而能够识别出浮动子元素的位置,不会出现显示上的差错。用上overflow属性。这种方法的缺点主要有二个,一个是IE 6、7不支持,另一个是一旦子元素的大小超过父容器的大小,就会出显示问题。

图片截自:http://www.educity.cn/wenda/8490.html

解决ie6、7兼容问题,可以在父元素添加zoom: 1;属性

可以使用overflow属性的auto、scroll和hidden值来清除浮动。若内容太大,auto、scroll会出现滚动条,太丑了,但也保持了原有的内容;hidden会裁剪元素,超出元素框边界的内容不可见,并且不利于seo。

参考链接:深入理解CSS溢出overflow

方法五、

父元素定义 伪类:afterzoom

代码:

.clearfix::after{
    content: ' ';
    display: block;
    height: 0;
    visibility: hidden;
    clear: both;
}
.clearfix {
    *zoom: 1;
}

原理:类似于clear:both方法,利用:after在元素内部插入元素块,从而达到清除浮动的效果。

clearfix是父容器的class名称。
content:' ';是在父容器的开头或结尾处放一个空白字符。
display: block;确保这个空白字符是独立区块

ps:content: ''; display:block;对于FF/chrome/opera/IE8不能缺少,其中content()可以取值也可以为空。

height: 0;让所添加的空白字符为0高度
visibility:hidden;令浏览器渲染它,但是不显示。并且防止溢出
clear: both;清除浮动,让后面添加的子元素不找前面的左右浮动。

*zoom:1添加一条IE 6的独有命令,这条命令的作用是激活父元素的hasLayout属性,让父元素拥有自己的布局。IE 6会读取这条命令,其他浏览器则会直接忽略它。

IE使用Layout概念来控制元素的尺寸和位置。如果一个元素有Layout,它就有自身的尺寸和位置;如果没有,它的尺寸和位置由最近的拥有布局的祖先元素控制。

简而言之,*zoom:1是为了兼容IE6、7

终极版一、

Nicolas Gallagher贴出了更通用的生产代码。

/**
 * 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.
 */
.clearfix:before,
.clearfix:after {
    content: ' ';      /* 1 */
    display: table;    /* 2 */
}

.clearfix:after {
    clear: both;
}

/**
 * For IE 6/7 only
 * Include this rule to trigger hasLayout and contain floats.
 */
.clearfix {
    *zoom: 1;
}

content:' ';(注意内容字符串中的空格)避免了一个 Opera错误,

:before可以防止顶部边距在现代浏览器中崩溃。这有两个好处:它确保与其他浮动控制技术的视觉一致性,从而创建新的块格式化环境,例如, overflow:hidden;当使用IE 6/7*zoom:1时,它确保视觉一致性。

:after用于清除浮体。
因此,不需要隐藏任何生成的内容,并且减少所需代码的总量。

display:table会产生一些匿名盒子,这些匿名盒子的其中一个(display值为table-cell)会形成BFC。

BFC:即Block Formatting Context 直译为“块级格式化范围”。可以把它理解成是一个独立的容器,并且这个容器的里box的布局,与容器外部的毫不相干。BFC 具有普通容器没有的一些特性,例如可以包含浮动元素,上面的方法四(如 overflow 方法)就是触发了父元素的 BFC ,使到它可以包含浮动元素,从而防止出现高度塌陷的问题。

触发 BFC 的条件如下:

  • 浮动元素,float 除 none 以外的值
  • 绝对定位元素,position(absolute,fixed)
  • display 为以下其中之一的值 inline-blocks,table-cells,table-captions
  • overflow 除了 visible 以外的值(hidden,auto,scroll)

在 CSS3 中,BFC 叫做 Flow Root,并增加了一些触发条件:

  • display 的 table-caption 值
  • position 的 fixed 值,其实 fixed 是 absolute 的一个子类,因此在 CSS2.1 中使用这个值也会触发 BFC ,只是在 CSS3 中更加明确了这一点。

详见:
   详说清除浮动
   详说 Block Formatting Contexts (块级格式化上下文)

终极版二、

.clearfix:after { 
    content:"\200B"; 
    display:block; 
    height:0; 
    clear:both; 
} 
.clearfix {
    *zoom:1;    /*IE/7/6*/
}

:content:"\200B";Unicode字符里有一个“零宽度空格”,即 U+200B,代替原来的“.”,可以缩减代码量。而且不再使用visibility:hidden;

参考:
浮动元素容器的clearing问题
css清除浮动float的三种方法总结
深入理解CSS溢出overflow
A new micro clearfix hack
clearfix清除浮动进化史
详说 Block Formatting Contexts (块级格式化上下文)
详说清除浮动
关于Block Formatting Context--BFC和IE的hasLayout

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,725评论 1 92
  • 浮动,从诞生那天起,它就是个特别的属性——既为网页布局带来新的方法,却又随之产生一系列的问题。当然,随着时间的推移...
    郝特么冷阅读 828评论 0 6
  • 先看一个场景 HTML代码结构: CSS代码样式: 这里我没有给最外层的DIV.outer 设置高度,但是我们知道...
    元气满满321阅读 361评论 0 2
  • 这篇文章极好,以至于让我受益良多,就一字没有改动的转发过来一丝冰凉老师的文章 需要注意的是,display:tab...
    新晋小牛牛阅读 1,037评论 0 2
  • 金岭绿叠云漫漫 竹林深处隐阑干 谁家老媪急春事 烟雨一簑不惧寒
    白云老愚阅读 158评论 0 1