CSS进阶(八)——包含块/BFC+IFC

1 containing block(包含块)

1.1 什么是包含块

  • 简单来说,包含块就是“包含自己的那块元素”,元素的“包含块”决定了元素的大小和定位。
  • “包含块”是一个相对的概念,并不是说父级元素就是包含块。比如说,绝对布局中,父级元素是position:relative;,子级元素是position:absolute;,那么此时父级元素是子级元素的包含块,自己元素的大小和定位由父级元素决定;但positioin:fixed固定定位元素的包含块是浏览器窗口。

1.2 包含块的判断以及范围

根元素的包含块

  • <html>根元素是页面最顶端的元素,它没有父元素,但也有包含块,叫做“初始包含块initial containing block”。

固定元素的包含块

  • 如果元素是固定定位position:fixed,那么它的包含块是当前的可视窗口(即当前浏览器窗口)。

静态/相对定位元素的包含块

  • 如果元素是静态或相对定位position:static/relative,那它的包含块是最近的块级(display:blockdisplay:inline-blockdisplay:table-cell)祖先元素。

绝对定位元素的包含块

  • 如果元素是绝对定位position:absolute,那么它的包含块是最近的position属性值为非static的祖先元素,该祖先元素可以是块元素也可以是行内元素。
  • 如果元素找不到position属性值为非static的祖先元素,那么它的包含块就是<html>根元素,这就是为什么在默认情况下,绝对定位元素是相对于浏览器窗口来定位的原因。

包含块的范围

  • 包含块的范围分为两种情况:
    • 如果祖先元素是块元素,那么包含块的范围由祖先元素的padding edge(内边距的边界)形成;
    • 如果祖先元素是行内元素,那么包含块的范围由祖先元素的direction(方向)属性来决定;

2 BFC和IFC

2.1 基本概念

  • 页面的任何元素都可以看成是一个盒子(box),盒子分两种类型:块盒子(block-level box)和行内盒子(inline-level box)。
说明:除了块盒子( block-level box)和行内盒子( inline-level box)之外,CSS3还增加了一个 run-in box盒子。
  • 不同的元素和元素的display属性决定盒子的类型。不同的盒子类型,会根据自己的格式上下文(formatting context)作为渲染规则:
    • 块盒子(block-level box),即display属性为blocktablelist-item的元素,参与块级格式上下文(Block Formatting Context,简称BFC);
    • 行内盒子(inline-level box),即display属性为inlineinline-blockinline-table的元素,参与行级格式上下文(Inline Formatting Context,简称IFC);

2.2 什么是BFC

  • BFCBlock Formatting Context(块级格式上下文),是块盒子(block-level box)的渲染规则,它是块盒子内部的一个独立渲染区域,这个区域规定了盒子内部如何布局,并且这个区域具有封闭性,与外部区域毫不相关。

创建BFC

  • 根据W3C标准对BFC的定义,具备以下任意条件的元素会创建一个新的BFC:
    • 根元素;
    • float:left/right的浮动元素;
    • position:absolute/fixed的定位元素;
    • display属性值为inline-blocktable-captiontable-cell的块元素;
    • overflow:auto/hidden/scroll的元素;
注意: display:block/table的元素会参与BFC,但不会创建BFC。

BFC的特点

  • 根据W3C标准,总结BFC的渲染规则如下:
    • BFC内部,元素沿垂直方向逐个排列;
    • BFC内部,垂直相邻的两个元素的间距由margin属性来决定,且margin-topmargin-bottom会叠加;
    • BFC内部,元素的左外边界(margin-left)紧贴容器的左边(border-left),即便是浮动元素也是如此;
    • BFC是页面中一个隔离的盒子,BFC内部的子元素不会影响到外面的元素;
    • 计算一个BFC的高度时,其内部的浮动元素高度也会参与计算;

2.3 BFC的用途

  • 创建BFC来避免垂直外边距叠加
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			.wrapper{
				width: 200px;
				border: 1px dashed gray;
				/*为wrapper创建BFC*/
				overflow: hidden;
			}
			
			/*为B创建BFC*/
			#bfc-box{
				overflow: hidden;
			}
			
			#A,#B{
				height: 60px;
				line-height: 60px;
				text-align: center;
				font-size: 30px;
				color-interpolation: #000;
				background-color: purple;
			}
			
			#A{
				margin-bottom: 20px;
			}
			
			#B{
				margin-top: 30px;
			}
		</style>
	</head>
	<body>
		<div class="wrapper">
			<!-- A处于为wrapper的BFC -->
			<div id="A"></div>
			<!-- B处于为bfc-box的BFC -->
			<div id="bfc-box">
				<div id="B"></div>
			</div>
		</div>
	</body>
