- 首先你必须知道的是:
top
、right
、bottom
、left
这四个属性要生效的话,必须得设置相对定位/绝对定位
,即position:relative;
或者position:absolute;
,也就是说top
、right
、bottom
、left
是为相对定位/绝对定位
而生的。 - 子绝父相就是:子元素为绝对定位(
position:absolute;
),父元素为相对定位position:relative;
。例如A为子元素,那么父元素B必须包含A,也就是说AB一定是嵌套关系(父子关系)
,不可以是兄弟关系。
A为浏览器(可以理解为窗口、可视区域、代码中的body标签) 浏览器中有B, B嵌套了C,C嵌套了D,D设置了绝对定位:
情况一:
如果B设置了相对定位,C也设置了相对定位,那么在D中设置的位置(top\right\bottom\left)是相对于C来说的,此时和B一点关系都没有
情况二:
如果B设置了相对定位,C没有设置相对定位,那么在D中设置的位置(top\right\bottom\left)是相对B来说的,此时和C一点关系都没有
情况三:
如果B没有设置相对定位,C设置了相对定位,那么在D中设置的位置(top\right\bottom\left)是相对C来说的,此时和B一点关系都没有
情况四:
如果B没有设置相对定位,C也没有相对定位,那么在D中设置的位置(top\right\bottom\left)是相对于浏览器A来说的。
以上内容总结:D设置的位置(top\right\bottom\left) 只和 距它最近的设置了相对定位的父类
有关,如果父类没有设置相对定位,则和浏览器(body标签)产生关系。即:子绝父相符合就近原则
情况一:
事例
- 事例代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>子绝父相</title>
<meta name="description" content="子绝父相测试" />
<meta name="Keywords" content="子绝父相测试" />
</head>
<style type="text/css">
/*清除浏览器默认间距 */
* {
margin: 0;
padding: 0;
}
.b{
position: relative;
background-color: red;
width: 400px;
height: 400px;
margin: 100px 0px 0px 100px;
/*解决外边距塌陷的问题: 父元素嵌套子元素,子元素设置了上或下外边距。
例如margin-top:10px或者margin-bottom:10px或者margin:10px 0 20px 0,
就会造成父元素也跟着子元素向下或者向上移动的问题,实际上父元素并没有写任何上或下外边距边距的代码。*/
overflow: hidden;
}
.c{
position: relative;
background-color: blue;
width: 200px;
height: 200px;
margin: 50px 0 0 50px;
}
.d{
position: absolute;
background-color: orange;
width: 40px;
height: 40px;
top:100px;
left: 100px;
}
</style>
<body>
<div class="b">
<div class="c">
<div class="d">
我是D
</div>
</div>
</div>
</body>
</html>
-
事例效果截图
情况二:
事例
- 事例代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>子绝父相</title>
<meta name="description" content="子绝父相测试" />
<meta name="Keywords" content="子绝父相测试" />
</head>
<style type="text/css">
/*清除浏览器默认间距 */
* {
margin: 0;
padding: 0;
}
.b{
position: relative;
background-color: red;
width: 400px;
height: 400px;
margin: 100px 0px 0px 100px;
/*解决外边距塌陷的问题: 父元素嵌套子元素,子元素设置了上或下外边距。
例如margin-top:10px或者margin-bottom:10px或者margin:10px 0 20px 0,
就会造成父元素也跟着子元素向下或者向上移动的问题,实际上父元素并没有写任何上或下外边距边距的代码。*/
overflow: hidden;
}
.c{
background-color: blue;
width: 200px;
height: 200px;
margin: 50px 0 0 50px;
}
.d{
position: absolute;
background-color: orange;
width: 40px;
height: 40px;
top:100px;
left: 100px;
}
</style>
<body>
<div class="b">
<div class="c">
<div class="d">
我是D
</div>
</div>
</div>
</body>
</html>
-
事例效果截图
情况三:
以为遵循就近原则
,所以和情况1效果一样。
- 事例代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>子绝父相</title>
<meta name="description" content="子绝父相测试" />
<meta name="Keywords" content="子绝父相测试" />
</head>
<style type="text/css">
/*清除浏览器默认间距 */
* {
margin: 0;
padding: 0;
}
.b{
background-color: red;
width: 400px;
height: 400px;
margin: 100px 0px 0px 100px;
/*解决外边距塌陷的问题: 父元素嵌套子元素,子元素设置了上或下外边距。
例如margin-top:10px或者margin-bottom:10px或者margin:10px 0 20px 0,
就会造成父元素也跟着子元素向下或者向上移动的问题,实际上父元素并没有写任何上或下外边距边距的代码。*/
overflow: hidden;
}
.c{
position: relative;
background-color: blue;
width: 200px;
height: 200px;
margin: 50px 0 0 50px;
}
.d{
position: absolute;
background-color: orange;
width: 40px;
height: 40px;
top:100px;
left: 100px;
}
</style>
<body>
<div class="b">
<div class="c">
<div class="d">
我是D
</div>
</div>
</div>
</body>
</html>
-
事例效果截图
情况四:
- 事例代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>子绝父相</title>
<meta name="description" content="子绝父相测试" />
<meta name="Keywords" content="子绝父相测试" />
</head>
<style type="text/css">
/*清除浏览器默认间距 */
* {
margin: 0;
padding: 0;
}
.b{
background-color: red;
width: 400px;
height: 400px;
margin: 100px 0px 0px 100px;
/*解决外边距塌陷的问题: 父元素嵌套子元素,子元素设置了上或下外边距。
例如margin-top:10px或者margin-bottom:10px或者margin:10px 0 20px 0,
就会造成父元素也跟着子元素向下或者向上移动的问题,实际上父元素并没有写任何上或下外边距边距的代码。*/
overflow: hidden;
}
.c{
background-color: blue;
width: 200px;
height: 200px;
margin: 50px 0 0 50px;
}
.d{
position: absolute;
background-color: orange;
width: 40px;
height: 40px;
top:100px;
left: 100px;
}
</style>
<body>
<div class="b">
<div class="c">
<div class="d">
我是D
</div>
</div>
</div>
</body>
</html>
-
事例效果截图