Web前端开发之CSS学习笔记6—BFC(块级格式化上下文)

目录

1.BFC:块级格式化上下文(Block Formatting Contexts)

2.BFC的作用

2.1 解决外边距问题

2.1.1 解决兄弟元素之间的margin塌陷

2.1.2 解决父子盒子之间margin塌陷问题

2.2 解决浮动问题

解决办法1:float:left;

解决办法2:clear清除浮动

解决办法3:父元素设置overflow: hidden;

2.3 阻止文本环绕


1.BFC:块级格式化上下文(Block Formatting Contexts)

我们常说的文档流其实分为==定位流、浮动流和普通流==三种。而普通流其实就是指BFC中的FC。
FC是formatting context的首字母缩写,直译过来是格式化上下文,它是页面中的一块渲染区域,有一套渲染规则,决定了其子元素如何布局,以及和其他元素之间的关系和作用。

例子:BFC的对齐方法

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>BFC的对齐方式</title>
		<style type="text/css">
			.container {
				width: 500px; 
				height:300px;
				border: 2px solid Oblack;
			}
			#one {
				width:400px; 
				height:100px;
				background-color: #99d198; 
			}
			#two {
				width:200px; 
				height: 50px;
				background-color: #8cb3d5; 
			}
			#three {
				width:550px; 
				height:100px;
				background-color: #f59a93; 
			}
		</style>
	</head>
	<body>
		<div class="container">
			<div id="one"></div>
			<div id="two"></div>
			<div id="three"></div>
		</div>
	</body>
</html>

 

如果满足下面任意条件,就会自动创建一个新的BFC:

float属性的值不为none

position属性的值不为static或relative

overflow属性的值不为visible

display属性的值为flex,inline-flex,inline-block,table-cell或table-caption

为什么新增BFC

因为同一个BFC里面会存在缺陷,新增BFC可以解决。

2.BFC的作用

2.1 解决外边距问题

margin塌陷解决办法:overflow属性的值不为visible。

可设置overflow: hidden;

2.1.1 解决兄弟元素之间的margin塌陷

问题:设置p的外边距为10px,但是两个p之间距离不是20px,而是10px。

例子:margin塌陷。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>margin塌陷</title>
		<style type="text/css">
			.container {
				background-color:gray ; 
				overflow: hidden;
			}
			P{
				background-color:#f5ef97; 
				margin: 10px 10px;
			}
		</style>
	</head>
	<body>
		<div class="container">
			<p>好好学习</p >
			<p>天天向上</p >
		</div>
	</body>
</html>

解决办法:overflow属性的值不为visible时自动创建新的BFC。

例子:创建新BFC(就是第二个div),解决margin塌陷。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>创建新BFC解决margin塌陷</title>
		<style type="text/css">
			.container {
				background-color:gray ; 
				overflow: hidden;
			}
			P{
				background-color:#f5ef97; 
				margin: 10px 10px;
			}
			.newBFC{
				overflow: hidden; /*overflow属性的值不为visible时自动创建新的BFC*/
			}
		</style>
	</head>
	<body>
		<div class="container">
			<p>好好学习</p >
			<div class="newBFC">
				<p>天天向上</p >
			</div>
		</div>
	</body>
</html>

2.1.2 解决父子盒子之间margin塌陷问题

问题: 当给box2层增加样式margin-top:50的时候,并没有看到父盒子与子盒子之间会有间距50px的距离,而是在父盒子上面会发现50px的间距。

例子:父子盒子margin塌陷

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>父子盒子margin塌陷</title>
		<style type="text/css">
			.box1 {
				width: 300px;
				height: 300px;
				background: lightgrey;
			}
			.box2 {
				width: 200px;
				height: 200px;
				background: pink;
				margin-top: 50px;
			}
		</style>
	<body>
		<div class="box1">
			<div class="box2">
			</div>
		</div>
	</body>
</html>

解决办法:给父元素添加一个overflow: hidden;

