Es hat damit zu tun, wie sich die Ränder überlappen und wie bestimmte Eigenschaften sie zwingen, eingeschlossen zu sein. Wenn Sie zwei divs auf einer Seite platzieren, beide mit 100px-Rändern, beträgt der Abstand zwischen diesen divs 100px. Nicht 200px. Das liegt daran, dass die Ränder andere Ränder überlappen dürfen. So funktionieren Margen. Es ist eine gute Sache.
Aber wenn Sie ein Div in ein anderes div, beide mit Rändern, dann überlappen diese Ränder auch. Die Ränder des untergeordneten Elements überschneiden sich mit denen des übergeordneten Elements.
Aber einige Eigenschaften - Grenze, wie Sie entdeckt haben, aber auch Padding und Überlauf - zwingen die Eltern, die Ränder seines Kindes zu enthalten, anstatt sie zu überlappen.
Ich bin sicher, dass jemand eine technischere Erklärung geben kann, aber so denke ich darüber nach, was passiert. Hier
ist ein vereinfachtes Testfall: http://jsbin.com/ukodus/2/
Entfernen Sie die //
, bevor eine der Zeilen CSS den Effekt zu sehen.
„Dieses Verhalten nennt Marge Zusammenbruch. Nur Ränder oben/unten kollabieren, nicht nach links/rechts.“ - @cimmanon
Möglicherweise ein Problem mit Jsbin .. oder passiert das auch in Ihrem Test-Code? –
In sauberer Umgebung: http://jsbin.com/ibowed/1/ Ruhe -> F12, Check-Grenze auf '.top' klassifiziert div. Gleich. – zsitro
+1; sehr komisch. Es wird durch das negative "margin-top" auf dem inneren div ausgelöst; entferne das aus der Gleichung und schalte den Rand ein, funktioniert nun wie erwartet. Ich kann im Moment nicht erklären, warum der Stil des inneren Elements diese Wirkung auf das äußere Element haben sollte. – Spudley