Ordentliche Lösung nur für CSS
Verwenden Sie den folgenden Code, um dem ungewollt verschobenen div ein inhaltsloses first-child 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 bestehenden Elements nicht ändern müssen und daher nur minimale Auswirkungen auf das Design haben. Außerdem ist das hinzugefügte Element ein Pseudo-Element, das no im DOM-Baum.
Die Unterstützung für Pseudo-Elemente ist weit verbreitet: Firefox 3+, Safari 3+, Chrome 3+, Opera 10+, und IE 8+. Dies funktioniert in jedem modernen Browser (Vorsicht bei den neueren ::before
, die im IE8 nicht unterstützt wird).
Kontext
Wenn das erste Kind eines Elements eine margin-top
passt das übergeordnete Element seine Position an, um überflüssige Ränder zu kürzen. Und warum? Weil es einfach so ist.
Gegeben sei das folgende Problem:
<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 Kind mit Inhalt hinzufügen, z. B. ein einfaches Leerzeichen. Aber wir alle hassen es, Leerzeichen hinzuzufügen, wenn es sich um ein reines Designproblem handelt. Verwenden Sie daher die white-space
Eigenschaft zum gefälschten Inhalt.
<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>
Wo position: relative;
sorgt für eine korrekte Positionierung der Befestigung. Und white-space: pre;
macht es möglich, dass Sie keinen Inhalt - wie z. B. einen Leerraum - in die Korrektur einfügen müssen. Und height: 0px;width: 0px;overflow: hidden;
stellt sicher, dass Sie die Korrektur nie sehen werden.
Sie müssen möglicherweise Folgendes hinzufügen line-height: 0px;
o max-height: 0px;
um sicherzustellen, dass die Höhe in alten IE-Browsern tatsächlich Null ist (ich bin mir nicht sicher). Und optional können Sie hinzufügen <!--dummy-->
in alten IE-Browsern, wenn es nicht funktioniert.
Kurz gesagt, Sie können all dies nur mit CSS tun (was die Notwendigkeit beseitigt, ein tatsächliches Kind zum HTML-DOM-Baum hinzuzufügen):
<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>
0 Stimmen
Auf mehreren Browsern oder nur auf einem bestimmten?
255 Stimmen
Dieses Verhalten macht überhaupt keinen Sinn. Der Rand soll innerhalb des Elternteils bleiben. Er darf das Elternteil nicht verschieben. Wer schreibt diese Regeln.
21 Stimmen
+2 für letzten Kommentar. ernsthaft diese Regel nervt mich. "In 60 % der Fälle funktioniert es jedes Mal" - das ist eine Marge.
45 Stimmen
Ich stimme den beiden letzten Kommentatoren vollkommen zu. Das ist Wahnsinn. Was ist interessant ist, dass das Hinzufügen einer 1px Grenze zu den übergeordneten macht es richtig funktionieren, aber das bedeutet, dass Sie eine Grenze haben ... wenn dies das erwartete Verhalten ist dann ist dies lächerlich
0 Stimmen
Bitte geben Sie weitere Informationen über die angewandte Spezifikation an. Ich danke Ihnen.
1 Stimmen
Das könnte auch Ihnen helfen :) stackoverflow.com/questions/35337043/
9 Stimmen
Das erinnert mich an die Regel für die Standardgröße von Boxen: " Wir müssen einen Karton versenden. Der Karton darf nicht größer als 100 cm sein. Wir brauchen 10 cm Polsterung im Inneren des Kartons, um sicherzustellen, dass unser Inhalt während des Versands nicht zerbricht. Machen wir den Karton 120 cm groß! " Das ist ein Witz.
0 Stimmen
Das liegt daran, dass die Gewinnspanne zusammenbricht. Hier ist eine weitere Illustration: stackoverflow.com/q/38679945/3597276
0 Stimmen
Ich danke euch für eure Kommentare. Ich lerne CSS nur für mich jetzt, und beobachten Sie das gleiche Verhalten mit Rand innerhalb Elternteil. Jetzt sehe ich, ich verstehe es richtig und Im nicht verrückt ;)