2012-09-28 13 views
16

Mam wewnętrzny div wewnątrz zawierającego div.Margines wewnętrzny div wpływający na uwzględnienie marginesu div

HTML

<div id="container"> 
    <div id="inner"></div> 
</div> 

CSS

#container { 
    width: 100px; 
    height: 100px; 
    background-color: red; 
} 
#inner { 
    margin: 30px; 
    width: 40px; 
    height: 40px; 
    background-color: black; 
} 

Fiddle

http://jsfiddle.net/8xUTJ/4/

Oczekuję tego, aby mała czarna skrzynka wyśrodkowany w pionie i poziomie w większym czerwonym polu. Zamiast tego dostaję czarne pudełko przyklejone do górnej części czerwonego pudełka, a czerwone pudełko ma margines-górny.

Czy ktoś może wyjaśnić, co według CSS tu robi?

+0

Dzięki dobrze cętkowanej problem. Trwało wieki, aż dowiedziałem się, co się dzieje w moim kodzie. – djpalme

Odpowiedz

23

Dodaj overflow:auto do #container div.

jsFiddle example

Albo

dodać obramowanie do #container div.

Możesz dowiedzieć się więcej na temat zachowania zwijania marginesów na W3C.

+0

Nie jestem pewien, kto to zignorował, ale jeśli uważasz, że jest coś nieużytecznego w tej odpowiedzi, odezwij się. – j08691

+0

Po prostu mówię, że to nie ja, pomimo twojego pogodzenia się z moją odpowiedzią;) –

+1

Przepraszam ponownie. Twój komentarz na temat mojego rozwiązania i opinii pojawił się w ciągu kilku sekund ... więc po prostu założyłem. Mój błąd. Ja też chciałbym, żeby ludzie tłumaczyli pochmurne słowa, a nie tylko rozdawali słabe gesty obelg. –

12

Chociaż dostarczone rozwiązania są wykonalne, nikt nie wyjaśnia problemu. Nazywa się to zawijaniem brzegów, co ma miejsce w kilku scenariuszach.

Scenariusz 1 - te elementy będą oddalone tylko o 30 pikseli, ponieważ marginesy zwijają się razem, a większy ma pierwszeństwo.

<div style="margin-bottom: 20px"></div> 
<div style="margin-top: 30px"></div> 

Scenariusz 2 - (Twój scenariusz) margines polu wewnętrznym wylewa poza polem zewnętrznym.

<div class="outer"> 
    <div style="margin-top: 20px"></div> 
</div> 

Rozwiązaniem jest nadanie ramce zewnętrznej marginesu lub obramowanie (zgodnie z sugestią innych osób). Często używam następujący CSS na opakowaniu zewnętrznym w celu złagodzenia sytuacji tak:

.outer { 
    margin-top: -1px; 
    border-top: 1px solid transparent; 
} 
+3

Zgadnij, że przegapiłeś link w moim poście do wyjaśnienia W3C zwijanych marginesów. – j08691

+0

Dobre pytanie i dobra odpowiedź. – Eric

+1

@ j08691 - Jeśli spojrzysz na czas swojego pierwotnego wpisu i czas uzupełnienia (z referencją do W3C), zobaczysz, że pisałem wtedy swoją odpowiedź (tak, zajęło mi to ponad 5 minut napisać odpowiedź b/c Testuję mój kod przed wysłaniem). Zawsze czytałem dokładnie przed wniesieniem oskarżeń. Przepraszamy za niewygodne terminy. –

1

check to fiddle

Trzeba float wewnętrzny div aby pracować

#inner {  
    margin:30px; 
    float:left; /* give float */ 
    width: 40px; 
    height: 40px; 
    background-color: black; 
}​ 

Albo podaj właściwość overflow:auto do div#container.

check to fiddle

2

Najpierw #container ma margin-top:0 i #inner ma margin-top:30px. Związek tych elementów ma związek z rodzicem i pierwszym dzieckiem.

Jeśli nie ma granic, wyściółka, zawartość inline lub odstęp oddzielić margin-top bloku z margin-top swojego pierwszego bloku dziecka lub bez obramowania, obicia, treści inline, wysokość, min-height lub max-height, aby oddzielić margines-dół bloku z marginesem-końcem ostatniego elementu potomnego, następnie marginesy zwinięte. Zawinięty margines kończy się poza rodzicem.

Margin zawaleniem środki marginesy te są połączone w jeden margines, którego wielkość jest największym marginesie połączone w to

Zasady te stosuje się również do marż, które są zerowe, więc margines pierwsze/ostatnie dziecko kończy się poza jego rodzica (zgodnie z zasadami powyżej), czy margines rodzica wynosi zero

to dlatego pl d z 30px górnego marginesu stosowanego na zewnątrz elementu #container, z skrzypce:

30px and 0 top margins collapse