深刻清除浮动原理

关于浮动

设置为浮动的元素会脱离当前文档流,向左或向右移动直到边缘遇到另外一个浮动元素或者到达边界。普通元素不会对齐形成影响。
浮动是把双刃剑,在给咱们的布局带来便利的同时有一些缺点须要咱们去解决。例如最多见的父元素塌陷。以下图所示:css

.warper{
    width: 200px;
    border:1px solid  #ff6633;
}
.float-1{
    float: left;
    background: blue;
    height: 100px;
    width: 100px;
}
.float-2{
    float: left;
    background: #ff0;
    height: 50px;
    width: 100px;
}
//html  
<div class='warper'>
    <div class="float-1"></div>
    <div class="float-2"></div>
</div>
复制代码
能够看到父元素的高度为0,为了解决这种情况就要清除浮动了。

清楚浮动的方式

总结了一下,大体有以下几类:html

1. 结尾空元素或者after等伪元素或者br 来clear
2. 父元素一样浮动
3. 父元素设置overflow为hidden或者auto 
4. 父元素display:table       
复制代码

大体归类,能够分为两大类,1使用clear的属性,后面的能够归为一类,都是经过触发BFC来实现的。 下面详细看一下这两大类清除浮动的方式及原理。git

clear属性

clear 属性规定元素盒子的边不能和浮动元素相邻。该属性只能影响使用清除的元素自己,不能影响其余元素。
换而言之,若是已经存在浮动元素的话,那么该元素就不会像本来元素同样受其影响了。 第一种方式里咱们的填补元素(我本身的称呼),就是起这种做用。github

//这里固然能够换成一个空的div,<br/>等,原理和效果都是一致的  
.warper:after {
    content: '';
    height: 0;
    display: block;
    clear: both;
} 
复制代码

此时after伪元素设置clear:both以后代表,我两边都不能接受浮动元素,本来受浮动元素影响,伪元素的位置在浮动元素下方如图: less

这样显然也不能撑起父元素的高度。设置以后,须要从新安排安排了。
既然两边都不接受浮动元素,但浮动元素位置也肯定了,那只能把伪元素放在下边,如图:
wordpress

能够看到,伪元素的位置在最下方了,距顶部的高度为float元素的高度,顺带撑起了父元素的高度。
一样适用其余填充元素(display为block),都能达到相同的目的。
在看后面几种原理以前咱们须要先看一下BFC的定义。布局

BFC

块级格式化上下文:BFC(block formatting contexts)

照本宣科的定义看起来可能不大好理解,BFC是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,而且与这个区域外部绝不相干。
借用张鑫旭大大的一句话,BFC元素特性表现原则就是,内部子元素再怎么翻江倒海,翻云覆雨都不会影响外部的元素。
因此,避免margin穿透啊,清除浮动什么的也好理解了。学习

正以下面的解释:spa

In a block formatting context, each box’s left outer edge touches the left edge of the containing block (for right-to-left formatting, right edges touch). This is true even in the presence of floats (although a box’s line boxes may shrink due to the floats), unless the box establishes a new block formatting context (in which case the box itself may become narrower due to the floats)
在BFC中,每一个盒子的左外边框紧挨着包含块的左边框(从右到左的格式,则为紧挨右边框)。即便存在浮动也是这样的(尽管一个盒子的边框会因为浮动而收缩),除非这个盒子的内部建立了一个新的BFC浮动,盒子自己将会变得更窄)。3d

BFC的特性

  1. 块级格式化上下文会阻止外边距叠加
  2. 块级格式化上下文不会重叠浮动元素
  3. 块级格式化上下文一般能够包含浮动

换句话说建立了 BFC的元素就是一个独立的盒子,里面的子元素不会在布局上影响外面的元素,反之亦然
同时BFC任然属于文档中的普通流。因此呢浮动也就解决了,关于BFC之后要专门搞个文章仔细研究一下。

看到这里就能够知道了,为何能够拿来清除浮动了,表现为BFC的元素都是一个十分个性的存在,不管里面怎么折腾,对外表现始终如一。
你们确定能够猜到,上面几种利用了BFC的清除方式确定是触发了BFC的条件,让父元素变为BFC。咱们来看一下触发BFC的条件,看是否是如咱们所想。

BFC触发条件

CSS3里面对这个规范作了改动,称之为:flow root,而且对触发条件进行了进一步说明。

float 除了none之外的值 
 
overflow 除了visible 之外的值(hidden,auto,scroll ) 
 
display (table-cell,table-caption,inline-block) 
 
position(absolute,fixed) 
 
fieldset元素
复制代码

由上面能够对比一下,咱们提到那几种方法,就是触发了BFC而已。
看个例子

.warper{
    width: 200px;
    border:1px solid  #ff6633;
    // 下面属性任选其一
    overflow: hidden;
    overflow: auto;
    float: left;
    display:inline-block;
    position: fixed;
}
复制代码

结束语

参考文章

CSS深刻理解流体特性和BFC特性下多栏自适应布局
理解CSS中BFC

到这里清除float相关的内容就说完了,知其然更要知其因此然,清除float的方式繁多无比,掌握其中原理才能不人云亦云。固然抛砖引玉,更多的是共同窗习共同进步,更多请移步博客

相关文章
相关标签/搜索