CSS3(BFC)

CSS3(BFC)

1、什么是BFC

  • W3C 上对 BFC 的定义:

    原文:Floats, absolutely positioned elements, block containers (such as inline-blocks, table-
    cells, and table-captions) that are not block boxes, and block boxes with ‘overflow’ other than
    ‘visible’ (except when that value has been propagated to the viewport) establish new block
    formatting contexts for their contents.
    译文:浮动、绝对定位元素、不是块盒子的块容器(如 inline-blocks 、 table-cells 和
    table-captions ),以及 overflow 属性的值除 visible 以外的块盒,将为其内容建立新
    的块格式化上下文。

  • MDN 上对 BFC 的描述:

    块格式化上下文(Block Formatting Context,BFC) 是 Web 页面的可视 CSS 渲染的一部分,
    是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。

  • 通俗描述

    1. BFC 是 Block Formatting Context (块级格式上下文),可以理解成元素的一个
      “特异功能”。 @media screen and (max-width:768px) { /*CSS-Code;*/ } @media screen and (min-width:768px) and (max-width:1200px) { /*CSS-Code;*/ }
    2. 该 “特异功能”,在默认的情况下处于关闭状态;当元素满足了某些条件后,该“特异功
      能”被激活。
    3. 所谓激活“特异功能”,专业点说就是:该元素创建了 BFC (又称:开启了 BFC )。

2、开启了BFC能解决什么问题

  1. 元素开启 BFC 后,其子元素不会再产生 margin 塌陷问题。
  2. 元素开启 BFC 后,自己不会被其他浮动元素所覆盖。
  3. 元素开启 BFC 后,就算其子元素浮动,元素自身高度也不会塌陷。

3、如何开启BFC

  • 根元素
  • 浮动元素
  • 绝对定位、固定定位的元素
  • 行内块元素
  • 表格单元格: table 、 thead 、 tbody 、 tfoot 、 th 、 td 、 tr 、 caption
  • overflow 的值不为 visible 的块元素
  • 伸缩项目
  • 多列容器
  • column-span 为 all 的元素(即使该元素没有包裹在多列容器中)
  • display 的值,设置为 flow-root

4、如何解决问题1

问题点:元素开启 BFC 后,其子元素不会再产生 margin 塌陷问题。

塌陷的问题实际上就是

  • 最上边一个元素的 margin-top 会被父元素吃掉,导致没有生效
  • 最下边一个元素的 margin-button 元素不起作用

问题演示

我将会将原本没有处理的效果贴出来,以及处理后的的效果贴出来;

代码
  .outer {
       width: 500px;
       background-color: #888;
}

.inner {
       width: 100px;
       height: 100px;
       text-align: center;
       line-height: 100px;

       /* 第一个元素和最后一个元素的 margin-top / margin-bottom失效了  */
       margin: 20px;

     }


     .inner:nth-of-type(1) {
       background-color: red;
     }

     .inner:nth-of-type(2) {
       background-color: yellow;
     }

     .inner:nth-of-type(3) {
       background-color: green;
     }

 <div class="outer">
      <div class="inner">1</div>
      <div class="inner">2</div>
      <div class="inner">3</div>
   </div>
效果

在这里插入图片描述

解决方案

我们遵循的方案是,谁有问题我们就在谁的身上处理它。如果我们是 a元素出了问题,那么我们处理方案也是在a元素上;

方案1

/* 方案1 浮动 */

​ float: left;

在这里插入图片描述

方案2

/* 方案2 absolute/fixed 相对定位是不行的 */

​ position: fixed;

在这里插入图片描述

方案3

后续的效果我就不一一贴出来了,直接看代码结果即可

  • 行内块元素

/* 方案3 行内块元素 */

display: inline-block;

方案4

行内块元素

/* 方案4 行内块元素 */

display: table;

方案5

方案5 overflow 的值不为 visible 的块元素

overflow: auto;

方案6

伸缩容器,找到他们的父亲 也就是 body {display: flex;}

body {display: flex;}

方案7

多列容器

column-count: 1;

方案8

column-span 为 all 的元素(即使该元素没有包裹在多列容器中)

column-span: all;

方案9

display 的值,设置为 flow-root

display: flow-root;

5、如何解决问题2

实际是浮动产生的问题,自己浮动后,后边的元素会填充到自己原本的位置,导致后面的元素被覆盖

问题演示

在这里插入图片描述

代码
 .box {
 width: 200px;
 height: 200px;

}

.box1 {
background-color: red;
/* 后面元素会跑到自己后面,影响的是后面元素 */
float: left;

}

.box2 {
         background-color: saddlebrown;
}         
      
<body>
   <div class="box box1">1</div>
   <div class="box box2">2</div>
</body>
  • 问题点:我们看到当box1设置浮动后,box2看不到了;

解决方案

这个时候我们看到出问题的是 box2元素,那么我们处理时候也需要在box2上面做文章

方案1

使用浮动

float: left;

在这里插入图片描述

