我有一个相对于父元素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;
}
答案 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;
}