深入理解CSS中的BFC 与IFC , 布局的两大基础概念

在前端开发中,理解CSS的布局机制至关重要,除了我们熟知的盒子模型外,还有一些更深层次的概念,如BFC(Block Formatting Context)和 IFC(inline Formatting Contexet),它们是CSS布局中不可忽视的部分,本文将详细介绍这两个概念,并通过实例展示如何使用它们来解决常见的布局问题

一.BFC

1.什么是BFC

BFC,即块级格式化上下文,他是Web页面的可视化CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域,(在BFC内部,块级元素的布局,浮动元素与其他元素的相互作用,会受到BFC规则的影响) 最重要的特点是: BFC的元素布局不会影响到外部元素,而外部元素的变化也不会影响到BFC内部的布局

BFC是一个独立的布局环境,具有BFC特点的元素可以看做是隔离的独立容器,容器里面的元素不会在布局上影响到外面的元素

2. BFC的布局规则

  • 内部的盒子会在垂直方向,一个个地放置,每个块元素独占一行
  • 盒子垂直方向的距离由margin决定,属于同一个BFC的两个相邻Box的上下margin会发生重叠
  • 每个元素的左边,与包含的盒子的左边相接触,即使存在浮动也是如此
  • BFC的区域不会与 float box重叠
  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之也如此
  • 计算BFC的高度时, 浮动元素也参与计算

3.形成BFC的条件

  • float属性不为none(如float: left 或float :right)

    如果你给以一个浮动元素设置float:left:,它会脱离文档流,并创建自己的BFC

  • position 为absolute 或fixed

  • overflow为hidden, auto,或scroll

  • display为inline-block,table-cell,flex等

4.案例

1. 浮动元素对父元素高度计算的影响

<!DOCTYPE html>

<html>

<head>

<style>

* {

margin: 0;

padding: 0;

}

.box {

background: red;

}

.float {

width: 100px;

height: 100px;

background: green;

float: left;

}

</style>

</head>

<body>

<!-- 计算 BFC 的高度时,浮动元素也参与与计算。-->

<div class="box">

<div class="float">浮动盒子</div>

<p>容器内容</p>

</div>

</body>

</html>

没有触发BFC之前的效果.父元素box不会计算浮动的高度

触发BFC之后

.box{

background: red;

overflow: hidden; //触发BFC,清除浮动

}

这里为什么用overflow:hidden,来触发BFC,而不是使用其他方法
overflow:hidden;(或overflow:auto):
  • 这是最常用的方法来触发父容器的BFC,并确保浮动元素被包含在父容器内,使用overflow:hidden;后,父容器会创建一个新的BFC,这样浮动元素的高度就会被包在父容器内,父容器的高度也会自动计算
其他方法的不足:
1. 使用float触发BFC(仅限浮动元素)
  • float属性,会创建自己的BFC,并让元素本身浮动起来, 会影响元素的排列
2.使用position属性:
  • 会让元素本身脱离文档流,转换成定位会创建该元素自己的BFC,影响布局
3.display属性
  • display属性会改变元素本身的结构,比如块级元素变成内联元素

2.避免外边距合并

<div class="container">

<div class="box">Box 1</div>

<div class="box">Box 2</div>

</div>

.box {

margin-top: 30px;

padding: 20px;

background-color: lightblue;

}

这是外边距合并的效果

防止外边距合并

/* 防止外边距合并 */

.container {

overflow: hidden; /* 触发BFC */

}

.box {

margin-top: 30px; /* 为了避免外边距合并 */

padding: 20px;

background-color: lightblue;

}

触发BFC之后,阻止了外边距合并, 使得box1 距离父元素有30px的外边距 , 确保每个元素都有自己的外边距

二.IFC

1. 什么是IFC?

IFC.即行内格式化上下文,是专门用于控制行内元素布局的一种机制,它控制的是文本,链接,行内块级元素(如inline-block)的排布方式,与BFC不同,IFC主要处理行内元素的水平排列和换行行为

