当前位置: 首页 > news >正文

深入理解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 主要用于控制行内元素的布局,常见应用包括文本与图片的混排,行内元素的对齐和布局

http://www.lryc.cn/news/579603.html

相关文章:

  • Day50 预训练模型+CBAM模块
  • 【Python】图像识别的常用功能函数
  • golang json omitempty 标签研究
  • 服务器如何配置防火墙规则开放/关闭端口?
  • 数据库运维指导书
  • 74. 搜索二维矩阵
  • WPS 如何使用宏录制功能
  • Web 服务器架构选择深度解析
  • 【字节跳动】数据挖掘面试题0006:SVM(支持向量机)详细原理
  • LiteHub中间件之跨域访问CORS
  • 【ArcGISPro】基于Pro的Python环境进行Django简单开发Web
  • 队列和栈数据结构
  • RabbitMQ 高级特性之发送方确认
  • NV133NV137美光固态闪存NV147NV148
  • c++中的绑定器
  • 在Linux服务器上使用kvm创建虚拟机
  • 国内MCP服务平台推荐!aibase.cn上线MCP服务器集合平台
  • 儿童几岁开始可以使用益智玩具?
  • 解决python报not found libzbar-64.dll的问题
  • 基于 SpringBoot+Vue.js+ElementUI 的 “花开富贵“ 花园管理系统设计与实现7000字论文
  • 基于Hadoop的餐饮大数据分析系统的设计与实现
  • 刷卡登入数据获取
  • 纯前端批量下载
  • CPT204-Advanced OO Programming: Sorting排序
  • 扣子空间PPT生产力升级:AI智能生成与多模态创作新时代
  • JS模块导出导入笔记 —— 默认导出 具名导出
  • 行波进位加法器 (Carry-Propagate Adder)
  • UE5 瞄准偏移(AimOffset)功能详解
  • 独立开发者软件出海:如何用Semrush高效洞察与增长
  • RJ45 连接器(水晶头)的引脚定义