热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

前端面试:被问到BFC,要这样答才能满分

提示:BFC作为前端面试的高频考点,常常会问到什么是BFC?BFC的作用?如何触发BFC?这些问题。但是往往考

提示:BFC作为前端面试的高频考点,常常会问到什么是BFC?BFC的作用?如何触发BFC?这些问题。但是往往考生们答的都不尽人意,不是说不清楚,就是说不全面,看完这篇文章,我相信你会对BFC有更加深入的认识!

文章目录

  • BFC
    • 1. 理解
    • 2. 作用
    • 3. 情景演示
      • 3.1清除浮动
      • 3.2 处理外边距合并/塌陷
      • 3.3 时浮动元素不再遮盖普通元素
    • 3. 触发BFC的常用条件




BFC

1. 理解

官方解释:BFC(Block formatting context)直译为"块级格式化上下文",这是一个独自的渲染区域,规定了内部如何布局并且这个区域的子元素不会影响到外面的元素。
说白了:BFC就像一个安全区,这个区域里的所有元素的布局方式(包括浮动、定位等)都不会影响到外面的其他元素的布局。

2. 作用


  1. 清除浮动
  2. 处理外边距合并问题(又叫外边距塌陷)
  3. 使浮动元素不遮挡普通元素

3. 情景演示


3.1清除浮动

在这里插入图片描述
假如我们要设计上面这个求职功能模块,我们在设计整个求职模块时,不知道后续需要添加进去多少子模块,因此往往不会给外层容器添加高度,使子模块自动撑开整个容器。

接着,我们需要让所有子模块快进行靠左对齐,因此往往会设置浮动(float:left),如下:
css

