当前位置: 首页 > Web前端 > HTML

前端必须要懂的熟悉又陌生的BFC

时间:2023-04-02 20:03:42 HTML

先写到:BFC看似是一个很陌生的概念,但是在我们的工作中却时不时的发生。如何消除浮动效应?如何避免保证金渗透问题?如何编写两列响应式布局?他们都与BFC有着如此密不可分的关系,让我们一起进入车兔的世界,分分钟搞定BFC吧!1.什么是BFC?BFC概念块格式化上下文(BlockFormattingContext,BFC)是网页可视化CSS渲染的一部分,是块框布局过程发生的区域,也是浮动元素与其他元素交互的区域。简而言之,BFC是marginoverlap的一种解决方案。BFC原理BFC内部元素的垂直外边距会重叠BFC不会和浮动元素重叠BFC是一个独立的容器,不会影响里面的元素,里面的元素不会影响外面的元素计算BFC元素的高度浮动元素会也参与计算2.BFC生成条件的主流:根元素或包含根元素的元素浮动元素:floatisnotnone(float+float是wrapping和destruct,使其无法适配,一般在block中使用浮动布局)绝对定位元素:位置不是静态的也不是相对的(absolute不在文档流中)溢出值不可见的块元素(溢出可以自适应,但不可见的溢出限制了应用场景)内联块元素:显示是inline-block(inline-block是wrapping,不能自适应,IE8以下无法识别该属性)tablecell:元素的显示是table-cell(HTMLtablecell默认是这个值,table-cell是wrapping,无Overflow特性,绝对宽度也可自适应)非主流:表格标题:元素显示为table-caption,HTML表格标题默认为该值匿名表格单元格元素:元素显示为table,table-row,table-row-group,table-header-group,table-footer-group(分别为HTMLtable,row,tbody,thead,tfoot的默认属性)或者inline-tabledisplay值为flow-root的元素包含layout、content或strict值的元素flexible元素:display是flex或inline-flex元素的直接子元素grid元素:display是grid或inline-grid元素的直接子元素Multi-columncontainer:元素的column-count或column-width不是auto,包括column-count为1且column-span为all的元素总是会创建一个新的BFC,即使元素没有被multi包裹-columncontainer三、BFC使用场景1、margin渗透问题1、我在写样式的时候经常怀疑我margin是不是被浏览器吞掉了?作为子元素,我想距离父元素的topmargin有50px的距离,一般是这样显示的height:50px;margin-top:50px;.sec{背景:#ebf6fd;}.child{height:50px;background:#09d;margin-top:50px;line-height:50px;}因为穿透问题,子元素的margin-top值没有达到预期的效果。解决方法:将父元素改为BFC,添加overflow:hidden样式,实现如下效果height:50px;margin-top:50px;2.margin穿透问题2写list结构的时候,margin-top为20px,margin-bottom为20px,应该会出现40px的效果,但是一般情况下是这样的:

剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩,剪女孩cutthegirl,cutthegirl兔妞cutTuNiu

.margin{background:#ebf6fd;}.marginp{margin:20pxauto;background:#09d;line-height:40px;}margin-top和margin-bottom垂直方向的margin会重叠,margin-top和margin-bottom的距离会更大解决方法:为子元素再创建一个父元素,使父元素为BFCChittou,Chitto,Chitto。

Chetto,Chitto,Chitto、千通、千通、千通、牛千通

3.图文结合的两栏自适应布局结构,我们经常让图片浮动,利用浮动的wrapping属性让文字环绕图片,如下:愚人有福
。layout{background:#ebf6fd;margin-top:20px;}.layout.left{float:left;width:150px;height:168px;}.layout.right{background:#09d;text-align:left;}但是当我们想把图片和文字的块一左一右分开的时候呢?解决方法:做右边元素BFC,加上overflow:hiddenstyleimgsrc="img/bqb1.jpg"class="left"alt=""/>笨蛋人有傻福
当我们需要图片和文字之间有20px的间距时,有两种方法:左边margin-right或者右边padding-left笨人有笨福4、清除浮动父元素包含浮动元素,造成父元素塌陷。正常情况如下:切图娘切图娘切图娘切图娘切图娘切图娘切图娘/section>.floatBorder{背景:#ebf6fd;border:1pxsolid#FFBE00;margin-top:20px;}.floatBorder.float{float:left;行高:50px;background:#08d;}父元素折叠并失去除边框之外的高度。这时候就需要用到BFCinnerchild即使元素是浮动元素,也会参与计算原理解决:让父元素成为BFC,添加clearfloatingclass.clearfix{*zoom:1}.clearfix:{content:'';display:table;clear:both}4.结语带BFC属性的元素是一个独立的容器,不受子元素影响,不影响子元素!当margin遇到BFC时,解决了margin重叠的问题;当BFC元素周围有浮动时,拒绝对浮动的包裹,成为不与其重叠的容器;当浮动元素在BFC元素内部时,在计算高度时,内部的Floating元素也被计算在内,解决了父元素塌陷的问题!以上示例代码已上传,大家可以下载练习修改→BFCDemo尊重原创,如需转载请注明出处!参考:张新旭-CSS深入理解overflowMDB-block格式化上下文