2. IFC布局规则

  • 子元素水平方向横向排列,并且垂直方向起点为元素顶部:在IFC中,行内元素会从左到右水平排列,并且它们的垂直对齐点位于元素的顶部
  • 子元素只会计算横向样式空间[padding,border,margin],垂直方向样式空间不会计算: 在IFC中,只有水平方向的样式空间(如内边距,边框,外边距)会被计算,而垂直方向的这些样式不会影响元素的布局
  • 在垂直方向上,子元素会以不同形式来对齐(vertical-align): IFC中的行内元素可以通过vertical-align属性在垂直方向上以不同的方式对齐,如基线对齐,顶部对齐,中间对齐等
  • 能把在一行上的框都完全包含进去的一个矩形区域,被称为该行的行宽(line box): 行宽的宽度由包含块和其中的浮动元素来决定
  • IFC中的line box一般左右贴近其包含块,但float元素会优先排列: 一般情况下 ,行框的左右边界会紧贴着包含块的左右边界,但浮动元素可能会导致行宽的宽度被浮动元素占据
  • IFC中的line box高度由CSS行高计算规则来确定,同个IFC下的多个line box高度可能会不同: 每个行框哦高度由CSS的行高计算规则决定,这可以包括字体大小,行高属性等,同一个IFC下的多个行框的高度可能会因内容不同而不同
  • 当inline boxed的总宽度少于包含它们的line box时,其水平渲染规则由text-align属性值来决定: 如果一行上的行内元素总宽度小于行宽的宽度,那么text-align属性可以用于控制这些行内元素在行框内的水平对齐方式,如左对齐,右对齐,居中对齐等
  • 当一个inline box超过父元素的宽度时,它会被分割成多个boxes,这些boxes分布在多个line box中

3.如何触发IFC?

1.默认行内元素: 如<span>,<a>等
2.display: inline: 当元素的display设置为inline时,元素会自动进入IFC.
3.display: inline-block: 使块级元素表现为行内元素,但仍然设置宽高,触发IFC

4.示例

1.控制行内元素的对齐

<div class="inline-container">

<div class="button">Button 1</div>

<div class="button">Button 2</div>

<div class="button">Button 3</div>

</div>

.inline-container {

white-space: nowrap; /* 防止换行 */

}

.button {

display: inline-block;

/* 触发IFC */

margin-right: 10px;

padding: 10px 20px;

width: 100px;

background-color: lightblue;

border-radius: 5px;

/* text-align: center; */

}

最初效果

触发IFC后效果

在这个例子中,.button元素通过display:inline-block触发了IFC,确保它们能在同一行内排列,white-space:nowrap: 确保容器不换行

2. 文本与图片混排

<div class="content">

<p><img src="image.jpg" alt="image"> This is some text next to the image.</p>

</div>

.content img {

vertical-align: middle; /* 控制图片垂直对齐 */

margin-right: 10px; /* 图片与文字之间的间距 */

}

通过vertical-align: middle,图片与文字能够垂直居中对齐,margin-right:10px;控制图片和文本之间的间距,确保它们看起来整齐

三. BFC与IFC的区别

特性 BFC(Block Formatting Context) IFC(Inline Formatting Context)
影响的元素类型 块级元素(如divp等) 行内元素(如spana等)
布局方式 垂直排列,独立计算宽高 水平排列,按照行内方式流动
浮动清除 可以清除浮动,避免父元素高度塌陷 不涉及浮动清除
外边距合并 相邻元素的外边距不会合并 行内元素之间的外边距会合并
适用场景 清除浮动、避免外边距合并 控制行内元素排列、文本布局

四.总结

BFC和IFC是CSS中非常重要的布局概念,它们分别解决了块级元素和行内元素布局中的一些常见问题,通过理解这两个概念,前端开发者能够更好地控制页面的布局行为,避免常见的布局问题,如浮动引起的高度塌陷,外边距合并以及行内元素的排布问题

  • BFC主要用于控制块级元素的布局,常见应用包括清除浮动和避免外边距合并
  • IFC 主要用于控制行内元素的布局,常见应用包括文本与图片的混排,行内元素的对齐和布局
相关推荐
weixin-a153003083161 小时前
【playwright篇】教程(十七)[html元素知识]
java·前端·html
ai小鬼头1 小时前
AIStarter最新版怎么卸载AI项目?一键删除操作指南(附路径设置技巧)
前端·后端·github
一只叫煤球的猫2 小时前
普通程序员,从开发到管理岗,为什么我越升职越痛苦?
前端·后端·全栈
vvilkim2 小时前
Electron 自动更新机制详解:实现无缝应用升级
前端·javascript·electron
vvilkim2 小时前
Electron 应用中的内容安全策略 (CSP) 全面指南
前端·javascript·electron
aha-凯心2 小时前
vben 之 axios 封装
前端·javascript·学习
遗憾随她而去.2 小时前
uniapp 中使用路由导航守卫,进行登录鉴权
前端·uni-app
xjt_09013 小时前
浅析Web存储系统
前端
foxhuli2293 小时前
禁止ifrmare标签上的文件,实现自动下载功能,并且隐藏工具栏
前端
青皮桔4 小时前
CSS实现百分比水柱图
前端·css