Ich versuche, Randwerte für ein Div in einem anderen Div hinzuzufügen. Alles funktioniert gut, bis auf den Spitzenwert, es scheint ignoriert zu werden. Aber warum?
Was ich erwartet habe:
Was ich bekomme:
Code:
#outer {
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto 0 auto;
display: block;
}
#inner {
background: #FFCC33;
margin: 50px 50px 50px 50px;
padding: 10px;
display: block;
}
<div id="outer">
<div id="inner">
Hello world!
</div>
</div>
W3Schools haben keine Erklärung dafür, warum sich Margin so verhält.
float:left;
funktioniert ... aber warum wird das gebraucht? Ich möchte nicht, dass es schwimmt. Und warum funktioniert der Spielraum für links / rechts?Antworten:
Sie sehen tatsächlich den oberen Rand des
#inner
Elements Zusammenbruch in den oberen Rand des#outer
Elements, nur die#outer
Abgangsmarge intakt (wenn auch nicht in Ihren Bildern gezeigt). Die Oberkanten beider Boxen sind bündig aneinander, da ihre Ränder gleich sind.Hier sind die relevanten Punkte aus der W3C-Spezifikation:
Sie können eine der folgenden Aktionen ausführen, um zu verhindern, dass der Rand zusammenbricht:
Der Grund, warum die oben genannten Optionen verhindern, dass der Rand zusammenbricht, ist folgender:
Der linke und der rechte Rand verhalten sich wie erwartet, weil:
quelle
Versuchen Sie es mit
display: inline-block;
dem inneren Div.quelle
display:inline-block;
. Ebenfalls zurückgesetzt, wenn Sie verwenden,display:inline-block;
ist, dass Sie die Breite von 100% auf dem div verlieren.display:inline-block
arbeitete für mich. Ich danke dir sehr.Was @BoltClock erwähnt hat, ist ziemlich solide. Und hier möchte ich nur einige weitere Lösungen für dieses Problem hinzufügen. Überprüfen Sie diesen w3c_collapsing-Rand . Die grünen Teile sind der mögliche Gedanke, wie dieses Problem gelöst werden kann.
Lösung 1
das heißt, ich kann
float:left
entweder#outer
oder#inner
demo1 hinzufügen .Beachten Sie auch, dass
float
dies dieauto
In-Marge ungültig machen würde .Lösung 2
ausgenommen
visible
, Put - Lassen Sie unsoverflow: hidden
in#outer
. Und dieser Weg scheint ziemlich einfach und anständig. Ich mag das.Lösung 3
oder
Diese beiden Methoden unterbrechen den normalen Fluss von
div
Lösung 4
ist das gleiche wie @enderskill
Lösung 5
Dies hat nicht viel mit der Frage zu tun, da es sich um den kollabierenden Spielraum zwischen Geschwistern handelt. es bedeutet im Allgemeinen, wenn eine Top-Box hat
margin-bottom: 30px
und eine Geschwister-Box hatmargin-top: 10px
. Die Gesamtspanne zwischen ihnen ist30px
statt40px
.Lösung 6
Das ist sehr interessant und ich kann nur eine obere Grenzlinie hinzufügen
Und
<div>
ist ebenfalls standardmäßig auf Blockebene, sodass Sie es nicht absichtlich deklarieren müssen. Es tut mir leid, dass ich aufgrund meines unerfahrenen Rufs nicht mehr als 2 Links und Bilder posten kann. Zumindest wissen Sie, woher das Problem kommt, wenn Sie das nächste Mal etwas Ähnliches sehen.quelle
Nicht sicher, warum das, was Sie haben, nicht funktioniert, aber Sie können hinzufügen
overflow: auto;
zum äußeren div.
quelle
Wenn Sie eine Polsterung hinzufügen
#outer
, funktioniert dies.Demo
quelle
Ich weiß nicht genau warum, aber ich ändere das innere CSS auf
scheint zu funktionieren;
quelle
Beantwortet nicht das "Warum" (muss etwas mit zusammenbrechendem Rand sein), aber es scheint der einfachste / logischste Weg zu sein, das zu tun, was Sie versuchen, wäre, einfach zum äußeren Div hinzuzufügen
padding-top
:http://jsfiddle.net/hpU5d/1/
Kleinere Anmerkung - es sollte nicht notwendig sein, ein div auf zu setzen, es
display:block;
sei denn, Ihr Code enthält etwas anderes, das besagt, dass es nicht blockiert werden soll.quelle
Versuche dies:
http://jsfiddle.net/7AXTf/
Viel Glück
quelle
Ich denke, das Setzen der Positionseigenschaft des #inner div auf relative kann ebenfalls dazu beitragen, den Effekt zu erzielen. Trotzdem habe ich den Originalcode ausprobiert, der in der Frage zu IE9 und dem neuesten Google Chrome eingefügt wurde, und sie bieten bereits den gewünschten Effekt ohne Änderungen.
quelle
Verwenden Sie
padding-top:50px
für äußere div. Etwas wie das:Hinweis: Durch Auffüllen wird die Größe Ihres Div erhöht. In diesem Fall, wenn die Größe Ihres Div wichtig ist, meine ich, wenn es eine bestimmte Höhe haben muss. Verringern Sie die Höhe um 50px.:
quelle
Haben Sie es versucht! Wichtig vor allem, es wird alles erzwingen:
quelle
Versuchen Sie für eine schnelle Lösung, Ihre untergeordneten Elemente in ein
div
Element wie dieses zu verpacken -Der Rand von
inner
div wird aufgrund des Auffüllens von1px
dazwischenouter
undinner
div nicht zusammenbrechen. Logischerweise haben Sie also1px
zusätzlichen Platz zusammen mit dem vorhandeneninner
Div- Rand .quelle