稀土掘金技术社区 01月01日
今天来尝尝KFC,哦是弄清楚BFC
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了CSS中的盒子模型和BFC(块级格式化上下文)。文章首先介绍了标准盒模型和IE盒模型的区别,以及如何通过`box-sizing`属性进行切换。接着详细阐述了BFC的概念、触发条件和布局规则,并使用代码示例演示了BFC如何解决外边距重叠、高度塌陷和浮动元素重叠等常见布局问题。文章还强调了理解盒子模型和BFC对于精确控制网页布局的重要性,并提供了BFC规则的总结,帮助读者更好地掌握CSS布局的核心概念。

📦`box-sizing`属性是区分标准盒模型和IE盒模型的关键。标准盒模型中,元素的宽度和高度仅包含内容区域,而IE盒模型则包含内容、内边距和边框。

🧱BFC是一个独立的渲染区域,其内部元素不会影响外部元素,反之亦然。触发BFC的常见方式包括设置`float`、`display: inline-block`、`overflow`等属性。

📏BFC的布局规则包括:内部元素垂直排列,外边距可能发生重叠,元素左边与包含块左边相接触,并且BFC区域不会与浮动元素重叠。BFC的高度计算会考虑浮动元素。

🛠️BFC在实际应用中可以有效解决外边距重叠问题,通过为父元素创建新的BFC,可以避免子元素的外边距与父元素的外边距发生折叠。

✨BFC还能清除浮动,通过在父元素上触发BFC,可以避免浮动元素导致父元素高度塌陷,同时,BFC可以防止元素和浮动元素重叠,实现更灵活的布局效果。

原创 ys指风不买醉 2025-01-01 08:32 重庆

点击关注公众号,“技术干货” 及时达!

看到这个标题,你的脑海第一时间浮现的下面场景吗?

好了,不给你看饿了?

回到正文,想到kfc也要回想起BFC这个字节考点

引入:“核”模型

盒子模型(Box Model)

CSS中的盒子模型决定了每个元素的大小和位置。

每个元素都可以视为一个矩形框,这个框由内容区域(content)、内边距(padding)、边框(border)和外边距(margin)组成。

  <style>  * {    margin: 0;    padding: 0;  }  /* 盒模型 + 块级  */  .box, .box2 ,.box3{    width: 100px;    height: 100px;    padding: 10px;    border: 1px solid red;    background-color: green;  }  .box2 {    /* border 盒子大小 IE怪异盒模型 */    box-sizing: border-box;  }  .box3 {    /* 默认,标准盒模型,content 盒子大小 w h  */    box-sizing: content-box;  }  </style>

下面三个box盒子,box本身默认使用标准盒模型content-box

<body>  <div class="box"></div>  <div class="box2"></div>  <div class="box3"></div></body>

结合上面这张图,这里显示IE盒模型,包含boder,padding的

标准盒模型 vs IE盒模型

如果你希望设置元素的宽度和高度时,边框和内边距不影响最终尺寸,可以使用border-box。(注意这里强调元素宽高,不是内容~)

区分行内和块级

点好KFC了,开BFC畅饮??

BFC(块级格式化上下文)

BFC(块级格式化上下文)是一个独立的渲染区域,可以视为元素的一种特性。在这个区域内的元素与外部其他元素互不干扰。BFC内的元素按块级格式化规则进行排列,其中包括该上下文中的子元素,但不包括新创建的BFC子元素。

 <div class="box1">    <div class="box2"></div>    <div class="box3">      <div class="box4"></div>      <div class="box5"></div>    </div>  </div>

假设box1,box3是BFC容器,box1这个区域只包含box2,box3(注意:不会包含box4,box5),而新的box3区域包含box4,box5

如何触发BFC

    浮动元素:float 除了none其他值

    display:inline-block , flex ,(表格单元)table-cells,(表格标题)table-captions),grid,inline-grid等

    块级元素 overflow:除visable 其他值(hidden,auto,scroll)

    绝对定位 position :absolute 或 fixed

    根元素 html

BFC布局规则(重要!)

    1,内部Box会在垂直方向,一个接一个放置

    2,Box垂直方向是margin决定。属于同一个BFC的两个相邻margin会发生重叠。

    3,每个元素margin box 左边,与包含块border box 左边相接触(对左到右的格式化,否则相反)。存在浮动也是一样

    4,BFC是页面上一个独立容器,容器里面子元素不会影响外面元素。反之也是

    5,BFC计算高度时,浮动元素也进行计算,

    6,BFC区域不会与float box重叠

BFC应用场景

解决垂直高度坍塌

根据第1条和第2条BFC布局规则

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">   <title>垂直高度坍塌</title>    <style>                .box{            width: 50px;            height: 100px;            border: 1px solid black;        }        .box1 {            background-color: lightcoral;            margin-bottom: 50px;        }        .box2 {            background-color: green;            margin-top: 30px;        }    </style></head><body>   <div class="box box1">Box1</div>   <div >     <div class="box box2" >Box2</div>   </div></body></html>

这里使用margin-top=30px 和 margin-bottom=50px 模拟外边距。从图片看,显示两个盒子之间只有50px的距离(边距坍塌时取最大的那个margin),不是想要的两个margin之和。外边距发生重叠,这时候我们要找BFC来处理
<body>   <div class="box box1">Box1</div>   <div style="overflow: hidden;">     <div class="box box2" >Box2</div>   </div></body>

