Ordentliche CSS-Lösung
Verwenden Sie den folgenden Code, um dem ungewollt bewegten div ein inhaltsloses erstes Kind voranzustellen:
.parent:before
{content: '';position: relative;height: 0px;width: 0px;overflow: hidden;white-space: pre;}
Der Vorteil dieser Methode besteht darin, dass Sie das CSS eines vorhandenen Elements nicht ändern müssen und daher nur minimale Auswirkungen auf das Design haben. Daneben ist das hinzugefügte Element ein Pseudoelement, das sich nicht im DOM-Baum befindet.
Die Unterstützung für Pseudoelemente ist weit verbreitet: Firefox 3+, Safari 3+, Chrome 3+, Opera 10+ und IE 8+. Dies funktioniert in jedem modernen Browser (seien Sie vorsichtig mit dem neueren ::before
, der in IE8 nicht unterstützt wird).
Kontext
Wenn das erste untergeordnete Element eines Elements ein hat margin-top
, passt das übergeordnete Element seine Position an, um redundante Ränder zu reduzieren. Warum? Es ist einfach so.
Angesichts des folgenden Problems:
<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>
Sie können das Problem beheben, indem Sie ein untergeordnetes Element mit Inhalten hinzufügen, z. B. einem einfachen Leerzeichen. Aber wir alle hassen es, Räume für ein reines Designproblem hinzuzufügen. Verwenden Sie daher die white-space
Eigenschaft, um Inhalte zu fälschen.
<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>
Wobei position: relative;
die korrekte Positionierung des Fixes gewährleistet ist. Und white-space: pre;
macht Sie keine Inhalte hinzufügen, die - wie ein weißer Raum - zu dem Update. Und height: 0px;width: 0px;overflow: hidden;
stellt sicher, dass Sie das Update nie sehen werden.
Möglicherweise müssen Sie in alten IE-Browsern hinzufügen line-height: 0px;
oder max-height: 0px;
sicherstellen, dass die Höhe tatsächlich Null ist (ich bin mir nicht sicher). Und optional können Sie <!--dummy-->
es in alten IE-Browsern hinzufügen , wenn es nicht funktioniert.
Kurz gesagt, Sie können dies alles nur mit CSS tun (wodurch das Hinzufügen eines tatsächlichen untergeordneten Elements zum HTML-DOM-Baum entfällt):
<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>