我知道这是一个老问题,我遇到过很多次。问题是这里的所有修复都是黑客攻击,可能会产生意想不到的后果。
首先,对于根本问题有一个简单的解释。由于边距折叠的工作方式,如果容器内的第一个元素具有上边距,则该上边距有效地应用于父容器本身。您可以通过以下方式自行测试:
<div>
<h1>Test</h1>
</div>
在调试器中,将其打开并悬停在 div 上。您会注意到 div 本身实际上放置在 H1 元素的上边距 停止 处。此行为是浏览器有意为之。
所以有一个简单的解决方法,而不必求助于奇怪的黑客,就像这里的大多数帖子一样(没有侮辱的意图,这只是事实) - 只需回到原来的解释 - ...if the first element inside a container has a top margin... - 紧随其后,因此您需要容器中的第一个元素 NO 具有上边距。好的,但是如何在不添加不会影响文档语义的元素的情况下做到这一点?
简单!伪元素!你可以通过一个类或预定义的 mixin 来做到这一点。添加:before伪元素:
通过类的 CSS:
.top-margin-fix::before {
content: ' ';
display: block;
width: 100%;
height: .0000001em;
}
有了这个,按照上面的标记示例,你可以这样修改你的 div:
<div class="top-margin-fix">
<h1>Test</h1>
</div>
为什么会这样?
容器中的第一个元素,如果它没有上边距,则设置下一个元素上边距的开始位置。通过添加:before 伪元素,浏览器实际上在父容器中添加了一个非语义(换句话说,有利于 SEO)元素在您的第一个元素之前。
问。为什么高度:.0000001em?
A.浏览器需要一个高度才能将边距元素向下推。这个高度实际上为零,但它仍然允许您向父容器本身添加填充。由于它实际上为零,因此它也不会对容器的布局产生影响。漂亮。
现在你可以添加一个类(或者更好,在 SASS/LESS 中,一个 mixin!)来解决这个问题,而不是添加奇怪的显示样式,当你想用你的元素做其他事情时会导致意想不到的后果,有目的地消除元素的边距和/或用填充或奇怪的位置/浮动样式替换它,这些样式实际上并不是为了解决这个问题。