【CSS】解决外边距重叠(重合)引起的 margin 垂直方向(top、bottom)不生效,无作用的问题
一键直达
什么是外边距重叠 —— Margin Collapsing
当块级元素(Block)的上下外边距与其相邻或嵌套的块级元素外边距重叠时,外边距会合并为一个外边距,而不是相加。这种行为成为
外边距重叠
。(浮动和绝对定位的元素不会发生外边距重叠)
外边距重叠只会发生在块级元素(Block)
上,例如 div
、p
、section
等。
外边距重叠计算规则
示例元素
<div class="css-fix-margin-item-parent">
<div class="css-fix-margin-item-child">child div</div>
</div>
两个正数的外边距取最大的边距作为外边距
一个正数一个为负数,外边距为两者之和
.css-fix-margin-item-parent {
margin-top: 20px;
background-color: red;
.css-fix-margin-item-child {
margin-top: -30px;
background-color: green;
}
}
两个都是负数的外边距,外边距为两者绝对值的最大值
.css-fix-margin-item-parent {
margin-top: -20px;
background-color: red;
.css-fix-margin-item-child {
margin-top: -30px;
background-color: green;
}
}
出现外边距重叠的几个场景
示例可在控制面板调试,释放注释代码即可
相邻兄弟元素的外边距重叠
<style>
.css-fix-margin-container {
/*display: flex;*/
/*flex-direction: column;*/
/*display: grid;*/
.css-fix-margin-item-siblings:first-of-type {
margin-bottom: 20px;
background-color: red;
}
.css-fix-margin-item-siblings:last-of-type {
margin-top: 30px;
background-color: green;
/*position: absolute;*/
/*float: left;*/
/*width: 100%;*/
/*&::after {*/
/* content: "";*/
/* clear: both;*/
/*}*/
}
}
</style>
<div class="css-fix-margin-container">
<div class="css-fix-margin-item-siblings">sibling</div>
<!-- <div>placeholder</div> -->
<div class="css-fix-margin-item-siblings">sibling</div>
</div>
sibling
sibling
父级与子级的外边距重叠
当父元素无
border
、padding
、inline-content
、clearance
时,子元素的margin-top
ormargin-bottom
会与父元素的margin
产生重叠问题
<style>
.css-fix-margin-container {
.css-fix-margin-item-parent {
margin-top: 20px;
/*border-top: 1px transparent solid;*/
/*display: inline-block;*/
/*display: table;*/
/*padding-top: 1px;*/
/*position: absolute;*/
/*overflow: hidden;*/
.css-fix-margin-item-child {
margin-top: 30px;
/*position: absolute | fixed;*/
}
}
}
</style>
<div class="css-fix-margin-container">
<div class="css-fix-margin-item-parent">
<!-- <div>placeholder</div> -->
<div class="css-fix-margin-item-child">child div</div>
</div>
</div>
child div
空块级元素的外边距重叠
当块级元素没有
padding
、border
、height
和inline content
时,上下外边距会重叠
<style>
.css-fix-margin-container {
/* display: flex */
/* display: grid */
.css-fix-margin-item-empty {
margin-top: 20px;
margin-bottom: 30px;
/*border-top: 1px transparent solid;*/
/*display: inline-block;*/
/*display: table;*/
/* any direction & not 0 */
/*padding-top: 1px;*/
/*position: absolute;*/
/*overflow: hidden;*/
}
}
</style>
<div class="css-fix-margin-container">
<div class="css-fix-margin-item-empty"></div>
<div style="background-color: red">empty</div>
</div>
empty
Mastering margin collapsing
Block formatting context
https://juejin.cn/post/6953500845426081800#heading-2
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 kshao-blog-前端知识记录!
评论