<style> div {/*只给容器设置了宽度*/width: 300px;padding: 10px;background-color: #fae8c8;}span {/*给子模块添加浮动*/float: left;padding-bottom: 30px;width: 25%; }
style>

html

<div><h2><a class&#61;&#39;title1&#39;>求职简历a>h2><span><a href&#61;"#">销售a>span><span><a href&#61;"#">导购a>span><span><a href&#61;"#">厨师a>span><span><a href&#61;"#">房产经纪a>span><span><a href&#61;"#">文员a>span><span><a href&#61;"#">收银a>span><span><a href&#61;"#">配菜a>span><span><a href&#61;"#">保险经纪a>span><span><a href&#61;"#">前台a>span><span><a href&#61;"#">营业员a>span><span><a href&#61;"#">服务员a>span><span><a href&#61;"#">人事a>span><span><a href&#61;"#">客服a>span><span><a href&#61;"#">保安a>span><span><a href&#61;"#">洗碗工a>span><span><a href&#61;"#">平面设计a>span><span><a href&#61;"#">会计a>span><span><a href&#61;"#">电工a>span><span><a href&#61;"#">迎宾a>span><span><a href&#61;"#">仓车管理a>span>
div>

结果确实这样&#xff1a;
在这里插入图片描述
由于span标签(子模块)的浮动&#xff0c;脱离了文档流&#xff0c;因此不再会帮助父容器撑开高度&#xff0c;就导致了常见的“浮动塌陷”现象&#xff0c;而要解决这一现象&#xff0c;我们就需要清除浮动&#xff0c;这里我们就可以用到BFC了&#xff1a;
触发BFC的条件很多&#xff0c;这里我们以向父元素添加overflow(hidden)为例&#xff1a;
&#xff08;下面一节&#xff0c;我会为大家总结触发BFC条件有哪些常用方式&#xff09;

div {/*我们只需要在原基础上&#xff0c;向父元素添加overflow&#xff1a;hidden属性即可*/overflow: hidden;width: 300px;padding: 10px;background-color: #fae8c8;
}

效果
在这里插入图片描述
可见&#xff0c;只需要给父容器设置overflow: hidden属性就会触发BFC特性&#xff0c;这个父容器就会变为一个特殊的“BFC容器”。
其实这里展现了一个BFC的关键特性&#xff0c;即&#xff1a;计算BFC的高度时&#xff0c;浮动元素也会参与计算。因此这就是为什么BFC能清除浮动带来的负面效果的原因了&#xff01;

3.2 处理外边距合并/塌陷

假如我们有这样两个元素&#xff1a;
在这里插入图片描述
我们分别给蓝色模块设置下外边距&#xff0c;以及给红色模块设置上外边距&#xff0c;假定给这两个外边距分别设置20px&#xff0c;那么我们很容易想到&#xff1a;两模块的距离 &#61; 20px &#43; 20px&#xff0c;也就是中间相隔40px距离。

代码实践如下&#xff1a;
css

<style>.blue {width: 100px;height: 100px;background-color: skyblue;/*添加下外边距*/ margin-bottom: 20px; }.red {width: 100px;height: 100px;background-color: red;/*添加上外边距*/ margin-top: 20px; }
style>

html

<div class&#61;"blue">div>
<div class&#61;"red">div>

结果却不尽人意&#xff1a;
在这里插入图片描述
没错&#xff0c;两个外边距合并在了一起&#xff0c;因此也被称为“外边距合并”。(若两边距不相等&#xff0c;选其最大的外边距作为两者之间的距离)。要想解决外边距合并的问题&#xff0c;我们可以将这两个元素分别包裹在一个有BFC属性的盒子中&#xff1a;
css

<style>.BFC_container {/*设置overflow触发BFC*/overflow: hidden;}.blue {width: 100px;height: 100px;background-color: skyblue;margin-bottom: 20px; }.red {width: 100px;height: 100px;background-color: red;margin-top: 20px; }
style>

html

/*分别将两个元素包裹在一个附带BFC属性的容器中*/
<div class&#61;"BFC_container"><div class&#61;"blue">div>
div><div class&#61;"BFC_container"><div class&#61;"red">div>
div>

效果
在这里插入图片描述
因此&#xff0c;BFC的第二个作用&#xff0c;即&#xff1a;处理元素外边距塌陷问题。

3.3 时浮动元素不再遮盖普通元素

我们都知道浮动元素会脱离文档流&#xff0c;这样就有可能造成遮蔽其他普通元素的负面情况&#xff0c;如下&#xff1a;
在这里插入图片描述
我们可以看到橙色浮动元素遮蔽了绿色普通元素&#xff0c;那么我们想让平面排开&#xff0c;不再互相影响&#xff0c;就可以给普通元素添加BFC属性来完成&#xff1a;
css

<style>.float_div {float: left;width: 100px;height: 100px; background-color: tomato;}.common_div {/*给普通元素添加BFC属性*/overflow: hidden;width: 200px;height: 200px;background-color: springgreen;}
style>

html

<div class&#61;"float_div">浮动元素div>
<div class&#61;"common_div">普通元素div>

效果&#xff1a;
在这里插入图片描述
我们可以看到&#xff0c;通过给普通元素设置BFC属性&#xff0c;这样两元素就不会互相粘彼此影响了。

3. 触发BFC的常用条件


  1. overflow属性不为visible的都行 &#xff08;如&#xff1a;hidden、scroll都行&#xff09;
  2. float属性不为none的都行 (如&#xff1a;left、right)
  3. position只有是absolute或者fixed才行

以上三个是我们最常用的触发BFC的条件&#xff0c;而最为推荐的触发方法为&#xff1a;overflow&#xff1a;hidden

  • 因为设置scroll会在边框右侧添加拖拽条。
  • 利用float属性触发BFC&#xff0c;可能会引起其他模块布局&#xff0c;因为此模块产生了浮动&#xff0c;脱离了文档流
  • 设置positon属性也可能会涉及到影响其他模块的布局

因此&#xff0c;最为推荐的方法时利用overflow&#xff1a;hidden来触发BFC属性&#xff0c;能降低最少成本来解决问题&#xff01;


推荐阅读
  • 标题: ... [详细]
  • Tkinter Frame容器grid布局并使用Scrollbar滚动原理
    本文介绍了如何使用Tkinter实现Frame容器的grid布局,并通过Scrollbar实现滚动效果。通过将Canvas作为父容器,使用滚动Canvas来滚动Frame,实现了在Frame中添加多个按钮,并通过Scrollbar进行滚动。同时,还介绍了更新Frame大小和绑定滚动按钮的方法,以及配置Scrollbar的相关参数。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • Java源代码安全审计(二):使用Fortify-sca工具进行maven项目安全审计
    本文介绍了使用Fortify-sca工具对maven项目进行安全审计的过程。作者通过对Fortify的研究和实践,记录了解决问题的学习过程。文章详细介绍了maven项目的处理流程,包括clean、build、Analyze和Report。在安装mvn后,作者遇到了一些错误,并通过Google和Stack Overflow等资源找到了解决方法。作者分享了将一段代码添加到pom.xml中的经验,并成功进行了mvn install。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 本文介绍了CSS样式属性text-overflow、overflow、white-space、width的使用方法和效果。通过设置这些属性,可以实现文本溢出省略号、隐藏溢出内容、禁止换行以及限制元素宽度等效果。详细讲解了每个属性的作用和用法,以及常见的应用场景和注意事项。对于前端开发者来说,掌握这些CSS样式属性的使用方法,能够更好地实现页面布局和文本显示效果。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • CSS3 animation动画属性详解及用法
    本文详细介绍了CSS3 animation动画的各种属性及用法,包括关键帧动画、动画名称、动画时间、动画曲线、动画延迟、动画播放次数、动画状态和动画前后的状态等。通过本文的学习,读者可以深入了解CSS3 animation动画的使用方法。 ... [详细]
  • 本文介绍了Cocos2dx学习笔记中的更新函数scheduleUpdate、进度计时器CCProgressTo和滚动视图CCScrollView的用法。详细介绍了scheduleUpdate函数的作用和使用方法,以及schedule函数的区别。同时,还提供了相关的代码示例。 ... [详细]
author-avatar
看吧看吧说你你不信
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有