CSS格式化上下文

CSS 中很重要的一环就是 BFC 块级格式化上下文,本文整理了 CSS BFC 的相关知识,建议沐浴更衣后食用。

在正式讲解BFC之前,先了解一下浏览器外边距重叠的问题。

外边距重叠

MDN:块的上外边距(margin-top)和下外边距(margin-bottom)有时合并(折叠)为单个边距,其大小为单个边距的最大值(或如果它们相等,则仅为其中一个),这种行为称为边距折叠
注意:外边距重叠都是发生在块级元素中,设定 float 和 position=absolute 的元素不会产生外边距重叠行为。

有三种情况会形成外边距重叠:

  • 同一层相邻元素之间:相邻的两个元素之间的外边距重叠。box1和box2的margin为200px
<style>div {width: 100px;height: 100px;background-color: pink;}.box1{margin-bottom: 100px;}.box2{margin-top: 200px;}
</style>
<div class="box1"></div>
<div class="box2"></div>
  • 没有内容将父元素和后代元素分开:如果没有边框 border,内边距 padding,行内内容,也没有创建块级格式上下文就会出现父块元素和其内后代块元素外边界重叠,重叠部分最终会溢出到父级块元素外面。如下:wrapper 有 100px 的上外边距,而 box 和 wrapper 之间是没有 100px 的上外边距。
<style>.wrapper {width: 200px;height: 200px;background-color: pink;}.box{width: 100px;height: 100px;margin-top: 100px;background-color: powderblue;}
</style>
<div class="wrapper"><div class="box"></div>
</div>
  • 空的块级元素:如下示例,内容1 和 内容2 之间有200px的距离。
<style>div {margin-top: 100px;margin-bottom: 200px;}
</style><p>内容1</p>
<div></div>
<p>内容2</p>

格式化上下文

行内格式化上下文(Inline formatting context)

各行内框(inline boxes)一个接一个地排列,其排列顺序根据书写模式的设置来决定:

  • 对于水平书写模式,各个框从左边开始水平地排列
  • 对于垂直书写模式,各个框从顶部开始水平地排列
.horizontal {writing-mode: horizontal-tb; // 从左开始
}.vertical {writing-mode: vertical-rl; // 从上开始
}

块格式化上下文

块格式化上下文(Block Formatting Context,BFC) 是 Web 页面的可视 CSS 渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。形成独立的渲染区域,内部元素的渲染不会影响外界。

总结来说具有 BFC 特性的元素可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且 BFC 具有普通容器所没有的一些特性。

触发BFC的条件「常见」

  • 根元素(< html >)
  • 浮动元素(元素的 float 不是 none)
  • 绝对定位元素(元素的 position 为 absolute 或 fixed)
  • 行内块元素(元素的 display 为 inline-block、table-cells、flex)
  • overflow 值不为 visible 的块元素 (hidden、auto、scroll)

BFC的特性

  • BFC是独立容器,容器内部元素不会影响容器外部元素。
  • 计算BFC的高度时,浮动元素也参与计算。
  • BFC的区域不会与float的元素区域重叠。

注意:很多博客都会将属于同一个BFC的两个相邻盒子的margin会发生重叠认为是BFC的特性,不是不是!没有触发 BFC 也是如此排列的。BFC 可以解决这种重叠,但对于margin重叠,我们通常不解决,合理利用就好了。

BFC的常用案例:

1、解决 margin 重叠
  • 相邻子元素的重叠

内部的盒子会在垂直方向上一个接一个的放置,垂直方向上的距离由margin决定。BFC可以避免margin折叠,例子:

