CSS学习之路: 浅析CSS中的BFC独立渲染区域

BFC(block formatting content)

中文名是"块级格式化上下文",一个独立渲染的区域,内部不影响外部,外部也不会侵入内部。

特点

BFC是一个元素,他会永远的包裹内部的每一个元素,把外部的元素隔绝在外。也可以隔绝bfc上方和下方的元素。

BFC的布局规则

内部块元素在垂直方向,独占一行,由上到下挨个排列,块元素在垂直方向的总距离:内容+内边距+边框+外边距,区域内块元素垂直方向的margin会重叠(大吞小),左右会叠加。

  • 块元素垂直方向的margin会重叠(大吞小)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
         #div1,#div2 {
            width:60px;
            height:60px;
        }
        #div1{
            background:red;
            margin-bottom:20px;
        }
        #div2{
            margin-top:10px;
            background:yellow;
             
        }
    </style>
</head>
<body>
    <div>
        <div id="div1"></div>
        <div id="div2"></div>
    </div>
</body>
</html>

在这里插入图片描述

  • 块元素左右方向的margin会叠加
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
         #div1,#div3{
            width:60px;
            height:60px;
        }
        #div1{
            background:red;
            margin-right:20px;
        }
        #div3{
            margin-left:10px;
            background:blue;
        }
       
    </style>
</head>
<body>
    <div style="display:flex">
        <div id="div1"></div>
        <div id="div3"></div>
    </div>
</body>
</html>

在这里插入图片描述

如何形成BFC区域

  • float不是none
  • position值不是static或relative
  • display值inline-block table flex inline-flex
  • overflow的值不是visible

平时在哪里会用到BFC

1. 解决浮动后的高度坍塌

出现的问题:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
         #div{
            width:200px;
            background:black;
         }
         #div1,#div3{
            width:60px;
            height:60px;
        }
        #div1{
            background:red;  
            float:left;     
        }
        #div3{
            background:blue;
            float:right;
        }
       
    </style>
</head>
<body>
    <div id="div">
        <div id="div1"></div>
        <div id="div3"></div>
    </div>
</body>
</html>

在这里插入图片描述
解决方案(3个方向)

  1. 给父元素设置固定的宽高,如此代码没有复用性,所以是不好的解决方法
  2. 让父元素形成一个BFC区域,比如让父元素也浮动,或者给父元素添加display:table,或者给父元素添加overflow:hidden等方式,但是每个方式会带来其他的问题。比如父元素浮动会影响后续的页面页面,设置display:table,会有浏览器兼容问题,有的浏览器会默认table的高度在不设置或没有tr,td做支撑的时候为0,overflow:hidden,有的时候需要溢出元素显示出来。
  3. 给内部元素添加clear:both。方式有2:其一,在最后直接添加空元素,但是会破坏dom结构,不是很友好;其二,使用伪类方式,这是最完美得解决方法。
div::after{
   content:'';
   clear:both
}

2. 解决竖直方向margin重叠

出现的问题:

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Document</title>
   <style>
        
        #div1,#div3{
           width:60px;
           height:60px;
       }
       #div1{
           background:red;  
           margin-bottom:20px;    
       }
       #div3{
           background:blue;
           margin-top:20px;    
       }
      
   </style>
</head>
<body>
   <div id="div">
       <div id="div1"></div>
       <div id="div3"></div>
   </div>
</body>
</html>

在这里插入图片描述
解决方案
把其中一个元素设置成BFC独立渲染区域,具体做法是给一个元素外面再包一层大div,给大div设置BFC,比如,设置overflow:hidden,这样外部元素和内部元素互相不影响,两个margin就可以叠加。或者给上方的元素添加一个大div,使用伪类给div的子元素添加一个尾部元素设置成display:table,这样可以形成一个BFC,是上方元素和下方元素隔绝互不影响。

3. 解决外边距溢出的问题 子元素的外边距作用到父元素上

出现的问题:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #div{
            background:black;
            width:200px;
            height:200px;
        }
         #div1,#div3{
            width:60px;
            height:60px;
        }
        #div1{
            background:red;     
        }
        #div3{
            margin-top:20px;
            background:blue;
        }
    </style>
</head>
<body>
    <div id="div1"></div>
    <div id="div">
        <div id="div3"></div>
    </div>
</body>
</html>

在这里插入图片描述
解决方案 (三个)
在这里插入图片描述

  1. BFC相关的
    给父元素设置overflow:hidden,让父元素形成一个BFC区域,缺点是子元素没办法溢出
    在子元素的前面,父元素的里面添加空的table,由于table是BFC区域,所以子元素的外边距转移不出去,从而解决问题.但是如此改变了dom结构,不够友好,所以更多的会使用方式3。
  2. 使用边框
    给父元素添加边框可以解决问题,但是会带新的问题,边框颜色会影响页面效果,解决:设置透明度;边框会影响页面布局,解决=>box-sizing:border-box。
  3. 使用父元素的padding-top代替子元素的margin-top不好,会改变整体的高度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值