BFC讲解

news/2024/12/2 15:03:51/

文章目录

        • 写在前面
        • 什么是BFC
        • 解决了什么问题
        • 如何解决
          • 包含内部浮动元素
          • 排除外部浮动
          • 解决margin重叠
          • 解决margin塌陷
        • 总结

写在前面

因为这篇文章内容属于比较常见的一个面试题,所以帖子里面很多讲过了,我还是决定还是写一篇关于BFC的文章,因为考虑到我可以用比较简介的语言讲明白,不是为了水文章,看完绝对有点帮助的。

什么是BFC

Block Formatting Context 块级格式化上下文 这是他的定义,其实很好理解了,因为css的默认规则是很多的,比如分为了行内元素,块级元素等,既然分开了就说明本身的默认规则不一样,比如块级元素默认就会占据文档一行,高度会根据内容填充,行内元素可以相互挨着,不会占据多余的空间等规则,BFC很明显你可以浅显的将他理解为将一块元素封闭起来,与别的元素进行隔开,自己内部的属性不干扰外部的元素的属性,获取一块独立的空间,就和你在js中申请一块内存一样,new了一下,这块内存就是属于你的,那么你做的事情和别的内存里面做的事情没有什么关系。

解决了什么问题

既然出现了BFC,一定是为了解决问题来的,不然没有意义,他概括的来说解决四个问题:

  • 包含内部浮动元素
  • 排除外部浮动
  • 解决margin 重叠的问题
  • 解决margin 塌陷的问题

如何解决

包含内部浮动元素
  • 说现象

因为css的默认规则,当父元素没有进行设置高度的时候,他的高度取决于内部元素的高度,当内部元素设置浮动了之后,父元素就没有了高度,这个过程叫做不包含内部浮动元素,这是css的设置规则,因为设计的时候就说的很明白,浮动元素是不占据空间的

  • 看代码
