html - 内部元素中顶部/底部和左侧/右侧的 CSS 边距差异

标签 html css margin

我有非常简单的开始代码:

<!doctype html>
<head>
</head>
<body>
<style>
.master {
    background: green;
}
.master div {
    background: red;
}
</style>
<div class="master">
<div>
abc
</div>
</div>
</body>
</html>

我也把它放在JsFiddle上。只有内部(红色)div 可见,因为没有设置边距或填充,因此内部 div 占据了 .master 的整个空间。分区这很清楚。

我想设置为.master div将边距设置为 20px,这样我就可以这样做:

.master div {
    background: red;
    margin: 20px;
}

但我希望我的 div 都可见(红色和绿色),但实际上只有红色可见,绿色仅在左侧和右侧可见 - JsFiddle .

我知道如何解决它(在这种情况下,我可以将 .master div 的填充设置为 20px 我可以这样做:

.master {
    padding: 1px 0;
}

我将获得与 JsFiddle 中看到的相同效果(或几乎相同的效果 - 1px 差异)或者我可以为 .master 设置填充div 而不是使用内部 div 的边距

问题:

  1. 为什么简单地为内部 div 添加边距并不能使边距按预期设置(绿色和红色都可见),为什么添加甚至很小的填充可以修复它?

  2. 为什么上边距和下边距以及左边距和右边距的行为不同?

  3. 此问题有名称吗?

  4. 还有其他常见的跨浏览器解决方案吗?

如果外部源中有解释,您还可以添加外部资源的链接。

我有点羞于问这么简单的事情,但我总是使用简单的填充来解决这个问题(如问题所示)并且它有效。

最佳答案

此效果是由于“折叠边距”规范造成的。这是 W3C 的解释:

“In this specification, the expression collapsing margins means that adjoining margins (no non-empty content, padding, or border areas, or clearance separate them) of two or more boxes (which may be next to one another or nested) combine to form a single margin.”

边距折叠仅在相邻或嵌套元素上出现垂直边距时发生。

您的问题的答案:

  1. 向内部 div 添加边距会导致边距与外部 div 的边距折叠。它们合并为一个边距。设置padding外部 div 为它提供了 block 格式上下文并分隔元素,因此不会折叠边距。

  2. 边距折叠仅发生在垂直边距上。

  3. 该效果称为“折叠边距”

  4. 唯一的跨浏览器“解决方案”是通过添加填充或 overflow: auto 为父元素提供 block 格式化上下文。/hidden .

See this article on SitePoint for more information

关于html - 内部元素中顶部/底部和左侧/右侧的 CSS 边距差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24909617/

相关文章:

php - 在多列上拆分 foreach 循环结果

html - <div> 背景被剪掉了

javascript - 在 jquery 中更改背景图像 onclick

html - 具有可变位置的CSS中的图像上的文本

javascript - onclick 时更改 div 元素的可见性和不透明度

html - Wordpress 管理员侧边菜单搞砸了

css - 为什么我不能让 span 紧挨着一组图像排列?

css - float 和居中的 Wordpress 页面内容

html - 如何强制垂直 flexbox 中的(旋转)元素不重叠?

javascript - 按钮仅在您开始输入时出现