</html>
  • 创建BFC来清除浮动
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>创建BFC清除包含的浮动</title>
		<style type="text/css">
			.wrapper{
				width: 200px;
				border: 1px dashed gray;
				/*由于父容器没定义高度,会造成父容器高度塌陷,通过创建BFC解决,因为BFC在计算自身高度时会把子元素的高度计算进去*/
				overflow: hidden;
			}
			
			#first,#second{
				width: 80px;
				height: 40px;
				border: 1px solid brown;
			}
			
			#first{
				float: left;
			}
			
			#second{
				float: right;
			}
		</style>
	</head>
	<body>
		<div class="wrapper">
			<div id="first"></div>
			<div id="second"></div>
		</div>
	</body>
</html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>创建BFC避免文字环绕</title>
		<style type="text/css">
			.wrapper{
				width: 400px;
				height: 200px;
				border: 1px solid gray;
				padding: 10px;
			}
			
			img{
				width: 40px;
				height: 40px;
				float: left;
			}
			
			#content{
				background-color: papayawhip;
				/*由于浮动的img层叠级别比普通文档流高,创建BFC后不会和同级的浮动元素重叠*/
				overflow: hidden;
			}
		</style>
	</head>
	<body>
		<div class="wrapper">
			<img src="../img/weibo.png"/>
			<div id="content">【核电站事故102岁老人拒绝避难自杀 东电被下赔偿命令】东京电力福岛第一核电站事故发生后,在福岛县饭馆村自杀的102岁男性之遗属,向东电要求精神损失费等损害赔偿的诉讼判决,已于20日在福岛地方法院进行。判决命令东电支付1520万日元(约合人民币89万元)</div>
		</div>
	</body>
</html>
  • BFC创建自适应两列布局
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			#sidebar{
				float: left;
				width: 100px;
				height: 150px;
				background-color: aliceblue;
			}
			
			#content{
				height: 200px;
				width: auto;
				background-color: #CCCCCC;
				/*创建BFC使得浮动元素不会覆盖自己*/
				overflow: hidden;
			}
		</style>
	</head>
	<body>
		<div id="sidebar"></div>
		<div id="content"></div>
	</body>
</html>

 

3 stacking content(层叠上下文)

  • 理解层叠上下文,有助于深入理解浮动和定位布局,以及深入理解z-index对元素的堆叠顺序的控制。
  • 层叠上下文包含两个概念:层叠上下文(stacking content)和层叠级别(stacking level)。

3.1 什么是层叠上下文

  • 如果一个元素具备以下任意一个条件(不考虑CSS3),那么该元素将创建一个新的层叠上下文:
    • 根元素 :<html>元素会创建“根层叠上下文”;
    • z-index属性值为非auto的定位元素 :在元素只有通过z-index属性会使创建层叠上下文;

3.2 什么是层叠级别

  • 有没有想过一个问题,z-index属性为一个元素创建了层叠上下文,那么该元素的背景色、浮动的子元素、定位的子元素等,谁在上谁在下,应该遵循什么样的规则来堆叠呢?而层叠级别就是针对同一个层叠上下文的层叠规则。
注意:层叠上下文和层叠级别是两个不同的概念
  • 层叠级别的优先级由高到低排序:
    • z-index值为正整数的子元素;
    • z-index值为0的子元素;
    • 普通文档流的行内盒子(inline-level box):行内元素是内容,块元素是布局容器,所以内容更重要,层叠级别也更高;
    • 浮动盒子:非定位的浮动元素;
    • 块盒子:普通文档流下的块盒子(block-level box);
    • z-index值为负整数的子元素;
    • 背景和边框:当前层叠上下文的backgroundborder属性是装饰作用,层叠级别也最低;

3.3 层叠上下文的特点

  • 一个元素在z轴的堆叠顺序由“层叠上下文”和“层叠级别”两个因素决定:
    • 同一个层叠上下文中,比较的是“内部元素层叠级别”,级别大的元素显示在上,级别小的元素显示在下;
    • 同一个层叠上文如果层叠级别相同,则遵循“后来者居上”原则,比如z-index值相同时,后面的元素堆叠在上面;
    • 不同的层叠上下文,比较的是“父级元素的层叠级别”;

猜你喜欢

转载自my.oschina.net/chengxiancheng/blog/1634207