Quello che ha detto @BoltClock è piuttosto solido. E qui voglio solo aggiungere diverse altre soluzioni per questo problema. controlla questo margine w3c_collapsing . Le parti verdi sono il potenziale pensiero su come risolvere questo problema.
Soluzione 1
I margini tra una scatola fluttuante e qualsiasi altra scatola non collassano (nemmeno tra un galleggiante e i suoi figli in-flow).
ciò significa che posso aggiungere float:left
a #outer
o #inner
demo1 .
nota anche che float
ciò invaliderebbe il auto
margine in.
Soluzione 2
I margini degli elementi che stabiliscono nuovi contesti di formattazione dei blocchi (come float ed elementi con "overflow" diverso da "visibile") non collassano con i loro figli in-flow.
altro che visible
, mettiamolo overflow: hidden
dentro #outer
. E in questo modo sembra abbastanza semplice e decente. Mi piace.
#outer{
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto;
overflow: hidden;
}
#inner {
background: #FFCC33;
height: 50px;
margin: 50px;
}
Soluzione 3
I margini delle caselle posizionate in modo assoluto non collassano (nemmeno con i loro figli in-flow).
#outer{
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto;
position: absolute;
}
#inner{
background: #FFCC33;
height: 50px;
margin: 50px;
}
o
#outer{
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto;
position: relative;
}
#inner {
background: #FFCC33;
height: 50px;
margin: 50px;
position: absolute;
}
questi due metodi interromperanno il normale flusso di div
Soluzione 4
I margini delle caselle dei blocchi inline non collassano (nemmeno con i loro figli in-flow).
è uguale a @enderskill
Soluzione 5
Il margine inferiore di un elemento a livello di blocco nel flusso collassa sempre con il margine superiore del suo fratello a livello di blocco nel flusso successivo, a meno che quel fratello non abbia spazio.
Questo non ha molto lavoro a che fare con la domanda poiché è il margine di collasso tra fratelli. significa in genere se una top-box ha margin-bottom: 30px
e una fratelli-box ha margin-top: 10px
. Il margine totale tra loro è 30px
invece di 40px
.
Soluzione 6
Il margine superiore di un elemento di blocco in-flow collassa con il margine superiore del suo primo figlio a livello di blocco in-flow se l'elemento non ha bordo superiore, nessuna imbottitura superiore e il bambino non ha spazio.
Questo è molto interessante e posso solo aggiungere una linea di confine superiore
#outer{
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto;
border-top: 1px solid red;
}
#inner {
background: #FFCC33;
height: 50px;
margin: 50px;
}
E anche il <div>
livello di blocco è predefinito, quindi non è necessario dichiararlo apposta. Ci scusiamo per non poter pubblicare più di 2 link e immagini a causa della mia reputazione da principiante. Almeno sai da dove viene il problema la prossima volta che vedi qualcosa di simile.