浮动float最开始出现的意义是为了让文字环绕图片而已,但人们发现,若是想要三个块级元素并排显示,都给它们加个float来得会比较方便。css
若是想要实现三个块级元素并排显示,指望效果以下图所示: 浏览器
给三个块级元素都加上float属性后,页面效果以下图所示:布局
问题出现了,父元素高度塌陷了flex
一目了然:若是咱们给上面的三个绿颜色的方块设置display:inline-block也能达到让它们并排显示的效果。而且父元素的高度也不会塌陷。只不过没法控制是居左仍是居右,display:inline-block只能从左往右。spa
咱们说的清除浮动是指清除因为子元素浮动带来父元素高度塌陷的影响。code
清除浮动的两大基本方法:blog
clear:both;
1. 在父元素的最后加一个冗余元素并为其设置clear:both
图片
原理以下:
当添加了最后一个冗余元素(未设置clear:both)时;父元素和此冗余元素的高度都为0,而且三个浮动的元素都浮在了它们的上方盖住了它们(能够把它们当作PS中的图层)。如今,给这个冗余元素添加clear:both(clear属性介绍),它便要躲开这三个浮动元素,所以,一直往下跑,直到没有被浮动元素盖住才停下来。而父元素看到这个子元素跑开了,天然想要包裹住它。
实现:it
<div class="box">
<div class="div">1</div>
<div class="div">2</div>
<div class="clear"></div>
</div>
.box{ width:700px; margin:0 auto; border:2px solid green;} .div{ width:300px; height:200px; background:red; float:left;} .div{ width:300px; height:200px; background:red; float:left; margin-left: 10px;} .clear{ height:0px; clear:both; overflow: hidden;}
此方法的缺点是,必要在页面中添加不少没有意义的冗余元素,太麻烦,并且不符合语义化。
2.采用伪元素,这里咱们使用:after。添加一个类clearfix: (推荐)
在咱们须要清除浮动时,只须要给父元素追加clear类便可,既方便又符合语义化。
该方法的缺点是,IE6/IE7不识别:after伪元素,存在兼容性问题io
<div class="box clearfix">
<div class="div">1</div>
<div class="div">2</div>
</div>
.box{ width:700px; margin:0 auto; border:2px solid green;} .div{ width:300px; height:200px; background:red; float:left;} .div{ width:300px; height:200px; background:red; float:left; margin-left: 10px;} .clearfix:after { content:""; display:table; /*采用此方法能够有效避免浏览器兼容问题*/ clear:both; }
使用overflow属性,给父元素添加overflow:hidden ||auto
overflow:hidden; zoom:1用于兼容IE6。
BFC/haslayout一般声明
BFC
块级格式化上下文有如下特征:
不仅仅只有给父元素添加overflow:hidden才能够建立块级格式化上下文,下列方法均可以:
弹性盒子 flex boxes (元素的 display: flex 或 inline-flex)
采用float属性以后产生的现象:
砌砖布局的问题:
一、妙脆角-嘎嘣脆 - 容错性比较糟糕,容易出现问题
二、吝啬鬼-重用废 - 这种布局须要元素固定尺寸,很难重复使用
三、洋葱头-IE7飙泪 - 在低版本的IE下有不少问题
float与流体布局