面试官: 谈谈你对BFC的理解以及外边距合并的问题

简介: 面试官: 谈谈你对BFC的理解以及外边距合并的问题

一、BFC的定义

BFC(Block Formatting Context),即块级格式化上下文,它是页面中的一块渲染区域,并且有一套属于自己的渲染规则,


1.内部的盒子会在垂直方向上一个接一个的放置

2.对于同一个BFC的俩个相邻的盒子的margin会发生重叠,与方向无关。

3.每个元素的左外边距与包含块的左边界相接触(从左到右),即使浮动元素也是如此

4.BFC的区域不会与float的元素区域重叠

5.计算BFC的高度时,浮动子元素也参与计算

6.BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然


BFC目的是形成一个相对于外界完全独立的空间,让内部的子元素不会影响到外部的元素


在页面布局阶段,往往会因为BFC问题导致 页面布局发生错乱,如外边距合并问题,元素高度丢失,两栏布局没有实现自适应。


二、触发BFC的条件

1.根元素,即HTML元素

2.浮动元素:float值为left、right

3.overflow值不为 visible,为 auto、scroll、hidden

4.display的值为除了none以外的全部值, inline-block、inltable-cell、table-caption、table、inline-table、flex、inline-flex、grid、inline-grid

5.position的值为absolute或fixed


三、外边距合并问题

1.兄弟级外边距合并

       合并出现原因:同时给兄弟元素设置一个下外边距同时设置一个上外边距,发生外边距合并

       合并解决方案:

           1.只给其中一个兄弟元素设置外边距

           2.给下边外边距开启BFC

               1.display:inline-blick/flex

               2.position:absolute/fixed

               3.float:left

           3.给上边兄弟元素设置一个父元素 给父元素开启BFC

               overflow hidden/auto

2.父子级外边距合并

       合并出现原因:同时给父子元素设置同一方向的一个外边距

       合并解决方案:

           1.给父元素设置padding属性

           2.给父元素设置border边框


四、BFC的应用场景

1.避免外边距重叠

当兄弟盒子设置 同时给兄弟元素设置一个下外边距同时设置一个上外边距,发生外边距合并

        <style>
            div:first-child {
                width: 100px;
                height: 100px;
                background: red;
                margin-bottom: 10px;
            }
            div:last-child {
                width: 100px;
                height: 100px;
                background: green;
                margin-top: 20px;
            }
        </style>
        <div class="cube"></div>
        <div class="cube"></div>


f16fa8c3994b4df0bed84a63bce140d8.png


出现了外边距重叠的问题,原本body 的高应该为 230(第一个盒子的高度100+第一个盒子的margin20+第二个盒子的高度100+第二个盒子的margin10),此时要解决这类问题,就要打开BFC


当给第二个盒子div打开BFC时,

            div:last-child {
                width: 100px;
                height: 100px;
                background: green;
                margin-top: 20px;
                display: inline-block;
                /* position: absolute; */
                /* float: left; */
            }

会出现下面的情况,使用这三种方法打开BFC,会增加新的样式和边框,此时body的高度为234px,不推荐使用

08e7d5ea2b0145f6bf3ae781e85c5574.png



最佳方法:当我们给第一个盒子一个父盒子,并触发父盒子生成一个BFC,那么两个div就不属于同一个BFC,则不会出现外边距重叠问题。

         <style>
            .cube {
                width: 100px;
                height: 100px;
                background-color: red;
                margin-bottom: 10px;
            }
            .cube1:last-child {
                width: 100px;
                height: 100px;
                background-color: red;
                margin-top: 20px;
            }
            .container {
                /* 开启bfc属性  */
                overflow: hidden;
            }
        </style>
        <div class="container">
            <div class="cube"></div>
        </div>
        <div class="cube1"></div>

f04b1a4eff934530bf2b5bb7ae4bccdb.png

2.清除浮动

        <style>
            .parent {
                border: 10px solid red;
            }
            .child {
                width: 100px;
                height: 100px;
                background-color: blue;
                /* 浮动效果 */
                float: left;
            }
        </style>
        <div class="parent">
            <div class="child"></div>
        </div>

效果如下,在父元素parent计算高度时,并没有计算子元素child的高度。

a0c0096e6ca548b6a4243dc957c6d056.png

当我们给父元素生成BFC后,父元素在计算高度时就会将浮动子元素child的高度也计算到其中

            .parent {
                border: 10px solid red;
                /* 开启bfc overflow hidden auto */
                overflow: hidden;
            }

页面达到的效果如下,正常显示

89107eaea62c4a1f997ff9d6a1b1491f.png

但我们使用其他方法生成BFC时,样式会发生变化,不符合要求,效果如下



e294b90f708d4621ad715e5649e572b8.png

3.实现两栏布局

左侧设置宽度,右边自适应,右边开启BFC

  <style>
    .left{
      width: 300px;
      background-color: red;
      float: left;
    }
    .right{
      background-color: blue;
      /* 开启bfc */
      overflow: hidden;
    }
  </style>
    <div class="left">左侧定宽</div>
  <div class="right">右侧自适应右侧自适应右侧自适应右侧自适应
    右侧自适应右侧自适应右侧自适应右侧自适应右侧自适应右侧自适应
    右侧自适应右侧自适应右侧自适应右侧自适应右侧自适应右侧自适应
    右侧自适应右侧自适应右侧自适应右侧自适应右侧自适应右侧自适应
  </div>


实现了两栏布局且右边是自适应


023074239fe046f9858f1111019cab2a.png


4.实现三栏布局

思路:左右两边固定宽度,给左盒子float:left;给右盒子float:right,给中间盒子开启BFC,实现左右固定宽度,中间自适应的效果

        <style>
            /* 三列布局 左侧右侧定宽 中间自适应 */
            .left,
            .right {
                width: 100px;
                height: 50px;
                background-color: red;
            }
            .left {
                float: left;
            }
            .right {
                float: right;
            }
            .center {
                height: 100px;
                background-color: blue;
                /* 开启bfc */
                overflow: hidden;
            }
        </style>
        <div class="left"></div>
        <div class="right"></div>
        <div class="center"></div>

目录
相关文章
|
3月前
|
前端开发 容器
面试官常问的清除浮动和BFC ——看完不再担心面试问题
面试官常问的清除浮动和BFC ——看完不再担心面试问题
|
6月前
|
前端开发 容器
CSS面试考点:隐藏元素、BFC、垂直居中、CSS3新特性
【4月更文挑战第2天】 CSS面试考点:隐藏元素、BFC、垂直居中、CSS3新特性
52 10
|
前端开发
和面试官谈谈BFC
和面试官谈谈BFC
135 0
|
前端开发 容器
大白话阐述什么是BFC(一道可能的面试题)
大白话阐述什么是BFC(一道可能的面试题)
109 0
大白话阐述什么是BFC(一道可能的面试题)
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
8天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
9天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
33 4
|
1月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
67 2
|
1月前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
28 0
|
3月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。