CSS的绝对定位,你真的明白吗?
- 绝对定位是相对于谁确定位置的?有一句口诀:子绝父相,子绝父绝。意思就是,开启了绝对定位的子元素根据它的开启了相对定位或者绝对定位的父元素而确定位置。
- 事实上,绝对定位的元素是根据包含块确定位置的,包含块就是离他最近的开启了定位的祖先元素。
- 但是,如果祖先元素没有开启过定位,那就相对于初始包含块定位
什么是初始包含块?上代码!
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
html {
width: 500px;
height: 500px;
border: 1px solid red;
margin: 100px 0 0 100px;
}
body {
width: 300px;
height: 300px;
border: 1px solid #000;
margin: 100px 0 0 100px;
}
div {
width: 100px;
height: 100px;
position: absolute;
background-color: #bfa;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
上图,红边框的盒子是html,黑边框的盒子是body,因为div设置了绝对定位但是并未给其left、top、right、bottom赋值,它们的默认值是auto,所以div在原地不动
当给div的left 和 top赋值为0时
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
html {
width: 500px;
height: 500px;
border: 1px solid red;
margin: 100px 0 0 100px;
}
body {
width: 300px;
height: 300px;
border: 1px solid #000;
margin: 100px 0 0 100px;
}
div {
width: 100px;
height: 100px;
background-color: #bfa;
position: absolute;
left: 0;
top: 0;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
可见,div定位在了页面的左上角,也就是(0,0)点的位置,那么怎么证明初始包含块的存在呢?
这次我们移除html的mrgin,将html的height设置为100%,加上背景色之后再看
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
html {
width: 500px;
height: 100%;
border: 1px solid red;
background: yellow;
}
body {
width: 300px;
height: 300px;
border: 1px solid #000;
margin: 100px 0 0 100px;
}
div {
width: 100px;
height: 100px;
background-color: #bfa;
position: absolute;
left: 0;
top: 0;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
可见浏览器的视口全部为黄色,且因为html有上下边框的原因,比初始包含块多了2px,浏览器才出现了垂直方向上的滚动条,经测试,去掉html的上下边框,滚动条消失,事实上初始包含块是浏览器视口的第一屏
由此可知,初始包含块是一个和视口等高等宽的透明矩形。