css中的浮动以及清除浮动

75 阅读2分钟

本文主要说明float clear 区块格式化上下文(Block Formatting Context,BFC) 相关知识

[BFC](区块格式化上下文 - CSS:层叠样式表 | MDN (mozilla.org))

float:指定一个元素应沿其容器的左侧或右侧放置,允许文本和内联元素环绕它。该元素从网页的正常流动(文档流)中移除

clear:clear CSS 属性指定一个元素是否必须移动 (清除浮动后) 到在它之前的浮动元素下面。clear 属性适用于浮动和非浮动元素

BFC:是 Web 页面的可视 CSS 渲染的一部分,是块级盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域

触发条件:

  • 文档的根元素(<html>)。
  • 浮动元素(即 float 值不为 none 的元素)。
  • 绝对定位元素(position 值为 absolute 或 fixed 的元素)。
  • 行内块元素(display 值为 inline-block 的元素)。
  • 表格单元格(display 值为 table-cell,HTML 表格单元格默认值)
  • overflow 值不为 visible 或 clip 的块级元素。
  • display 值为 flow-root 的元素。

格式化上下文影响布局,通常,我们会为定位和清除浮动创建新的 BFC,而不是更改布局,因为它将:

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>Document</title>
		<style>
			.main {
				width: 800px;
				/* 如果不给父元素设置高 则内部子元素设置了浮动后 因为脱离了原来的文档流 所以会塌陷 --需要手动解决*/
				/* height: 300px; */
				border: 1px solid #ccc;
				overflow: hidden;
			}
			.child1 {
				width: 200px;
				height: 100px;
				background-color: aqua;
				float: right;
			}
			.child2 {
				width: 200px;
				height: 100px;
				background-color: bisque;
				float: right;
			}
			/* 当 两个child 都添加浮动时 已经脱离了文档流 所以 p标签会占据上方位置 */
			p {
				background-color: aquamarine;
				clear: right;
				/* 当我清除浮动时 left  right  both 元素会占用浮动元素下方位置 */
				/* 官方定义 clear CSS 属性指定一个元素是否必须移动 (清除浮动后) 到在它之前的浮动元素下面。clear 属性适用于浮动和非浮动元素 */
			}
			.clear {
				clear: both;
			}
			/* .main::after {
				content: '';
				display: block;
				clear: both;
			} */
			.clearfix::after {
				content: '';
				display: block;
				clear: both;
			}
			/* 如果声明重复了 选项会合并 后面的会覆盖前面的  */
			/* .main {
				height: 500px;
			} */
		</style>
	</head>
	<body>
		<div class="main">
			<div class="child1"></div>
			<div class="child2"></div>
			<!-- <p>这是一段文字</p> -->
			<!-- <div class="clear"></div> -->
		</div>

		<!-- 解决父元素塌陷问题
            1 添加div 设置clear
            2 给父元素添加伪元素 设置content display clear
            3 将伪元素单独提取成一个类 添加类名即可
            3 使用 overflow:hidden
        -->
	</body>
</html>

防止外边距重叠

在这个示例中,我们将第二个 <div> 包裹在另外一个 <div> 之中,以创建一个新的 BFC,防止外边距重叠。 重点是在需要阻止重叠的盒子外面添加一个盒子!

<div class="blue"></div>

<div class="outer">
  <div class="red"></div>
</div>
.blue,
.red {
  height: 50px;
  margin: 10px 0;
}

.blue {
  background: blue;
}

.red {
  background: red;
}

.outer {
  overflow: hidden;
  background: transparent;
}