整洁的纯 CSS 解决方案
使用以下代码将无内容的第一个孩子添加到无意移动的 div 之前:
.parent:before
{content: '';position: relative;height: 0px;width: 0px;overflow: hidden;white-space: pre;}
这种方法的优点是您不需要更改任何现有元素的 CSS,因此对设计的影响很小。接下来,添加的元素是一个伪元素,它不在DOM 树中。
对伪元素的支持非常广泛:Firefox 3+、Safari 3+、Chrome 3+、Opera 10+ 和 IE 8+。这适用于任何现代浏览器(请注意较新::before
的 IE8 不支持)。
语境
如果元素的第一个子元素具有margin-top
,则父元素将调整其位置以作为折叠多余边距的一种方式。为什么?就是这样。
鉴于以下问题:
<style type="text/css">
div {position: relative;}
.parent {background-color: #ccc;}
.child {margin-top: 40px;}
</style>
<div class="parent"><!--This div moves 40px too-->
<div class="child">Hello world!</div>
</div>
您可以通过添加具有内容的子项来修复它,例如简单的空间。但我们都讨厌为纯设计问题添加空间。因此,使用该white-space
属性来伪造内容。
<style type="text/css">
div {position: relative;}
.parent {background-color: #ccc;}
.child {margin-top: 40px;}
.fix {position: relative;white-space: pre;height: 0px;width: 0px;overflow: hidden;}
</style>
<div class="parent"><!--This div won't move anymore-->
<div class="fix"></div>
<div class="child">Hello world!</div>
</div>
Whereposition: relative;
确保正确定位修复。并且white-space: pre;
使您不必在修复中添加任何内容(例如空格)。并height: 0px;width: 0px;overflow: hidden;
确保您永远不会看到修复程序。
您可能需要添加line-height: 0px;
或max-height: 0px;
确保在古代 IE 浏览器中高度实际上为零(我不确定)。<!--dummy-->
如果它不起作用,您可以选择在旧的 IE 浏览器中添加它。
简而言之,您可以仅使用 CSS 完成所有这些操作(无需向 HTML DOM-tree 添加实际的子节点):
<style type="text/css">
div {position: relative;}
.parent {background-color: #ccc;}
.child {margin-top: 40px;}
.parent:before {content: '';position: relative;height: 0px;width: 0px;overflow: hidden;white-space: pre;}
</style>
<div class="parent"><!--This div won't move anymore-->
<div class="child">Hello world!</div>
</div>