2013-05-08 25 views
6

Kilka razy spotkałem się z tym problemem. Nadal nie ma pojęcia, co to powoduje.Układ CSS łamie bez ramki div

reprodukować:

  1. Otwarte http://jsbin.com/ibowed/1/edit
  2. W panelu CSS znaleźć .l-search-index .top { @ linii 26
  3. zmian border: 1px solid #ff0000; do border: 0;
  4. whaaat?

Przeglądarka: chrom, ale myślę, że u mogą próbować w jakikolwiek inny ..

Proszę doradzić!

+0

Może to być problem z programem jsbin .. czy też dzieje się to również w kodzie testowania? –

+0

W czystym środowisku: http://jsbin.com/ibowed/1/quiet -> F12, sprawdź granicę na '.top' sklasyfikowanym div. Podobnie. – zsitro

+0

+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

Odpowiedz

6

Jest to zupełnie nieintuicyjne przypadek zawalenia marginesie:

§ 8.3.1 z CSS Spec wyjaśnia jak marginesy są przetwarzane iw jakich okolicznościach je zwinąć. Zasady nie są zbyt łatwe do zrozumienia (ma kilka szczególnych przypadków), ale cytuję odpowiednich części specyfikacji dla Ciebie:

W CSS, przylegające brzegi dwóch lub więcej pól (który może lub może nie być rodzeństwem) może łączyć, tworząc pojedynczy margines. Marginesy , które łączą się w ten sposób, mają się zwinąć, a wynikowy łączny margines jest zwany zawiniętym marginesem.

dwa marginesy są przylegające, wtedy i tylko wtedy, gdy: nie pól liniowych, bez odprawy, bez wyściółka i nie granica rozdzielenia im

(podkreślone przeze mnie)

Tak, tak szybko podczas usuwania obramowania pionowe marginesy twoich elementów zwiną się. Twoja sprawa sprawia, że ​​jest nieco skomplikowana, ponieważ masz ujemne marginesy.

Aby to naprawić, można ustawić właściwość overflow lub zastosować element padding:1px na elemencie .top.

+0

Kluczową częścią jest tutaj "*, które mogą być lub mogą nie być rodzeństwo *". W oryginalnym przykładzie łatwo zauważyć, że nie jest intuicyjne, że marginesy mogą wpływać na siebie nawzajem. – Spudley

+0

Dzięki za odniesienie do specyfikacji! – zsitro

7

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

+1

To zachowanie jest nazywane * zwijaniem marży *. Tylko górny/dolny margines zostanie zwinięty, a nie lewy/prawy. – cimmanon

+0

@imimmanon - okrzyki! – Dominic

+1

+1, dziękuję, twoje walizki testowe są bardzo pomocne. Ja również przyjmuję tę odpowiedź! – zsitro

1

Oto rozwiązanie.

.l-search-index .top{border: 0; height: 70%; overflow: auto;} 

Musisz dodać przelew.

Mam nadzieję, że to pomoże.

+0

Pomaga :), ale jak wspomniałem w moim pytaniu, naprawdę chcę poznać tło tego zjawiska. – zsitro

+0

Oto link, który pomoże Ci w zapytaniach. http://dustwell.com/div-span-inline-block.html - Przeczytaj je w kontekście dwóch klas 1) .l-search-index .top i 2) .l-search-index .icon - @zsitro – Nitesh

+1

Dałem ua +1 :) – zsitro