Junwen's home
  • ES6

    • ES6 Decorator
    • ES6核心特性
    • Promise&Generator
  • js原理

    • 简单实现bind、apply和call
    • 如何遍历一个dom tree
    • 实现函数currying
    • 实现一个event
    • 详解js的继承
    • 详解requestAnimationFrame
    • Canvas api详解
    • DOM事件
    • EventLoop详解
    • JavaScript的内存管理
    • JavaScript的运行机制
    • Math对象
    • new操作符都做了什么
    • create基本实现原理
    • Set、Map、WeakSet和WeakMap
    • web worker原理
    • WebGL教程(MDN)
  • jsInfoSeries

    • 简介
    • JavaScript基础知识
    • 基础知识2
    • 基础知识3
    • 基础知识4
  • 技巧

    • 5个js解构有趣用途
    • 如何使用set提高代码性能
    • cordova构建项目时的问题
    • js中轻松遍历对象属性的几种方式
  • 怎么写出更好的css
  • BFC详解
  • box-shadow详解
  • CSS小技巧
  • Grid布局详解
HTML
  • IP十问
  • http笔试
  • http协议
  • 浏览器原理
  • 浏览器缓存其实就这么一回事儿
  • 浏览器兼容性问题
  • 移动端开发兼容性适配
  • 前端性能优化
  • 前端如何进行seo优化
  • webpack

    • webpack HMR
    • webpack优化基本方法
  • leetcode题解

    • 两数之和
    • 判断整数是否为回文串
    • 无重复字符的最长子串
  • Js链表
  • JavaScript排序
  • React

    • 虚拟DOM原理理解
    • React Hook
    • 组件复用指南
  • Vue

    • Vue举一反三
面试题
读书笔记
GitHub (opens new window)

Syun0216

多读书多种树
  • ES6

    • ES6 Decorator
    • ES6核心特性
    • Promise&Generator
  • js原理

    • 简单实现bind、apply和call
    • 如何遍历一个dom tree
    • 实现函数currying
    • 实现一个event
    • 详解js的继承
    • 详解requestAnimationFrame
    • Canvas api详解
    • DOM事件
    • EventLoop详解
    • JavaScript的内存管理
    • JavaScript的运行机制
    • Math对象
    • new操作符都做了什么
    • create基本实现原理
    • Set、Map、WeakSet和WeakMap
    • web worker原理
    • WebGL教程(MDN)
  • jsInfoSeries

    • 简介
    • JavaScript基础知识
    • 基础知识2
    • 基础知识3
    • 基础知识4
  • 技巧

    • 5个js解构有趣用途
    • 如何使用set提高代码性能
    • cordova构建项目时的问题
    • js中轻松遍历对象属性的几种方式
  • 怎么写出更好的css
  • BFC详解
  • box-shadow详解
  • CSS小技巧
  • Grid布局详解
HTML
  • IP十问
  • http笔试
  • http协议
  • 浏览器原理
  • 浏览器缓存其实就这么一回事儿
  • 浏览器兼容性问题
  • 移动端开发兼容性适配
  • 前端性能优化
  • 前端如何进行seo优化
  • webpack

    • webpack HMR
    • webpack优化基本方法
  • leetcode题解

    • 两数之和
    • 判断整数是否为回文串
    • 无重复字符的最长子串
  • Js链表
  • JavaScript排序
  • React

    • 虚拟DOM原理理解
    • React Hook
    • 组件复用指南
  • Vue

    • Vue举一反三
面试题
读书笔记
GitHub (opens new window)
  • 怎么写出更好的css
  • BFC详解
    • BFC
  • box-shadow详解
  • CSS小技巧
  • Grid布局详解
  • css
junwen
2021-03-20

BFC详解

# BFC详解

参考BFC究竟是个什么东东 (opens new window) 前端进阶之什么是BFC?BFC的原理是什么?如何创建BFC? (opens new window)

  • BFC(block formatting context),块级上下文,用于布局块级盒子的一块渲染区域。
  • IFC(grid formatting context),内联元素内的渲染规则
  • GFC(grid formatting context),display为grid的元素内的渲染规则
  • FFC(flex formatting context),display为flex的元素内的渲染规则

# BFC

# 如何触发BFC?