方案2

使用定位,我们看到也有问题,就是box2把原本的box1给覆盖了;

position: absolute;

在这里插入图片描述

方案3

变为行内块元素

display: inline-block;

在这里插入图片描述

方案4

display: table

方案5

overflow: auto

方案6

body {

​ display: flex;

}

方案7

column-count: 1;

方案8

column-span: all;

方案9

display: flow-root;

6、如何解决问题3

  • 元素开启 BFC 后,就算其子元素浮动,元素自身高度也不会塌陷。

  • 我们如何设置

    我们需要设置一个父容器,父容器里面设置多个子元素,父容器的高度靠子元素的高度撑开,这个时候我们设置子元素浮动,然后看到父元素高度没了

基本代码

<title>02.浮动自己</title>
   <style>
       /* body {
      display: flex;
     } */

     .outer {
         background-color: #888;
         /* 需要设置宽度,不然看不到结果 */
         width: 800px;
         /* 解决方案 */
          /* float: left; */

          /* position: absolute; */
          /* display: inline-block; */
          /* display: table; */
          /* overflow: auto; */
          /* 父元素 */
          /* column-count: 1; */
          /* column-span: all; */
          display: flow-root;

     }

     .inner {
       width: 200px;
       height: 200px;
       text-align: center;
       line-height: 100px;
       
       /* 浮动,父元素高度没了 */
       float: left;

     }


     .inner:nth-of-type(1) {
       background-color: red;
     }

     .inner:nth-of-type(2) {
       background-color: yellow;
     }

     .inner:nth-of-type(3) {
       background-color: green;
     }
   </style>
</head>
<body>
   <div class="outer">
      <div class="inner">1</div>
      <div class="inner">2</div>
      <div class="inner">3</div>
   </div>
</body>

效果

在这里插入图片描述

解决后的效果

在这里插入图片描述

解决多种方案集合

.outer {
         background-color: #888;
         /* 需要设置宽度,不然看不到结果 */
         width: 800px;
         /* 解决方案 */
          float: left;

          /* position: absolute; */
          /* display: inline-block; */
          /* display: table; */
          /* overflow: auto; */
          /* 父元素 */
          /* column-count: 1; */
          /* column-span: all; */
          /* display: flow-root; */

     }
### CSS BFC 的定义 BFC(Block Formatting Context,块级格式化上下文)是CSS中一种重要的布局机制。它是一种独立的渲染区域,在这个区域内,所有的子元素都会遵循特定的布局规则,并且这些子元素不会受到外部元素的影响[^1]。 --- ### BFC 的作用 #### 1. 防止布局干扰 BFC 形成一个完全独立的空间,使得其内部的子元素不会影响到外部的其他元素布局。这种特性对于复杂的页面结构尤为重要[^3]。 #### 2. 清除浮动引发的高度坍塌问题 当父元素包含浮动子元素时,默认情况下父元素可能会因为无法感知子元素的高度而发生高度坍塌现象。通过触发 BFC,可以让父元素重新计算并包裹住浮动子元素,从而避免这一问题[^3]。 #### 3. 解决边距重叠问题 在标准流中,相邻的两个块级元素之间的垂直外边距会发生重叠。如果其中一个元素进入了 BFC,则它们之间不会再有边距重叠的现象[^1]。 --- ### 如何触发 BFC? 以下是几种常见的触发 BFC 的方法: - 设置 `float` 属性值为非 `none` 值(如 `left` 或 `right`)。 - 将 `position` 属性设置为 `absolute` 或 `fixed`。 - 把 `overflow` 属性设为除了 `visible` 外的任何值(如 `hidden`, `auto`, 或 `scroll`)。 - 使用某些特殊的 `display` 值,比如 `inline-block`, `flex`, `grid`, `table-cell`, `list-item`, 或者现代浏览器支持的 `flow-root` 等[^2][^3]。 --- ### BFC 的典型应用场景 #### 场景一:清除浮动带来的父元素高度丢失 ```html <div class="parent"> <div class="child">Child</div> </div> <style> .parent { overflow: hidden; /* 触发 BFC */ } .child { float: left; } </style> ``` 在这个例子中,`.parent` 虽然包含了 `.child` 浮动元素,但由于设置了 `overflow:hidden` 来触 发 BFC,因此能够正常显示自身的高度。 #### 场景二:防止兄弟元素间的 margin 合并 ```css .block1 { height: 50px; background-color: lightblue; margin-bottom: 20px; } .block2 { height: 50px; background-color: salmon; margin-top: 20px; overflow: auto; /* 触发 BFC */ } ``` 这里由于第二个区块启用了 BFC,所以两者的顶部间距会保持实际相加后的距离而不是简单合并[^1]。 --- ### 总结 掌握 BFC 不仅能帮助开发者更好地理解和调试复杂网页布局行为,还能有效应对诸如清除浮动、调整内外边界等问题。合理利用 BFC 可显著提升前端开发效率与代码质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星空寻流年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值