Ma to związek z nakładaniem się marginesów i sposobem, w jaki pewne właściwości zmuszają je do ograniczenia. Jeśli umieścisz 2 x elementy div na stronie, obie z marginesami 100 pikseli, odstępy między tymi elementami div będą wynosić 100 pikseli. Nie 200px. To dlatego, że marginesy mogą pokrywać się z innymi marżami. Tak właśnie działają marginesy. To dobra rzecz.
Ale jeśli umieścisz div wewnątrz innego elementu div, oba z marginesami, wówczas te marginesy zachodzą na siebie. Marginesy elementu potomnego nakładają się na marginesy rodzica.
Ale niektóre właściwości - jak odkryłeś, ale także dopełnienie i przepełnienie - zmuszają rodzica do zawężania marginesów swojego dziecka zamiast nakładania się na nie.
Jestem pewien, że ktoś może dać bardziej techniczne wyjaśnienie, ale tak myślę o tym, co się dzieje.
Oto uproszczony przypadek testowy: http://jsbin.com/ukodus/2/
Zdjąć //
zanim którykolwiek z linii CSS, aby zobaczyć efekt.
„Takie zachowanie nazywa upadek margines. Jedynie górny/dolny margines załamie, a nie w lewo/w prawo.” - @imimmanon
Może to być problem z programem jsbin .. czy też dzieje się to również w kodzie testowania? –
W czystym środowisku: http://jsbin.com/ibowed/1/quiet -> F12, sprawdź granicę na '.top' sklasyfikowanym div. Podobnie. – zsitro
+1; bardzo dziwne. Wywoływane jest przez ujemne 'margin-top' na wewnętrznym div; usuń to z równania i przełączając granicę teraz działa zgodnie z oczekiwaniami. Nie potrafię wytłumaczyć w tej chwili, dlaczego styl elementu wewnętrznego powinien mieć taki efekt na zewnętrznym elemencie. – Spudley