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

充分理解BFC

时间:2023-03-31 13:00:18 CSS

是什么BFCBFC的全称是BlockFormattingContext,即块格式化上下文。除了BFC还有:IFC(行级格式化上下文)-内联InlineGFC(网格布局格式化上下文)-显示:gridFFC(自适应格式化上下文)-显示:flex或者显示:inline-flex注意:同一个元素不能同时存在于两个BFC中。它是网页可视化CSS渲染的一部分,是块盒布局过程发生的区域,也是浮动元素与其他元素交互的区域。你怎么理解的?其实就是说BFC是一个渲染区,有自己的一套渲染规则,使得它内部布局的元素有一些特点。BFC提供独立的布局环境,BFC内部的元素布局与外部互不影响。块级元素CSS属性值显示是block、list-item、table的元素。块级框有以下特点:当CSS属性值显示为block、list-item、table时,为块级元素布局,块级框呈现为垂直排列的块。每个块级框每次都会参与创建BFC每个块级元素都会生成至少一个块级框,称为主块级框;有些元素可能会生成额外的块级框,比如

  • ,用来存放子弹创建BFC下面的元素会创建一个BFC根元素()浮动元素(float不是没有)绝对定位元素(positionisabsoluteorfixed)tabletitleandcell(displayistable-caption,table-cell)anonymoustablecellelement(displayistableorinline-table)inlineblockelement(displayisinline-block)溢出值不是的元素visibleelasticelement(display的直接子元素是flex或inline-flex元素)grid元素(display是grid或inline-grid元素的直接子元素)以上是CSS2.1规范定义的BFC触发方法。在最新的CSS3规范中,flex和grid元素将创建F(Flex)FC和G(Grid)FC。BFC的特点BFC在页面上是一个独立的容器,容器里面的子元素不会影响外面的元素。BFC内部的块级框会在垂直方向上一个接一个排列。同一个BFC下的相邻块级元素可能会出现margincollapse。创建一个新的BFC可以防止margin折叠每个元素的marginbox。与包含块边界框(borderbox)的左侧接触(从右到左的格式则相反),即使浮动浮动框存在的区域不与BFC重叠计算时BFC的高度,浮动元素会参与计算如果大家不太了解,下面会提到BFC的应用。BFC的应用适应了两列布局。左列浮动(定宽或变宽均可),右列启用BFC。/*html代码*/
    浮动元素,无固定宽度
    自适应
  • /*css代码*/*{保证金:0;填充:0;}。左{浮动:左;高度:200px;右边距:10px;背景色:红色;}.right{溢出:隐藏;高度:200px;:yellow;}设置左边的列向左浮动,并折叠自己的高度,这样其他块级元素就可以和它占据同一行。右边的列是一个div块级元素,它利用自身的流动特性来填充整行。设置overflow:hidden在右列触发BFC特性,将自己与左列浮动元素隔离,不占据整行。这是上面提到的BFC的特点之一:浮动框的区域不会和BFC重叠,防止边距重叠和兄弟元素之间的边距重叠/*html代码*/child1”>
    /*css代码*/*{margin:0;padding:0;}.child1{width:100px;height:100px;margin-bottom:10px;background-color:red;}.child2{width:100px;height:100px;margin-top:20px;background-color:green;}两个块级元素,红色div距底部10px,绿色div和top的距离是20px,按道理两个块级元素的距离应该是30px,但实际上是距离大的那个,也就是20px上下边距块级元素有时会合并(或折叠)到一个外边距中,外边距的尺寸较大。这种行为称为外边距折叠(重叠)。请注意,这种情况发生在根据由于同一BFC下块级元素之间BFC的特点,创建新的BFC时不会发生边距折叠。比如我们在他们两个div的外层包裹一个容器,加上属性overflow:hidden,触发BFC,那么这两个div就不属于同一个BFC。/*html代码*/
    /*css代码*/.parent{overflow:hidden;}/*...*/对于兄弟元素边距重叠的问题,除了触发BFC还有其他解决方案,比如as如果只统一使用top或者bottommargin,就不会出现上面的问题。父子元素之间的边距重叠发生在父元素与其第一个或最后一个子元素(嵌套元素)之间。如果父元素与其第一个/最后一个子元素之间没有border、padding、inlinecontent,也没有创建blockformattingcontext,或者用clearfloats分隔两者的margin,那么子元素的Margins会“溢出”到外面父元素。以下代码:/*HTML代码*//*CSS代码*/*{margin:0;填充:0;}#parent{宽度:200px;高度:200px;背景色:绿色;margin-top:20px;}#child{width:100px;高度:100px;背景色:红色;margin-top:30px;}如上图,红色div在绿色div里面,margin-top设置为30px,但是我们发现红色div的顶部和绿色div的顶部重合了,并且不是距离顶部30px,而是溢出到父元素外面进行计算。也就是说父元素距离顶部只有20px,但是受子元素溢出的影响,边距重叠。如果取较大的值,则距顶部的距离为30px。解决方法:为父元素触发BFC(比如加overflow:hidden)给父元素加border给父元素加padding这样我们就可以达到想要的效果:clearfloating解决折叠父元素高度的问题element当容器中的子元素设置为浮动时,脱离文档流,容器中父元素的总高度仅为border部分的高度/*html代码*//*css代码*/*{margin:0;padding:0;}.parent{border:4pxsolidred;}.child{float:left;宽度:200px;高度:200px;background-color:blue;}解决方法:为父元素触发BFC,使其具有BFC特性:在计算BFC的高度时,浮动元素也会参与计算。父母{溢出:隐藏;border:4pxsolidred;}上面我们都是使用overflow:hidden来触发BFC,因为确实很常用,但是触发BFC的方式不止一种,如上图。例如,您可以设置float:left;浮动:对;显示:内联块;溢出:自动;显示:弹性;display:"table;同理,只是父元素的高度有所延长。当然实际应用不是随便挑一个,而是根据场景来选择。ps:个人技术博文Github仓库,觉得不错欢迎star,鼓励我继续写下去~