<style>.wrapper{border: 1px solid black;}.box {width: 200px;height: 200px;background-color: #999;}.box1 {margin-bottom: 100px;}.box2 {margin-top: 200px;}
</style><div class="wrapper"><div class="box1 box"></div><div class="box2 box"></div>
</div>

如下图,在普通文档流中,两个相邻容器的上下margin会重叠,并且取其最大的margin。

如果让其中一个盒子处于独立的BFC中,就不会重叠。如下图

<style>.wrapper{border: 1px solid black;}.wrapper2{overflow: hidden;}.box {width: 200px;height: 200px;background-color: #999;}.box1 {margin-bottom: 100px;}.box2 {margin-top: 200px;}
</style><div class="wrapper"><div class="wrapper2"><div class="box1 box"></div></div><div class="box2 box"></div>
</div>
  • 父子元素的margin重叠
<style>.wrapper{width: 200px;height: 200px;background: powderblue;overflow: hidden;}.box{width: 100px;height: 100px;margin-top: 100px;background: pink;}</style>
<div class="wrapper"><div class="box"></div>
</div>

下图1为没有触发BFC,box的margin-top溢出到父元素。下图2为触发了BFC,内部的元素不会影响外部。

2、撑开float父元素高度

计算BFC的高度时,浮动元素也参与计算。可以用此撑开父元素。

<style>.wrapper{border: 1px solid black;}.box{width: 100px;height: 100px;background: pink;float: left;}
</style>
<div class="wrapper"><div class="box"></div>
</div>

因为浮动会脱离普通流,形成浮动流,所以父级高度不会被子元素撑开。如下图

当触发BFC时,float元素会计入高度的计算中。

<style>.wrapper{border: 1px solid black;overflow: hidden;}.box{width: 100px;height: 100px;background: pink;float: left;}
</style>
<div class="wrapper"><div class="box"></div>
</div>
3、可以清除浮动

BFC的区域不会与float的元素区域重叠。所以可以用来清除浮动

<style>.box1{width: 100px;height: 100px;background: pink;float: left;}.box2{width: 200px;height: 200px;background: powderblue;}
</style>
<div class="box1"></div>
<div class="box2"></div>

结果如下图,可以看到,box2会和box1重叠出现。

当我们触发BFC之后,可以看到下图,并不会与float重叠

<style>.box1{width: 100px;height: 100px;background: pink;float: left;}.box2{width: 200px;height: 200px;background: powderblue;overflow: hidden;}
</style>
<div class="box1"></div>
<div class="box2"></div>
4、实现两栏、三栏布局
  • BFC的区域不会与float的元素区域重叠。这个特性也可以实现两栏布局。给固定栏设置固定宽度,给不固定栏开启BFC。
<style>.left{width: 100px;height: 100px;background: pink;float: left;}.right{height: 100px;background: powderblue;overflow: hidden;}
</style>
<div class="left"></div>
<div class="right"></div>

  • 三栏布局同理,左右固定,中间不固定。需要注意的是,center中间部分的div要放在left、right后面。
<style>.left {width: 100px;height: 100px;float: left;background: #ffc0cb;}.right {width: 100px;height: 100px;float: right;background: #ffc0cb;}.center{height: 100px;background: powderblue;overflow: hidden;}
</style>
<div class="left"></div>
<div class="right"></div>
<div class="center"></div>

5、防止 float 文字环绕。

没啥卵用,但是这是一个用处。

<style>.left {width: 100px;height: 100px;background: #ffc0cb;float: left;}p{width: 200px;background: powderblue;overflow: hidden;}
</style>
<div class="left"></div>
<p>你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界你好世界
</p>

我们经常用 float 来实现文字环绕的报纸效果,但如果你不想环绕…就可以触发 BFC 实现


希望对大家有用,记得点赞关注哦~

CSS 格式化上下文详解相关推荐

  1. html5边框顶格,CSS 三种定位方式以及格式化上下文详解 》 html5jscss

    常规流( Normal flow ) 之称之为常规流,是因为这是相对于后面的浮动和绝对定位的一个概念,浮动和绝对定位元素都脱离了当前的常规流. 在 CSS2.1中,常规流包括块框( block box ...

  2. css层叠上下文详解,CSS定位(层叠上下文)

    前面花大力气介绍了布局,现在讲一讲CSS的定位. 定位是什么? 定位跟布局有啥关系?答案是没有关系,定位是指CSS在立体的角度的堆叠的情况,是垂直于屏幕的. 常常会有一个疑惑,CSS中,我给其中的一个 ...

  3. CSS属性vertical-align详解(CSS之五)

    CSS属性vertical-align详解 作用对象 vertical-align的意思是在垂直方向进行对齐.它主要对以下属性的元素有效 inline元素.inline-block元素和普通的文本. ...

  4. [转]CSS hack大全详解

    转自:CSS hack大全&详解 1.什么是CSS hack? CSS hack是通过在CSS样式中加入一些特殊的符号,让不同的浏览器识别不同的符号(什么样的浏览器识别什么样的符号是有标准的, ...

  5. CSS vw vh详解

    CSS vw vh详解 简介 适配原理 简介 vw vh是一种相对单位 相对视口的宽度计算结果 vw viewport width 1vw=1/100视口宽度 vh viewport height 1 ...

  6. css background-attachment属性详解

    css background-attachment属性详解 background-attachment属性用途 background-attachment属性用于设置背景图片定位的参照方式 backg ...

  7. html右侧浮动菜单,HTML+CSS:css元素浮动详解,使用浮动制作导航栏菜单

    原标题:HTML+CSS:css元素浮动详解,使用浮动制作导航栏菜单 今天这篇文章我们来说一下css的浮动属性(float),给块状元素添加float属性可以使其转变为行内元素,也就是我们所说标签对象 ...

  8. CSS盒子模型详解(清除无序列表的项目符号)

    CSS盒子模型详解(清除无序列表的项目符号) 网页的布局过程 准备好相关的网页元素(盒子) 利用CSS设置好盒子的样式以及在网页中的摆放位置 往盒子里面装东西 盒子模型(box model) 网页中, ...

  9. 基于HTTP浏览器缓存机制全面解析看Table表格的css样式代码详解

    文章来源: 学习通http://www.bdgxy.com/ 普学网http://www.boxinghulanban.cn/ 智学网http://www.jaxp.net/ 漂亮的table表格样式 ...

最新文章

  1. Python 编程语言的核心是什么?
  2. R使用abline()函数在图中添加额外的直线
  3. dispatchTouchEvent onInterceptTouchEvent onTouchEvent
  4. 什么是.hpp文件?
  5. 两平面平行方向向量关系_立体几何平行证明的四大必杀绝技------赞!很赞!!非常赞!!!...
  6. Android中图片优化之webp使用
  7. Spring Boot - 修改Tomcat默认的8080端口
  8. mysql---复杂的sql语句join的使用(left join,right join)
  9. 使用 C++ 处理 JSON 数据交换格式
  10. Tornado之异步authenticated
  11. mysql 系统序列号_mysql 序列号
  12. OpenPose人体姿态估计详细配置(win10)
  13. 无纸化办公中如何保护数据安全
  14. 线性代数——线性方程组和矩阵(Linear and Matrices)
  15. gyp ERR! stack Error: Can't find Python executable python, you can set the PYT HON env variable.
  16. 2021-2027全球及中国气提系统行业研究及十四五规划分析报告
  17. 基于Matlab的DSB调制解调,课程设计(论文)-基于MATLAB的DSB调制与解调分析.doc
  18. python中怎么打印出表格_怎么使用python脚本实现表格打印?
  19. 播放器初始化配置重点
  20. 我改变世界、我已看透、我不再是个程序员-IT创世诸神如是说

热门文章

  1. 中国剩余定理(孙子定理)详解
  2. 苹果怎么换字体_苹果手机电池容量还剩80,什么时候换很省钱,听卖手机小哥怎么说...
  3. Rust裸指针的安全性实例
  4. 计算机无线模块怎样关闭,开启或关闭计算机的无线网卡
  5. 宏碁非凡 Go2023参数配置 宏碁非凡 Go评测
  6. [Java基础案例](菜单小程序、1~100之间的素数之和、验证码生成、数组排序、2000 年到现在的闰年、猜数游戏、空心菱形)
  7. 学习笔记-ARIMA模型
  8. fatal error: cstdio: 没有那个文件或目录
  9. 01-防火墙智能选路
  10. 四、Eureka注册中心集群配置