Ich habe ein div
( Elternteil ), das ein anderes div
( Kind ) enthält. Parent ist das erste Element body
ohne bestimmten CSS-Stil. Wenn ich setze
.child
{
margin-top: 10px;
}
Das Endergebnis ist, dass die Oberseite meines Kindes immer noch mit dem Elternteil ausgerichtet ist. Anstatt das Kind um 10 Pixel nach unten zu verschieben, bewegt sich mein Elternteil um 10 Pixel nach unten.
Mein DOCTYPE
ist eingestellt auf XHTML Transitional
.
Was fehlt mir hier?
Bearbeiten 1
Mein Elternteil muss streng definierte Abmessungen haben, da es einen Hintergrund hat, der von oben nach unten angezeigt werden muss (Pixel perfekt). Das Setzen vertikaler Ränder ist also ein No-Go .
edit 2
Dieses Verhalten ist bei FF, IE und CR gleich.
Antworten:
Bei untergeordneten Elementen mit Rändern innerhalb von DIVs wurde eine Alternative gefunden. Sie können auch Folgendes hinzufügen:
oder:
Dies verhindert, dass die Ränder kollabieren . Rand und Polsterung machen dasselbe. Daher können Sie auch Folgendes verwenden, um einen Zusammenbruch am oberen Rand zu verhindern:
Update auf vielfachen Wunsch: Der springende Punkt beim Reduzieren von Rändern ist der Umgang mit Textinhalten. Zum Beispiel:
Da der Browser die Ränder reduziert, wird der Text wie erwartet angezeigt und die
<div>
Wrapper-Tags haben keinen Einfluss auf die Ränder. Jedes Element stellt sicher, dass es einen Abstand hat, aber der Abstand wird nicht verdoppelt. Die Ränder von<h2>
und<p>
summieren sich nicht, sondern gleiten ineinander (sie kollabieren). Gleiches gilt für das Element<p>
und<ul>
.Leider kann diese Idee bei modernen Designs Sie beißen, wenn Sie ausdrücklich einen Container möchten. Dies wird in CSS Speak als neuer Blockformatierungskontext bezeichnet . Der
overflow
oder Rand Trick wird Ihnen das geben.quelle
<h2>
,<p>
,<ul>
nicht seltsamen Lücken bekommen oder „doppelte“ Margen auf diese Weise.margin: 5px 10px;
id nebeneinander lege, erwarte 2 Divs 5 px von oben und 20px zwischen ihnen, nicht 5 px von oben und 10px zwischen ihnen. wenn ich 10 px zwischen ihnen wollte, habe ich id angegebenmargin: 5px 5px;
. Ich wünschte ehrlich, es gäbe eine Grundregel, die ich aufstellen könnte, um zu verhindern, dass alle Ränder zusammenbrechen. Ich hasse es, dass ich die Größe der Ränder auf Papier verdoppeln muss, damit sie tatsächlich das tun, was zum Teufel ich auf dem Bildschirm will. und diese Top-Sache ... was für eine KatastropheDies ist normal (zumindest bei Browser-Implementierungen). Der Rand wirkt sich nicht auf die Position des Kindes in Bezug auf seinen Elternteil aus, es sei denn, der Elternteil verfügt über einen Abstand. In diesem Fall fügen die meisten Browser den Rand des Kindes zum Abstand des Elternteils hinzu.
Um das gewünschte Verhalten zu erzielen, benötigen Sie:
quelle
.parent {border: solid 1px;}
Obwohl alle Antworten das Problem beheben, kommen sie mit Kompromissen / Anpassungen / Kompromissen wie
floats
, Sie müssen Elemente schwebenborder-top
Dies drückt das übergeordnete Element mindestens 1 Pixel nach unten, was dann angepasst werden sollte, indem ein-1px
Rand in das übergeordnete Element selbst eingefügt wird . Dies kann zu Problemen führen, wenn Eltern bereitsmargin-top
relative Einheiten haben.padding-top
, der gleiche Effekt wie bei der Verwendungborder-top
overflow: hidden
, Kann nicht verwendet werden, wenn Eltern überlaufende Inhalte anzeigen sollen, z. B. ein Dropdown-Menüoverflow: auto
, Führt Bildlaufleisten für übergeordnete Elemente ein, deren Inhalt (absichtlich) überläuft (z. B. Schatten oder das Dreieck der QuickInfo).Das Problem kann mithilfe der folgenden CSS3-Pseudoelemente behoben werden
https://jsfiddle.net/hLgbyax5/1/
quelle
margin-top: -1px
scheint unnötig zu sein. Aber ich mag das.margin-top: -1px
undheight: 0
scheint unnötig. In Chrome getestet. Aber beste Lösung..parent:after...
Stil
display:inline-block
zum untergeordneten Element hinzufügenquelle
Das übergeordnete Element darf nicht leer sein, zumindest nicht
vor dem untergeordneten Element.quelle
Das hat bei mir funktioniert
http://jsfiddle.net/97fzwuxh/
quelle
Ich finde heraus, dass innerhalb Ihrer .css>, wenn Sie die display-Eigenschaft eines div-Elements auf inline-block setzen , das Problem behoben wird. und die Marge wird wie erwartet funktionieren.
quelle
Ordentliche CSS-Lösung
Verwenden Sie den folgenden Code, um dem ungewollt bewegten div ein inhaltsloses erstes Kind voranzustellen:
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:
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.Wobei
position: relative;
die korrekte Positionierung des Fixes gewährleistet ist. Undwhite-space: pre;
macht Sie keine Inhalte hinzufügen, die - wie ein weißer Raum - zu dem Update. Undheight: 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;
odermax-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):
quelle
overflow: hidden;
für das übergeordnete Element .Um "Div parent" zu verhindern, verwenden Sie den Rand von "div child":
Verwenden Sie im Parent diese CSS:
quelle
Die darin
margin
enthaltenen Elemente.child
kollabieren.In diesem Beispiel werden vom Browser Standardstile
p
empfangenmargin
. Die Standardeinstellung des Browsersfont-size
ist normalerweise 16px. Wenn Sie einenmargin-top
Wert von mehr als 16 Pixel haben#child
, bemerken Sie, dass sich die Position bewegt.quelle
Ich hatte auch dieses Problem, zog es jedoch vor, Hacks mit negativen Margen zu verhindern, also setzte ich ein
<div class="supercontainer"></div>
um alles herum, was Polster anstelle von Rändern hat. Natürlich bedeutet dies mehr Divitis, aber es ist wahrscheinlich der sauberste Weg, dies richtig zu machen.
quelle
Interessanterweise wird meine Lieblingslösung für dieses Problem hier noch nicht erwähnt: die Verwendung von Floats.
html:
CSS:
siehe hier: http://codepen.io/anon/pen/Iphol
Beachten Sie, dass für den Fall, dass Sie eine dynamische Höhe für das übergeordnete Element benötigen, diese ebenfalls schweben muss. Ersetzen Sie sie einfach
height:100px;
durchfloat:left;
quelle
Eine alternative Lösung, die ich gefunden habe, bevor ich die richtige Antwort wusste, war das Hinzufügen eines transparenten Rahmens zum übergeordneten Element.
Ihre Box verwendet jedoch zusätzliche Pixel ...
quelle
Verwenden von
top
anstelle vonmargin-top
ist gegebenenfalls eine andere mögliche Lösung.quelle