CSS-绝对位置受兄弟姐妹边距的影响

时间:2019-12-23 18:33:23

标签: html css position css-position absolute

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

请参阅此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;
} 

2 个答案:

答案 0 :(得分: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元素之间存在间隙。

通常,当这种行为不受欢迎时,最好使用填充而不是边距来填充,这也可以使背景填充继续到间距的边缘。

答案 1 :(得分:0)

因为,正如您在问题中说的那样,它相对于其父项定位。 @Configuration @ConfigurationProperties(prefix = "secret") class SecuredProperties { private String user; private String password; // getters and setters } @Configuration @EnableWebFluxSecurity class SecurityConfig { private SecuredProperties securedProperties; SecurityConfig(SecuredProperties securedProperties){ this.securedProperties = securedProperties; } ..... @Bean public MapReactiveUserDetailsService userDetailsService() { UserDetails user = User.builder() .username(securedProperties.getUser()) // <--- .password(securedProperties.getPassword()) // <--- .roles("INTERNAL_APP") .build(); return new MapReactiveUserDetailsService(user); } 定位的元素为其子元素创建了新的堆叠上下文。将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;
}