css文档流、父子容器包裹问题?

//css
.box2{
    width: 100%;
    height: 100px;
    background-color: black;
    position: fixed;
    top: 0;
    left: 0;
}
.box3{
    width: 100%;
    height: 100px;
    background-color: red;
    margin-top: 200px;
}

//html
<div class="box1">
    <div class="box2"></div>
    <div class="box3"></div>
</div>

根据如上代码可以看到,box2因为position:fixed的原因,是没有被包裹进box1中的:

clipboard.png

但是当给box1加上padding: 0.1px(值>0.1px都可以)之后,box2就被包裹进了box1:

clipboard.png

想请问一下这是为什么?有没有什么办法不给box1加padding也让box2被包裹进box1?如果没有的话如何让box2不用position:fixed也达到固定头部的效果?

阅读 2.1k
2 个回答

原因

其实,box2从来没有被包裹进box1

之所以出现这种效果,仅仅是因为box1没有padding-top的时候,box3margin-top会与box1的上边距及body的上边距折叠而已,此时,仅有box3的内容区被算在box1的内容区中;

box1有了padding-top(或border-top)后,box3的上边距也会被计算在box1的内容区中。

不用fixed的方法

下面是一种可供参考的方法

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style type="text/css">
    .box2{
        width: 100%;
        height: 100px;
        background-color: black;
    }
    .box3{
        width: 100%;
        height: 100px;
        background-color: red;
        overflow: auto;
    }
  </style>
</head>
<body>

    <div class="box1">
        <div class="box2"></div>
        <div class="box3">
            twtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereeetwtw wereee
        </div>
    </div>
</body>
</html>

其实你弄错了,box2一直没有被包裹进box1。你看到的其实是当box1没加paddingbox3margin-top: 200px会从box1超出,不会被算进box1中,而box1padding会使box3margin-top: 200px被计算进box1。你可以把margin-top换个值就能发现问题

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题