css BFC的理解

css BFC的理解

先来介绍一下什么是文档流(常规流)

文档流指的是元素在布局排版过程中,元素会在浏览器中以自上而下的顺序依次排列的规则。display为block的会独占一行,可以设置宽高度和外边距等;inline元素会排成一行,直到空间不能满足大小会换行,不能设置宽高,宽高由子元素或内容撑开。inline-block则有block和inline-block的特点,表现为外面是inline盒子,里面是block盒子,可以遵循行内元素的特点排成一行,又可以设置宽高和边距。

我们在布局中,常常遇到使用overflow:hidden;来清除浮动,原理是因为触发了BFC情况。

一. 什么是BFC?
BFC(Block Formatting Context)格式化上下文,是Web页面中盒模型布局的CSS渲染模式,指一个独立的渲染区域或者说是一个隔离的独立容器。

二.BFC模式出现的情况?
1、浮动元素,float 除 none 以外的值;
2、定位元素,position(absolute,fixed);
3、display 为以下其中之一的值 inline-block,table-cell,table-caption;
4、overflow 除了 visible 以外的值 比如(hidden,auto,scroll);

三.BFC模式有什么特点?
1.内部的Box会在垂直方向上一个接一个的放置。
2.垂直方向上的距离由margin决定
3.bfc的区域不会与float的元素区域重叠。
4.计算bfc的高度时,浮动元素也参与计算
5.bfc就是页面上的一个独立容器,容器里面的子元素不会影响外面元素。

四.BFC模式特点的案例
1.内部的Box会在垂直方向上一个接一个的放置。
在这里插入图片描述
html:

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

css:

div {
            height: 20px;
            
        }
        
        .container {
            position: absolute;  /* 绝对定位absolute创建一个BFC环境*/
            height: auto;
            background-color: #eee;
        }
        
        .box1 {
            width: 400px;
            background-color: red;
        }
        
        .box2 {
            width: 300px;
            background-color: green;
        }
        
        .box3 {
            width: 100px;
            background-color: yellow;
            float: left; //黄色的元素设置了浮动
        }
        
        .box4 {
            width: 200px;
            height: 30px;
            background-color: purple;
        }

此时可以看到BFC区域里面所有元素在垂直方向按照从上到下顺序依次排列,并且都是左对齐,box3黄色元素即使设置浮动了依然接着上一个元素垂直排列。

2.计算 BFC 的高度时,浮动元素也参与计算
没有对父元素固定高度的情况下,子元素浮动起来,会出现什么情况呢 看图
在这里插入图片描述
这里的父元素并没有被子元素撑开 子元素设置了浮动脱离了文档流没有检测到高度,那么我们如何利用BFC使浮动元素也算入父元素计算高度范围内呢。
在这里插入图片描述
css:

 .container {
            width: 400px;
            border: 2px red solid;
            overflow: hidden;/*我们为父元素创建了bfc*/
        }

        .box1 {
            width: 100px;
            height: 100px;
            background-color: saddlebrown;
            float: left;
        }   

此时为父元素创建了bfc,子元素的高度被计算到了,父盒子也就相应的被撑开有了高度。

3.外边距折叠
BFC区域里的元素垂直方向上的距离由其中一个元素较大的margin值决定;
在常规文档流中,两个兄弟盒子之间的垂直距离是由他们的外边距所决定的,但不是他们的两个外边距之和,而是以较大的为准。

在这里插入图片描述
html:

<div class="container">
                <div class="box1"></div>
                <div class="box2"></div>      
            </div>

css:

 div {
            height: 200px;
            width: 200px;
            
        } 
        .container {
        width: 500px;
        height: 500px;     
          background-color: #ccc;
       overflow: hidden;
            
        }
        
        .box1 {
          
            background-color: red;
            margin:10px 0px;
        }
        
        .box2 {
            
            background-color: green;
            margin:20px 0px;
        }

此时可以看到box1上边距正常存在,两个子盒子的垂直距离为20px而不是30px,因为垂直外边距会折叠,间距以较大的为准。
那怎么才能让两个子盒子不发生外边距重叠呢?
此时BFC的一个特性说明了如何解决。bfc就是页面上的一个独立容器,容器里面的子元素不会影响外面元素,同样外面的元素不会影响到BFC内的元素。那么我们让box1或box2再处于另一个BFC区域里就行了。

在这里插入图片描述
html:

 <div class="container">
            <div class="container2">
                    <div class="box1"></div>
            </div>
               
                <div class="box2"></div>      
            </div>

css:

    
        .container {
        width: 400px;
        height: 400px;
        background-color: slateblue;
        overflow: hidden;
        }       
        .box1 {
            height: 200px;
            width: 200px;
            background-color: red;
            margin-bottom:10px;
        }
        
        .box2 {
            height: 200px;
            width: 200px;
            background-color: green;
            margin-top:20px;
        }
        .container2{
            overflow: hidden;
        }

此时box1的父盒子创建了bfc 可以看到两个盒子的垂直距离是30px 也就解决了外边距重叠 可以得出结论:Box 垂直方向的距离由 margin 决定。属于同一个 BFC 的两个相邻 Box 的 margin 会发生重叠。

4.浮动元素不会对bfc区域元素产生影响
在这里插入图片描述
html:

  <div class="container">
        <div class="box1"></div>
        <div class="box2"></div>
    </div>

css:

  .container {
            width: 500px;
            height: 400px;
            background-color: slateblue;
           
        }

        .box1 {
            height: 200px;
            width: 200px;
            background-color: red;
           float: left;
           margin-right: 10px;
        }

        .box2 {
            height: 200px; /* 不设置宽 宽度自适应*/
            background-color: green;
            overflow: hidden;
        
        }

我们为box2盒子创建了一个bfc区域,根据bfc区域的元素独立于外面元素的特点,box2盒子并没有被设置了浮动的box1盒子覆盖。

这个特性同样可以用在常用的三栏布局上
在这里插入图片描述
html:

 <div class="container">
        <div class="box1"></div>
        <div class="box2"></div>
        <div class="box3"></div>
    </div>

css:

    .container {
            width: 700px;
            height: 400px;
            background-color: slateblue;
           
        }

        .box1 {
            height: 200px;
            width: 200px;
            background-color: red;
           float: left;
        
        }

        .box2 {
            height: 200px; 
            background-color: green;
       width: 200px;
       float: right;
        
        }
        .box3{
            height: 200px;
            overflow: hidden;
            background-color: pink;
        }

这里可以看出box3因为创建了bfc 并没有受到两边浮动元素的影响
写到这里,我们又可以得出结论 :BFC的区域不会与float元素产生重叠

float设计之初被用来设计字体环绕效果 用来布局的话浮动的盒子会覆盖文档流盒子 但是文档流盒子里的内容则不会被覆盖 那么我们如何用bfc让包含文字的内容来阻止字体环绕呢
在这里插入图片描述
想必大家都知道了 给包含文字的元素创建一个bfc区域
在这里插入图片描述

这是我对关于css bfc的理解,参考https://www.cnblogs.com/chen-cong/p/7862832.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值