整洁的纯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>
在哪里position: relative;
确保正确定位该修复程序。并且white-space: pre;
使您不必在此修复程序中添加任何内容(例如空格)。并height: 0px;width: 0px;overflow: hidden;
确保您永远不会看到此修复程序。
您可能需要添加line-height: 0px;
或max-height: 0px;
确保在古代IE浏览器中高度实际上为零(我不确定)。<!--dummy-->
如果不起作用,可以选择在旧的IE浏览器中添加它。
简而言之,您可以仅使用CSS来完成所有这一切(这消除了向HTML DOM树添加实际子项的需要):
<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>