【问题标题】:CSS - Position absolute is affected by sibling's marginsCSS - 绝对位置受兄弟的边距影响
【发布时间】:2019-12-23 18:33:23
【问题描述】:

我有一个元素是absolute,相对于父元素。但是,该位置受到具有垂直边距的兄弟元素的影响。为什么绝对定位元素尽管具有属性top 等于零,但从与具有垂直边距的兄弟元素相同的位置开始。

请看这个Codepen

在上面的 codepen 中,元素 div.b 是绝对定位的,但是它受到同级元素 div.a 的影响。元素 div.a 应用了垂直边距。

<div class="parent">
    <div class="a">
        <div class="childA"></div>
        <div class="childA"></div>
        <div class="childA"></div>
        <div class="childA"></div>
    </div>
    <div class="b"></div>
</div>

CSS:

body {
    padding: 0;
    margin: 0;
}

.parent {
    position: relative;
    width: 100%;
    height: 100%;
    background-color: blue;
}

.a {
    margin: 50px;
}

.childA {
    width: 30px;
    height: 30px;
}

.b {
    position: absolute;
    width: 100%;
    height: 100%;
    background-color: red;
    top: 0;
} 

【问题讨论】:

    标签: html css position css-position absolute


    【解决方案1】:

    这有点棘手,但是当一个元素没有任何填充时,其子元素的边距能够溢出到容器的内容之外。这称为collapsing margins,无论您是否使用position: (relative|absolute),都会发生这种情况。

    .block {
      height: 50px;
      background: #ccc;
    }
    
    .parent {
      background: #900;
    }
    
    .child {
      margin: 40px 0;
      background: #600;
      color: #fff;
      padding: 20px;
    }
    <div class="block"></div>
    <div class="parent">
      <div class="child">Child</div>
    </div>
    <div class="block"></div>

    请注意.parent 没有边距或填充,但.child.block 元素之间存在间隙。

    通常,当这种行为不受欢迎时,填充比边距更适合您,这也允许您的背景填充继续到间距的边缘。

    【讨论】:

    • 感谢您的指导。我认为问题,或者我的知识差距在哪里,是父母本身没有任何高度,它会根据孩子扩展/收缩。在我上面的例子中,第一个孩子的起点偏移了边缘顶部,所以这就是身体的起点。这就是第二个孩子,绝对定位的孩子,将其视为起点。感谢您提出的解决方案。
    【解决方案2】:

    因为,正如您在问题中所说,它是相对于其父级定位的。 relative 定位元素为其子元素创建新的堆叠上下文。要么将.b 移出其父级,要么将position" relative; 从父级中移除

    body {
        padding: 0;
        margin: 0;
    }
    
    .parent {
        width: 100%;
        height: 100%;
        background-color: blue;
    }
    
    .a {
        margin: 50px;
    }
    
    .childA {
        width: 30px;
        height: 30px;
    }
    
    .b {
        position: absolute;
        width: 100%;
        height: 100%;
        background-color: red;
        top: 0;
    } 
    <div class="parent">
        <div class="a">
            <div class="childA"></div>
            <div class="childA"></div>
            <div class="childA"></div>
            <div class="childA"></div>
        </div>
        <div class="b"></div>
    </div>

    【讨论】:

    • 现在说得通了。谢谢你的澄清。
    • @Laif 虽然您对position: relative 的解释很有帮助,但我认为它并不能完全描述 Kayote 在这里所经历的影响。
    猜你喜欢
    • 1970-01-01
    • 2014-08-19
    • 2014-09-08
    • 2013-02-05
    • 2012-05-24
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    相关资源
    最近更新 更多