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

BFC和IFC概念理解+布局规则+形成方法+用处

时间:2023-03-30 22:20:43 CSS

要理解BFC和IFC,首先要理解另外两个概念:Box和FC(即格式化上下文)。Box一个页面由许多Box组成,元素的类型和display属性决定了Box的类型。不同类型的Boxes将参与不同的FormattingContexts。块级框会参与BFC的形成,比如显示值为block、list-item、table的元素。inlinelevelboxes会参与IFC的形成,比如显示值为inline、inline-table、inline-block的元素。参考:W3C文档block-levelFC(FormattingContext),这是W3CCSS2.1规范中的一个概念,在页面中定义了一个渲染区域,有一套渲染规则,决定了它的子元素将如何定位,与其他元素的关系和交互。常见的格式化上下文有:块格式化上下文(BFC|块级格式化上下文)和内联格式化上下文(IFC|内联格式化上下文)。下面介绍一下IFC和BFC的布局规则。IFC布局规则:在内联格式化上下文中,框一个接一个地水平排列,从包含块的顶部开始。水平边距、边框和填充在框之间保留。框可以以不同的方式垂直对齐:它们在顶部或底部对齐,或者根据其中文本的基线对齐。包含这些框的矩形区域将形成一行,称为行框。BFC发布规则:W3C译文:浮动、绝对定位元素、不是块盒的块容器(例如内联块、表格单元格和表格标题),以及具有“溢出”而非“可见”的块盒(除非该值已传播到视口)为其内容建立新的块格式化上下文。在块格式化上下文中,框从包含块的顶部开始一个接一个地垂直放置。两个同级框之间的垂直距离由“边距”属性确定。块格式化上下文中相邻块级框之间的垂直边距折叠。在块格式化上下文中,每个框的左外边缘接触包含块的左边缘(对于从右到左的格式,右边缘接触)。即使存在浮动也是如此(尽管框的行框可能会由于浮动而缩小),除非框建立新的块格式化上下文(其中h情况下,由于浮动框本身可能会变窄)。中文排列:内部的Box会在垂直方向上一个接一个的放置,Box的垂直距离由margin决定。属于同一个BFC的两个相邻Boxes的边距将与每个元素的左外边缘(margin-left)重叠,触及包含块的左侧(containboxleft)(对于从左到右的格式,否则对面的)。即使存在浮动也是如此。除非这个元素本身形成一个新的BFC。BFC的区域不会和浮动框重叠。BFC是页面上一个隔离的独立容器,容器内部的子元素不会影响外部的元素。反之亦然。BFC计算高度时,浮动元素也参与计算参考:W3C文档inline-formattingW3C文档block-formatting如何组成BFC?块级格式化上下文由以下之一创建:根元素或包含它的其他元素是浮动的(元素的浮动不是无)绝对定位的元素(元素的位置是绝对的或固定的)非块-level元素有display:inline-block,table-cell,table-caption,flex,inline-flex块级元素有overflow,值不可见。整理到这里,上面第4条出现了一个小问题:whydisplay:inline-block;element是内联层次的元素,参与IFC的形成,但是可以创建BFC吗?后来我想答案是这样的:inline-block元素内部是一个BFC,但是可以和其他inline元素组成一个IFC。BFC的使用1.清除浮动

1
2
.wrap{border:2pxsolidyellow;width:250px;}section{背景颜色:粉红色;向左飘浮;宽度:100px;height:100px;}可以看出,由于子元素都是浮动的,受浮动影响,边框为黄色的父元素高度塌陷。解决方法:添加overflow:hidden;.wrap形成一个BFC。根据BFC的第六条规则,在计算高度的时候,会计算浮动元素的高度,达到清除浮动效果的效果。2.布局:自适应的两栏布局
我是那种clam,clamclamclamclamclamclamclamclad
/div>div{width:200px;}aside{背景色:黄色;向左飘浮;宽度:100px;height:50px;}main{background-color:pink;}可以看到右侧元素的一部分运行在左侧元素的下方。解决方法:设置overflow:hiddenformain;触发主元素的BFC,根据规则4和5,BFC区域是独立的,不会和页面上的其他元素交互,也不会和float元素重叠,所以可以形成两列自适应布局3.防止垂直边距合并12section{background-color:pink;底部边距:100px;宽度:100px;height:100px;}.bottom{margin-top:100px;}可以看出.top和.bottom之间有200px的margin值,但是我们只能看到100px。这是因为它们的边距相遇并发生合并。如何修复:将一个元素包裹在其中一个元素周围。并设置溢出:隐藏;对于这个外部元素,以便它形成一个BFC。因为BFC内部是一个独立的容器,不会与外部交互,防止margin合并。12
.wrap{overflow:hidden;}