<!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>BFC</title><style>.content {background-color: antiquewhite;border: 1px solid #f40;}.first-div {width: 100px;height: 100px;background-color: #003400;}</style>
</head>
<body><div class="content"><div class="first-div"></div></div>
</body>
</html>
  • 看现象
    正常的布局
  • 当我们给子元素添加浮动之后
.first-div {width: 100px;height: 100px;background-color: #003400;float: left; // 添加了浮动属性}
  • 给子元素添加浮动现象添加子元素的浮动效果
  • 当我们给父元素开启BFC模式
 .content {background-color: antiquewhite;border: 1px solid #f40;display: flow-root; // 开启BFC}
  • 父元素开启BFC之后现象
    给父元素添加BFC模式
排除外部浮动
  • 说现象

当父元素内部有两个元素,其中一个设置了浮动,那么旁边的元素进行文字书写的时候,会自动环绕到该子元素,因为css规则定义就是浮动是不占据空间位置的,所以会直接出现类似报纸文章样式的现象

  • 看代码
<!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>BFC</title><style>.content {background-color: antiquewhite;border: 1px solid #f40;}.first-div {width: 800px;height: 30px;background-color: #003400;float: left;}</style>
</head>
<body><div class="content"><div class="first-div"></div><div class="text">csdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdncsdn</div></div>
</body>
</html>
  • 看现象
    内部元素有一个浮动
  • 当我们给文字的div添加BFC属性
 .text{display: flow-root;}
  • 给文字div添加BFC属性之后效果
    给子元素添加了BFC属性
解决margin重叠
  • 说现象

margin重叠其实也是css规则里面的一种,当父元素内部两个子元素中间没有任何可以影响高度的属性或者元素,那么这个时候两个元素设置对立面(marginTop-marginBottom 或者是marginRight-marginLeft)的时候,只会有一个较大的属性值生效,这个现象就叫做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>BFC</title><style>.content {background-color: #f40;width: 400px;height: 400px;}.first-div {width: 100px;height: 100px;background-color: #003400;margin-bottom: 100px;}.second-div{width: 100px;height: 100px;background-color: aqua;margin-top: 100px;}</style>
</head>
<body><div class="content"><div class="first-div"></div><div class="second-div"></div></div>
</body>
</html>
  • 看现象
    子元素设置margin

可以看到,我们明明设置了距离上面100 和距离下面100 但是最后距离只有100 这个现象就做margin重叠

  • 给其中一个子元素添加BFC进行解决
  • css
  .bfc-div{display: flow-root;}
  • html
<div class="content"><div class="first-div"></div><div class="bfc-div"><div class="second-div"></div></div></div>
  • 使用bfc包裹之后的现象
    使用BFC包含之后的现象
解决margin塌陷
  • 说现象

当我们父元素没有进行设置任何border,内容 ,padding等属性的时候,内部的元素设置了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>BFC</title><style>.content {background-color: #f40;width: 400px;height: 400px;}.first-div {width: 100px;height: 100px;background-color: #003400;margin-bottom: 100px;margin-top: 100px;}</style>
</head>
<body><div class="content"><div class="first-div"></div></div>
</body>
</html>
  • 看现象
    margin塌陷现象

我们明明设置的是内部的元素marginTop100px,但是其实内部的相对位置是没有发生改变的,当然这时候你可以使用padding进行解决,但是不建议,因为这样会有副作用,比如影响当前行的所有元素的高度

  • 给外部元素添加BFC
.content {background-color: #f40;width: 400px;height: 400px;display: flow-root;}
  • 给外部元素添加BFC之后的现象
    外部元素添加bfc现象

总结

可能看到这里的朋友就好奇,为什么不用别的方式进行bfc,文章也没有介绍别的方法,全部都是flow-root,这里解释一下,因为flow-root本身就是用来开启BFC的,别的方式比如以下float:none或者是overflow:hidde等操作或者是上面解决margin塌陷的时候使用padding或者是添加一个border都是具有副作用的,添加border之后根据盒模型来计算的时候你的盒子的宽度就发生了变化,所以是具有一定的影响的,所以这里建议是直接使用flow-root进行开启BFC,目前来看是没有任何副作用的,感谢大家的阅读,鄙人不才,写的有问题的地方还是希望可以指正出来,感激不尽。


http://www.ppmy.cn/news/852718.html

相关文章

关于Keil5 .c文件所支持的.h文件未全部显示的问题。(初学者常犯错误)

问题&#xff1a;编译时显示很多变量未定义&#xff0c;可能原因是为包含变量所定义的头文件。 分析&#xff1a;为节省硬件资源&#xff0c;将本项目中用不到的库文件注释掉了。 解决&#xff1b;点击 stm32f10_conf &#xff08;对应到自己的芯片可能是f40等&#xff09;&a…

【嵌入式 · STM32】STM32F407引脚复用对照表

PWM 注&#xff1a;红色标注代表 TIMx_CHxN U(S)ART ADC DMA

MATLAB Simmechanics/Simscape四旋翼无人机控制仿真(5) F250旋翼仿真搭建

MATLAB Simmechanics/Simscape四旋翼无人机控制仿真&#xff08;5&#xff09; F250旋翼仿真搭建 MATLAB Simmechanics/Simscape四旋翼无人机控制仿真&#xff08;5&#xff09; F250旋翼仿真搭建1 效果 MATLAB Simmechanics/Simscape四旋翼无人机控制仿真&#xff08;5&#x…

vue---十分钟搞懂vue计算属性

计算属性 前言 这篇文章介绍vue组件基础中的计算属性&#xff0c;文章持续输出中&#xff01; 废话不多说&#xff0c;直接上刺刀&#xff01;&#xff01; 1. 什么是计算属性 计算属性本质上就是一个 function 函数&#xff0c;它可以实时监听 data 中数据的变化&#xff0…

3GPP TS 29244 f40与f50对比差异

在进一步学习29244标准时&#xff0c;想尝试分析每两个版本之间的细微差异&#xff0c;以了解这几年29244标准的变化&#xff0c;试图从这些变化中以一窥需求的变化。在学习的同时特意整理出来&#xff0c;大家共同学习提高。 5.2.1A.3 Application detection with PFD The d…

R语言数据统计分析与ggplot2高级绘图教程

详情点击链接&#xff1a;R语言数据统计分析与ggplot2高级绘图教程 一&#xff1a;R语言与数据管理1.1 R语言 1.2 R包安装 1.3 R数据读取与重构 1.4 dp1yr包与数据编辑二&#xff1a;R试验设计与数据分析2.1 试验设计 2.2 RCB设计 2.3 BIB设计 2.4 正交设计 2.5 析因设计三&am…

CSS3颜色表达方法

CSS颜色表达方法 CSS中在进行颜色的表示时&#xff0c;通常有以下三种方式&#xff1a; 1.纯英文单词&#xff08;土鳖式&#xff09; css代码&#xff1a; Element{color: red; } Element1{color: green; }这种方法只能练习的时候使用&#xff0c;一般实际开发中不使用。 …

STM32开发笔记114:STM32F40XXX 定时器跨接总线

文章目录 前言一、 STM32F40XXX的时钟二、APB1跨接的定时器三、APB2跨接的定时器四、总结前言 STM32F40XXX系列单片机具有TIM1-TIM14共14个定时器,其跨接APB1和APB2二总线,由于此二总线的频率不相同,所以在对定时器进行设置时,需查阅数据手册判断其具体的跨接总线,本文介绍…