「建立新的BFC,根据BFC布局规则」

box2 的父元素 div 的 style 属性设置为 overflow: hidden;,这满足了上述第3点条件,因此这个 div 会创建一个新的 BFC。这意味着 box2 所在的 BFC 与 box1 所在的 BFC 是不同的,它们之间的垂直外边距不会发生折叠。

清除浮动

我们知道浮动元素会脱离文档流,使得后面元素环绕在它周围。如果不设置宽度,还有默认100%宽度,并且浮动元素会再普通流元素之上显示。在下面这个例子中,.float-left 类的元素设置了 float: left;,因此它会向左浮动,后面的 .margin-box 元素会环绕在它的右侧,并且.float-left 在上面。

<!DOCTYPE html><html lang="en"><head>  <style>  .container {    border: 2px solid #000;    padding: 1px;      }  .float-left {    float: left; /*Formating context*/    width: 150px;    background-color: lightblue;    margin: 10px;  }  .margin-box {    width: 200px;    height: 100px;    background-color: lightgreen;    margin: 20px 0 10px 100px; /*左边有外边距*/  }  </style></head><body>  <div class="container">    <div class="float-left">这是一个左浮动的元素</div>  </div>   <div class="margin-box">这是有左侧外边距的盒子是有左侧外边距的盒子</div></body></html>

当父元素只包含浮动元素,这导致父元素高度坍塌为0。所以要解决这个问题我们也可以使用BFC,因为「BFC计算高度时,浮动元素也进行计算」

// 修改style里面的container.container {    border: 2px solid #000;    padding: 1px;    overflow: hidden; /*增加,触发bfc*/  }

浮动不重叠

我们来使用这条规则——> 「BFC区域不会与float box重叠」

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <title>Document</title>  <style>  .container {    border: 2px solid black;    padding: 10px;  }
.float-box { float: left; width: 150px; height: 100px; background-color: lightblue; margin: 10px; }
.bfc-box { width: 300px; height: 100px; background-color: lightgreen; overflow: auto; /* 创建 BFC */ }</style></head><body> <div class="container"> <div class="float-box">这是一个左浮动的盒子</div> <div class="bfc-box">这是一个创建了 BFC 的盒子</div> </div></body></html>

// 修改bfc-box 类.bfc-box {      width: 300px;      height: 100px;      background-color: lightgreen;       overflow: auto;/* 创建 BFC */  }

效果就是两者在父元素box里面 分离,.bfc-box不会抢着浮动元素的位置。这里就不再演示了。读者可以自行实践运用一下


「本例子扩展」

这里如果再取消float-box的margin,就可以看到包含块bfc-box其实左边和他是重叠的。这是规则:「每个元素margin box 左边,与包含块border box 左边相接触(对左到右的格式化,否则相反)。存在浮动也是一样」

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <title>Document</title>  <style>  .container {    border: 2px solid black;    padding: 10px;  }  .float-box {      float: left;      width: 150px;      height: 100px;      background-color: lightblue;      /* 取消margin */  }  .bfc-box {      width: 210px;      height: 100px;      background-color: lightgreen;      /* 没有触发bfc */  }  </style></head><body>  <div class="container">    <div class="float-box">这是一个左浮动的盒子</div>    <div class="bfc-box">这是一个创建了 BFC 的盒子</div></div></body></html>

没有触发bfc,bfc-box盒子因为宽度210px,float-box盒子是150px,存在重叠并且会有环绕

这时候我们在bfc-box里面触发新的bfc,使用overfloat。下面给出bfc-box修改代码:

.bfc-box {      width: 210px;      height: 100px;      background-color: lightgreen;      overflow: hidden;  }

效果出来了

值得注意了解的是:文档流就当成柜子,按一个顺序进行每种FC的布局。弹性布局(Flexbox)会打破传统的BFC规则。弹性布局本身会创建一个「Flex Formatting Context」(FFC),与传统的BFC不同。Flex容器内的元素按Flex规则布局,而不是按照传统的块级元素规则。

总结

理解盒子模型和BFC有助于更精准地控制网页的布局。通过使用适当的box-sizing和BFC设置,你可以有效地解决元素排列和浮动问题,创建出符合需求的页面结构。在CSS布局中,不仅要了解如何设置宽高,还要明白如何利用BFC来实现更复杂的布局和避免元素重叠的情况。

好了,今天没尝尝KFC,先搞搞BFC吧?

下面BFC规则进行记忆:

    1,内部Box会再垂直方向,一个接一个放置

    2,Box垂直方向是margin决定。属于同一个BFC的两个相邻margin会发生重叠。

    3,每个元素margin box 左边,与包含块border box 左边相接触(对左到右的格式化,否则相反)。存在浮动也是一样

    4,BFC是页面上一个独立容器,容器里面子元素不会影响外面元素。反之也是

    5,BFC计算高度时,浮动元素也进行计算,

    6,BFC区域不会与float box重叠

点击关注公众号,“技术干货” 及时达!

阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

CSS盒子模型 BFC 布局 外边距重叠 浮动
相关文章