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

BFC和IFC

时间:2023-03-31 02:05:16 CSS

块级框:显示属性为block、list-item、table的元素会生成块级框。并参与块格式化上下文。inline-levelbox:display属性为inline、inline-block、inline-table的元素会生成一个inline-levelbox。并参与内联格式化上下文。磨合框:仅在css3中可用。BFC(BlockFormattingContexts)块级格式化上下文块格式化上下文(blockformattingcontext)是一个独立的渲染区域,容器内部的子元素不会影响布局中的外部元素。只有Block-levelbox参与,它规定了内部Block-levelBox如何布局。块格式化上下文包括创建它的元素的所有子元素,但不包括创建新块格式化上下文的元素的子元素。如何生成根元素float属性不是noneposition是absolute还是fixeddisplay是inline-block,table-cell,table-caption,flex,inline-flexoverflow是不可见布局规则里面的boxes会在垂直方向依次放置方向。Box的垂直距离由margin决定。属于同一BFC的两个相邻框的边距将重叠。每个元素的边距框的左侧接触包含块的边框框的左侧(对于从左到右的格式,否则)。即使存在浮动也是如此。BFC的区域不会和浮动框重叠。BFC是页面上一个隔离的独立容器,容器内部的子元素不会影响外部的元素。反之亦然。BFC计算高度时,浮动元素也参与计算。解决边距重叠问题解决float引起的高度塌陷问题解决文字换行问题(此方法可用于自适应布局)例如:.containbox{border:1pxsolidblack;宽度:300px;高度:300px;}.leftbox{浮动:左;宽度:100px;高度:100px;背景色:红色;}.rightbox{高度:250px;背景色:#fff500;}

rightbox占据了containbox的整个宽度。但是因为rightbox中的文本会让位给leftbox,看起来rightbox会自动填满剩余的空间,超过leftbox高度的rightbox的左边框紧贴containbox的左边。
将overflow:hidden添加到rightbox触发一个新的BFC,那么如何生成IFC(InlineFormattingContexts)行内级格式化上下文由display:inline的非替换元素生成。可替换行内元素,或者显示值为inline-block或inline-table的元素无法生成IFC,因此无法拆分为多个框。例如:.containbox{border:1pxsolidblack;宽度:12em;}span中的文本可以分成多行,因为它是一个内框。
在innertext中添加display:inline-block,由于剩余空间放不下,span中的文本会另排一行。布局规则内的框是水平放置的,一个接一个。这些框的垂直原点从包含块框的顶部开始。放置这些盒子时,会考虑到它们在水平方向上的padding、border、margin所占用的空间。在垂直方向上,这些框可能以不同的方式垂直对齐:它们可能使用底部或顶部对齐方式,或者它们可能通过其内部文本基线对齐。一个可以完全包含一行上所有框的矩形区域称为该行的行框。行框的宽度由包含框和浮点数决定。IFC中的linebox一般在左右两边靠近它的containingblock,但是会因为float元素的存在而发生变化。浮动元素将位于IFC和线盒之间,使线盒的宽度更短。IFC中行框的高度由CSS行高计算规则决定。同一个IFC下的多个lineboxes的高度可能不同(比如一行包含较高的图片,而另一行只有文字)。当inline-levelboxes的总宽度小于包含它们的linebox时,水平渲染规则由text-align属性决定。如果值为justify,那么浏览器会将inline-boxes(不是inline-table和inline-blockboxes)的文本和空格拉伸。当一个inlinebox超过linebox的宽度时,它会被拆分成多个box,这些box分布在多个linebox中。如果一个内联框不能被分割(比如只包含一个字符,或者禁用分词机制,或者内联框受到nowrap或者pre的white-space属性值的影响),那么内联框就会溢出行框。linebox的生存条件是ifc,包含inline级元素,如果linebox里面没有text,whitespace,margin/padding/border非0的inline元素,其他内容正常流(比如如图像、内联块和内联表),并且不以换行符结尾,将被视为零高度行框,并被认为是无意义的。注意:在IFC环境中,不能存在块级元素。如果在IFC中插入块级元素,IFC会被销毁,块级元素之前的元素和块级元素后面的元素都会自动生成一个匿名容器围绕在它的周围,以及这个匿名容器的内部环境将是一个新的国际金融中心。将块设置为内联块以使用单个封闭块参与外部IFC,而内部生成BFC。参考自:VisualformattingmodelKB010:ConventionalflowInlineformattingcontexts聊一些有趣的CSS话题