CSS中有个重要的概念BFC,搞懂BFC可让咱们理解CSS中某些本来诡异(??)的地方。css
感兴趣的同窗能够加文末的微信群,一块儿讨论吧~html
在解释BFC以前,先说一下文档流。咱们常说的文档流其实分为定位流、浮动流、普通流三种。而普通流其实就是指BFC中的FC。FC(Formatting Context),直译过来是格式化上下文,它是页面中的一块渲染区域,有一套渲染规则,决定了其子元素如何布局,以及和其余元素之间的关系和做用。常见的FC有BFC、IFC,还有GFC和FFC。前端
BFC(Block Formatting Context)块级格式化上下文,是用于布局块级盒子的一块渲染区域。MDN上的解释:BFC是Web页面 CSS 视觉渲染的一部分,用于决定块盒子的布局及浮动相互影响范围的一个区域。web
注意:一个BFC的范围包含建立该上下文元素的全部子元素,但不包括建立了新BFC的子元素的内部元素。这从另外一方角度说明,一个元素不能同时存在于两个BFC中。由于若是一个元素可以同时处于两个BFC中,那么就意味着这个元素能与两个BFC中的元素发生做用,就违反了BFC的隔离做用。segmentfault
常规流(Normal flow)浏览器
浮动(Floats)微信
绝对定位(Absolute positioning)ide
left
、right
auto
、scroll
、hidden
inline-block
、table-cell
、table-caption
、table
、inline-table
、flex
、inline-flex
、grid
、inline-grid
absolute
、fixed
注意 display:table也能够生成BFC的缘由在于Table会默认生成一个匿名的table-cell,是这个匿名的table-cell生成了BFC。布局
浏览器对BFC区域的约束规则:学习
规则解读:
BFC是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面元素,反之亦然。咱们能够利用BFC的这个特性来作不少事。
一个正常文档流的block元素可能被一个float元素覆盖,挤占正常文档流,所以能够设置一个元素的float、display、position值等方式触发BFC,以阻止被浮动盒子覆盖。
经过改变包含浮动子元素的父盒子的属性值,触发BFC,以此来包含子元素的浮动盒子。
注意,这里触发BFC并不能阻止其它形式的脱离文档流的元素覆盖正常流元素。
BFC内部其余形式脱离文档流(absolute fixed)
有时候由于多列布局采用小数点位的width致使由于浏览器由于四舍五入形成的换行的状况,能够在最后一列触发BFC的形式来阻止换行的发生。好比下面栗子的特殊状况
属于同一个BFC的两个相邻块级子元素的上下margin会发生重叠,(设置writing-mode:tb-rl时,水平margin会发生重叠)。因此当两个相邻块级子元素分属于不一样的BFC时能够阻止margin重叠。 这里给任一个相邻块级盒子的外面包一个div,经过改变此div的属性使两个原盒子分属于两个不一样的BFC,以此来阻止margin重叠。
可是这里有个疑问: 若是外面包一层div,设置能触发BFC的任何属性都能阻止相邻元素的margin合并。由于分属不一样BFC不会发生margin合并。 而若是在外面不包一个div的话,当设置display为inline-block、inline-flex、table-captain,和position为absolute、fixed,float为left、right是能够阻止margin合并的。这里问题来了:
咱们知道设置position和float会让元素脱离文档流而且又建立新的BFC,因此两个元素就不是相邻元素了,所以能够阻止相邻元素margin合并,可是inline-block、inline-flex、inline-grid、table-captain为何能够呢?若是有人知道为何,请告知~
网上的帖子大多深浅不一,甚至有些先后矛盾,在下的文章都是学习过程当中的总结,若是发现错误,欢迎留言指出~
参考:
PS:欢迎你们关注个人公众号【前端下午茶】,一块儿加油吧~
另外能够加入「前端下午茶交流群」微信群,长按识别下面二维码便可加我好友,备注加群,我拉你入群~