某一个元素要满足以下条件任何之一:

  • 该元素是根元素,即标签内就是一个BFC
  • float的值不为none
  • overflow的值不为visible
  • display的值为inline-block、table-cell、table-caption
  • position的值为absolute或fixed

# BFC的渲染机制(BFC特性)

  • 在块格式化上下文中,从包含块的顶部开始,垂直地一个接一个地排列盒子。
    块级元素是那些在源文档中可视为块的元素(如,段落p标签)。display属性为如下属性的元素是块级元素:block,list-item, table。每个块级元素都会产生一个主要的块级盒子来容纳子元素和生成的内容。一个块级容器盒子要么只容纳块级盒子,要么就会建立内联格式化上下文,因此也只容纳内联级盒子(我的理解:一个盒子要么是块级盒子,要么就是内联级盒子)并不是所有的块级容器盒子都是块级盒子: 非替换内联块和单元格(td, th)不是块级盒子。既是块级盒子,同时又是块级容器才能被称为块盒子。

  • 垂直方向上的距离由margin决定,属于同一个BFC的两个相邻Box的margin会发生重叠。

    • 上下相邻(取决于垂直方向上谁的margin大)
    <style>
    .top,.btm{
      width: 200px;
      height: 200px;
    }
    .top {
      margin-bottom: 20px;
      background: deepskyblue;
    }
    .btm {
      margin-top: 30px;
      background: darkorange;
    }
    </style>
    <div>
      <div class="top"></div>
      <div class="btm"></div>
    </div>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    可以看出上下两格的间距是30px。我们如何消除重叠

    1. 给上下两格盒子加上float属性
    2. 使用border或者padding代替margin
  • 父元素和子元素发生重叠

父元素的margin-top为0,padding-top为0,没有border,而子元素的margin-top不为0,那么父元素上方会出现子元素的margin-top值,margin-bottom同理

<style>
  * {
  padding: 0;
  margin: 0;
}
#app {
  background: yellowgreen;
}

.top {
  background: deepskyblue;
  height: 200px;
  margin: 20px;
}
.footer {
  height: 200px;
  width: 200px;
  background: yellow;
}
</style>
<div id="app">
  <div class="top"></div>
</div>
<div class="footer"></div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

消除福字margin重叠的方法:

  1. 给父元素加border
  2. 设置父元素的padding或者margin
  3. 给父元素设置overflow:hidden
  • BFC的区域不会和float的元素区域重叠
<style>
.main {
  background: deepskyblue;
  width: 400px;
  height: 400px;
}
.left {
  float: left;
  width: 200px;
  height: 200px;
  background: darkorange;
}
</style>
<div class="left"></div>
<div class="main"></div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

可以看到main和left发生了重叠,当main设置了了overflow:hidden,即

.main {
  background: deepskyblue;
  width: 400px;
  height: 400px;
  overflow: hidden;
}
1
2
3
4
5
6
  • 在块格式化上下文中,每个box的左外边缘都与包含块的左边缘相接触(对于从右到左的格式化,右边缘相接触)包含块 (opens new window)

  • 计算bfc的高度时,浮动元素也参与计算

这条特性就是就是解决子元素浮动导致父元素无法撑开的关键

<style>
  .main{
    background: deepskyblue;
  }
  .main div {
    height: 100px;
    width: 100px;
    float: left;
  }
</style>

<div class="main">
  <div></div>
  <div></div>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

这样的结果是main的高度为0,页面显示一片空白,当我们为class为main的父级div形成BFC之后

.main {
  background: deepskyblue;
  position: absolute;
}
1
2
3
4
  • bfc就是页面上的一个独立容器,容器里面的子元素不会影响外面元素。

# 总结

我们可以用BFC机制完成的事情:

  • 清除浮动的影响
  • 清除margin重叠
在Github上编辑此页 (opens new window)
#CSS
上次更新: 3/22/2021, 3:14:54 AM
怎么写出更好的css
box-shadow详解

← 怎么写出更好的css box-shadow详解→

最近更新
01
如何打造全链路项目生命周期的统一交付平台
04-10
02
如何建立前端标准化研发流程
04-10
03
如何从0到1一步步成体系地搭建CI
04-10
更多文章>
Theme by Vdoing | Copyright © 2019-2021 Syun
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式