To, o czym wspominał @BoltClock, jest dość solidne. A tutaj chcę tylko dodać kilka innych rozwiązań tego problemu. sprawdź ten margines w3c_collapsing . Zielone części są potencjalną myślą, jak rozwiązać ten problem.
Rozwiązanie 1
Marginesy między zmiennoprzecinkowym polem a dowolnym innym polem nie ulegają zwinięciu (nawet między zmiennoprzecinkowym a jego elementami potomnymi w przepływie).
Oznacza to, że można dodać float:left
do jednej #outer
lub #inner
demo1 .
zauważ również, float
że unieważniłoby to auto
margines.
Rozwiązanie 2
Marginesy elementów, które ustanawiają nowe konteksty formatowania bloków (takie jak zmiennoprzecinkowe i elementy z „przepełnieniem” innym niż „widoczny”), nie ulegają zwinięciu wraz z ich potomkami w przepływie.
inne niż visible
, umieścić Chodźmy overflow: hidden
do #outer
. I ten sposób wydaje się dość prosty i przyzwoity. Lubię to.
#outer{
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto;
overflow: hidden;
}
#inner {
background: #FFCC33;
height: 50px;
margin: 50px;
}
Rozwiązanie 3
Marginesy absolutnie pozycjonowanych pudełek nie zapadają się (nawet w przypadku dzieci przepływających).
#outer{
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto;
position: absolute;
}
#inner{
background: #FFCC33;
height: 50px;
margin: 50px;
}
lub
#outer{
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto;
position: relative;
}
#inner {
background: #FFCC33;
height: 50px;
margin: 50px;
position: absolute;
}
te dwie metody spowodują przerwanie normalnego przepływu div
Rozwiązanie 4
Marginesy pól bloków wstawianych nie zapadają się (nawet w przypadku ich potomków w przepływie).
jest taki sam jak @enderskill
Rozwiązanie 5
Dolny margines elementu na poziomie bloku przepływu zawsze zapada się wraz z górnym marginesem następnego rodzeństwa na poziomie bloku przepływu, chyba że ma on prześwit.
Nie ma to wiele wspólnego z tym pytaniem, ponieważ jest to zawalający się margines między rodzeństwem. ogólnie oznacza to, że ma górne pudełko margin-bottom: 30px
i ma rodzeństwo margin-top: 10px
. Całkowity margines między nimi jest 30px
zamiast 40px
.
Rozwiązanie 6
Górny margines elementu blokującego przepływ zapada się wraz z górnym marginesem potomnym pierwszego bloku przepływowego, jeśli element nie ma górnej granicy, górnego wypełnienia, a dziecko nie ma luzu.
To bardzo interesujące i mogę po prostu dodać jedną górną linię graniczną
#outer{
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto;
border-top: 1px solid red;
}
#inner {
background: #FFCC33;
height: 50px;
margin: 50px;
}
A także <div>
domyślnie jest na poziomie bloku, więc nie musisz celowo go deklarować. Przepraszam, że nie mogłem opublikować więcej niż 2 linków i zdjęć z powodu mojej reputacji początkującego. Przynajmniej wiesz, skąd pochodzi problem, kiedy następnym razem zobaczysz coś podobnego.