初始容纳块、初始包含块、第一屏

        在定位的时候,大家都听说过子绝父相,但如果是子绝父不相的情况嘞,大家有没有考虑过他是基于什么来进行定位的;

        首先先说一下初始容纳块是什么东西,在css权威指南中,对于浮动元素,容纳块是最近的祖辈块元素。对于绝对定位(absolute)的元素,容纳块为最近的非static定位的父级块元素。而初始容纳块就是页面的第一屏;

下面我来通过代码的形式,一一来解释这个问题。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style>
			*{
				margin: 0;
				padding: 0;
			}
			
			html{
				width: 500px;
				height: 500px;
				margin-left: 100px;
				border: 10px solid black;
				background-color: red;
				/*html比较特殊,特殊原因它的部分属性作用的不是自己 而是document*/
				/*doucument是网页最外层的元素,html文档当中没有任何标签标示它*/
			}
			
			body{
				width: 300px;
				height: 3000px;
				border: 10px solid yellow;
				background-color: blue;
				/*body比较特殊,单独的给Body设置某些属性,作用的不是自己 而是document*/
				/*doucument是网页最外层的元素,html文档当中没有任何标签标示它*/
			}
					
			#box{
				position: absolute;
				left: 0;
				top: 0;
				width: 200px;
				height: 200px;
				background-color: red;
			}
			
			/*初始包含块:和浏览器第一屏大小一致的一个块状结构,称作初始包含块,元素子绝父不相的时候
			 其实相对的是初始包含块去做的定位,不是body也不是html也不是视口
			 * */
			
			/*
			 以后,打开浏览器最外层的结构,首先是document,接着是初始包含块 , HTML , body
			 
			 */
		</style>
	</head>
	<body>
		<div id="box"></div>
	</body>
</html>

        从这里可以看出,我在div中设置了定位,且top和left都为0;然后我将HTML使用margin将其往左顶了一些,可以看到我的div并没有跟着HTML和body一起走,所以说他并不是基于HTML和body进行定位的。那么继续看代码,他到底是对于哪来定位;

 

#box {
    position: absolute;
    left: 0;
    bottom: 0;
    width: 200px;
    height: 200px;
    background-color: red;
}

         我将biv的top换为bottom,他就直接跑到当前视口的最下面,看下面的图,注意滚动条;

 

        将页面滚动,那么就可以发现这个div,他就定在了这,并没有根据视口和页面进行定位,若根据视口定位的话,他会一直定在页面的左下角;若是基于页面进行定位那么,他这个div应该会直接在页面的最下方,但都没有,所以可以由此推出,他并不是基于视口和页面进行定位。

        然后现在回去看一开始说的这个定义:对于绝对定位(absolute)的元素,容纳块为最近的非static定位的父级块元素。而初始容纳块就是页面的第一屏;

        一步一步来分析这句话,对于绝对定位的元素,也就是这个div,当他设置了绝对定位后,他就会去找position的值不是static的父级元素;这里有两个关键词position父级元素,咱们用代码来解释:

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        html {
            width: 500px;
            height: 500px;
            margin-left: 100px;
            border: 10px solid black;
            background-color: pink;
        }

        body {
            width: 300px;
            height: 3000px;
            border: 10px solid yellow;
            background-color: rebeccapurple;
            position: relative;
        }

        #box {
            position: absolute;
            left: 0;
            bottom: 0;
            width: 200px;
            height: 200px;
            background-color: red;
        }
    </style>
</head>

<body>
    <div id="box"></div>
</body>

</html>

        我将body设置了position;那么现在我的div就找到了定位目标,我就会基于这个目标来进行定位;

         那么若是我的body没有定位,HTML有定位,那么他会基于谁来定位呢?

 html {
    width: 500px;
    height: 500px;
    margin-left: 100px;
    border: 10px solid black;
    background-color: pink;
    position: relative;
}

        很明显,现在的div是基于HTML来定位了,所以现在也就验证了容纳块为最近的非static定位的父级块元素的这句话。

        所以现在再回头来看,当我的元素在开启定位后,他会去寻找最近的父级,且其定位不为static值的父级块状元素,若一直找,都没找到,那么他就会基于初始容纳块(页面的第一屏)来进行定位。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jason_HeSL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值