例子:解决margin塌陷

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>父子盒子margin塌陷</title>
		<style type="text/css">
			.box1 {
				width: 300px;
				height: 300px;
				background: lightgrey;
				overflow: hidden;
			}
			.box2 {
				width: 200px;
				height: 200px;
				background: pink;
				margin-top: 50px;
			}
		</style>
	<body>
		<div class="box1">
			<div class="box2">
			</div>
		</div>
	</body>
</html>

 

2.2 解决浮动问题

浮动缺陷:块元素之间会覆盖彼此

解决办法有几个,最常见的用法就是在父元素上设置overflow: hidden样式,把父元素设为BFC就可以清理子元素的浮动了。

问题:浮动的块元素覆盖其他元素

例子:块元素覆盖

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>容纳浮动元素</title>
		<style type="text/css">
			.container{
				background-color: lightgray;
			}
			p{
				float: left; /*块元素的浮动会覆盖块元素*/
				margin: 10px;
				background-color:#f1ea9d;
			}
		</style>
	</head>
	<body>
		<div class="container">
			<p>好好学习</p>
			<p>天天向上</p>
		</div>
	</body>
</html>

div的设置没有显现出来:

 

解决办法1:float:left;

例子:解决覆盖缺陷

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>容纳浮动元素</title>
		<style type="text/css">
			.container{
				background-color: lightgray;
				float: left; /*调整被p元素浮动遮盖的缺陷*/
			}
			p{
				float: left;
				margin: 10px;
				background-color:#f1ea9d;
			}
		</style>
	</head>
	<body>
		<div class="container">
			<p>好好学习</p>
			<p>天天向上</p>
		</div>
	</body>
</html>

浮动会破坏文档流结构,所以上面块级元素并没有另起一行,而是跟在后面。

解决办法2:clear清除浮动

设置了浮动就会破坏文档流结构,影响后边的布局,此时在设置清除浮动便可解决这一问题。

设置了clear:both的当前元素会把前边元素中设有浮动属性的元素,当做没设浮动一样来看待,以此来消除其对自己的影响。

例子:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>容纳浮动元素</title>
		<style type="text/css">
			.container{
				background-color: lightgray;
			}
			p{
				float: left; /*块元素的浮动会覆盖块元素*/
				margin: 10px;
				background-color:#f1ea9d;
			}
			.clear{
				clear: both;  /*清除浮动*/
			}
		</style>
	</head>
	<body>
		<div class="container">
			<p>好好学习</p>
			<p>天天向上</p>
			<div class="clear"></div>
		</div>
	</body>
</html>

解决办法3:父元素设置overflow: hidden;

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>容纳浮动元素</title>
		<style type="text/css">
			.container{
				background-color: lightgray;
				overflow: hidden;/*解决浮动覆盖问题*/
			}
			p{
				float: left; /*块元素的浮动会覆盖块元素*/
				margin: 10px;
				background-color:#f1ea9d;
			}
		</style>
	</head>
	<body>
		<div class="container">
			<p>好好学习</p>
			<p>天天向上</p>
		</div>
	</body>
</html>

2.3 阻止文本环绕

例子:文本环绕

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>阻止文本环绕</title>
		<style type="text/css">
			img{
				width: 100px;
				float: left;
			}
		</style>
	</head>
	<body>
		<img src="tu11.jpg" />
		<div>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Numquam voluptas eius voluptates illo. Libero pariatur fugit ipsum ducimus mollitia odit tenetur officia explicabo. Modi rem in magnam qui earum harum?</div>
	</body>
</html>

去除环绕的解决办法:父元素overflow: hidden; 

例子:阻止文本环绕

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>阻止文本环绕</title>
		<style type="text/css">
			img{
				width: 100px;
				float: left;
			}
			div{
				overflow: hidden;
			}
		</style>
	</head>
	<body>
		<img src="tu11.jpg" />
		<div>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Numquam voluptas eius voluptates illo. Libero pariatur fugit ipsum ducimus mollitia odit tenetur officia explicabo. Modi rem in magnam qui earum harum?</div>
	</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值