块格式化上下文(Block Formatting Context,BFC) 是 Web 页面的可视化 CSS 渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其余元素交互的区域。css
下列方式会建立块格式化上下文:html
<html>
)float
不是 none
)position
为 absolute
或 fixed
)display
为 inline-block
)display
为 table-cell
)display
为 table-caption
)display
为 table
、inline-table
)display
值为 flow-root
的元素(兼容性很差)display
为 flex
或 inline-flex
元素的直接子元素)display
为 grid
或 inline-grid
元素的直接子元素)overflow
值不为 visible
的块元素上述建立BFC的CSS列为如下几类:布局
html
根元素float
(不为 none
便可)
left
right
position
absolute
fixed
display
inline-block
flex、inline-flex
grid、inline-grid
table
、table-cell
、table-caption
flow-root
块格式化上下文对浮动定位(参见 float)与清除浮动(参见 clear)都很重要。学习
总结:flex
高度坍塌是指父元素原本应该包括子元素的高度,可是实际上父元素比子元素的高度要小。ui
<!DOCTYPE html>
<html lang="en">
<head>
<style> .container { margin-left: 50px; background: red; } .box1 { float: left; width: 200px; height: 200px; background-color: blue; } .box2 { width: 400px; height: 100px; background: cyan; } </style>
</head>
<body>
<div class="container">
<div class="box1"></div>
<div class="box2"></div>
</div>
</body>
</html>
复制代码
一、box1
浮动以后,父元素的高度就坍塌了,解决办法是让父元素触发 BFC ,这样 BFC 内的元素就没法影响到外面了,给 container
加上 overflow: auto;
便可。加上以后变成这样了。spa
二、也能够经过给 container
添加 ::after
伪元素,清除左右浮动来防止坍塌。翻译
.container::after {
content: "";
display: block; /* 不能少 */
clear: left;
}
复制代码
三、还能够经过在父元素的最后添加一个块级元素并清除浮动。3d
<div class="container">
<div class="box1"></div>
<div class="box2"></div>
<div style="clear: both;"></div>
</div>
复制代码
四、图中有另一个问题是 box2
被 box1
盖住了一部分,这是由于 box1
浮动起来了,显然只须要清除浮动便可。使用 BFC 清除,对应的规则是 浮动盒区域不叠加到BFC上,给 box2
添加 overflow: auto;
以后显示正常。code
五、一样咱们也能够经过 clear:both;
来清除浮动,只须要给 box2
添加 clear: both;
,可是效果和 BFC 清除有点不同,由于 clear: both;
表示元素下移清除左右浮动。
块级元素的上外边距和下外边距有时会合并(或折叠)为一个外边距,其大小取其中的最大者,这种行为称为外边距折叠(margin collapsing),有时也翻译为外边距合并。注意浮动元素和绝对定位元素的外边距不会折叠。
外边距折叠的基本状况:
相邻元素之间 毗邻的两个元素之间的外边距会折叠(除非后一个元素须要清除以前的浮动)。
父元素与其第一个或最后一个子元素之间 若是在父元素与其第一个子元素之间不存在边框、内边距、行内内容,也没有建立块格式化上下文、或者清除浮动将二者的 margin-top 分开;或者在父元素与其最后一个子元素之间不存在边框、内边距、行内内容、height、min-height、max-height 将二者的 margin-bottom 分开,那么这两对外边距之间会产生折叠。此时子元素的外边距会“溢出”到父元素的外面。
从上面一段话总结下能够去除外边距折叠的方法:
<span>
匿名元素
;display: flex
的块级元素);overflow: auto;
等);外边距折叠的一些规则:
如下面代码为例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<style> .container { background-color: deeppink; } .child { } div { background-color: cyan; } body { margin: 0; background-color: yellow; } </style>
</head>
<body>
<div class="container" style="margin-top: 10px;">
<div class="child" style="margin-top: 50px;">word</div>
</div>
</body>
</html>
复制代码
因为外边距折叠且外边距都为正,因此取大的 50px
一、给 container
添加 border
,成功去除折叠。
.container {
background-color: deeppink;
border: 1px solid #000000;
}
复制代码
二、给父元素增长 padding
,正常了。
.container {
background-color: deeppink;
padding: 1px;
}
复制代码
三、给父子元素之间添加内联或者匿名元素,添加一个
,去除折叠了,可是新增的元素会占据额外的空间,因此不推荐。
<div class="container" style="margin-top: 10px;">
<div class="child" style="margin-top: 50px;">word</div>
</div>
复制代码
四、父子元素之间添加触发了 BFC 的元素,正常了。
<div class="container" style="margin-top: 10px;">
<div style="display: flex;"></div>
<div class="child" style="margin-top: 50px;">word</div>
</div>
复制代码
五、父元素触发 BFC,正常了。
.container {
background-color: deeppink;
overflow: auto;
}
复制代码
今天的文章就到这里,感谢阅读~
欢迎你们关注个人掘金和公众号,学习之路有人交流讨论会轻松不少~