Lo que @BoltClock mencionó es bastante sólido. Y aquí solo quiero agregar varias soluciones más para este problema. verifique este margen de colapso de w3c . Las partes verdes son el pensamiento potencial de cómo se puede resolver este problema.
Solución 1
Los márgenes entre una caja flotante y cualquier otra caja no colapsan (ni siquiera entre una caja flotante y sus elementos secundarios en flujo).
eso significa que puedo agregar float:left
a cualquiera #outer
o #inner
demo1 .
También tenga en cuenta que float
invalidaría el auto
margen.
Solución 2
Los márgenes de elementos que establecen nuevos contextos de formato de bloque (como flotantes y elementos con 'desbordamiento' que no sea 'visible') no colapsan con sus elementos secundarios en flujo.
aparte de visible
, pongamos overflow: hidden
en #outer
. Y de esta manera parece bastante simple y decente. Me gusta.
#outer{
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto;
overflow: hidden;
}
#inner {
background: #FFCC33;
height: 50px;
margin: 50px;
}
Solución 3
Los márgenes de las cajas posicionadas absolutamente no colapsan (ni siquiera con sus hijos en flujo).
#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;
}
estos dos métodos romperán el flujo normal de div
Solución 4
Los márgenes de los cuadros de bloque en línea no se contraen (ni siquiera con sus elementos secundarios en flujo).
es lo mismo que @enderskill
Solución 5
El margen inferior de un elemento de nivel de bloque en flujo siempre colapsa con el margen superior de su próximo hermano de nivel de bloque en flujo, a menos que ese hermano tenga espacio libre.
Esto no tiene mucho trabajo que ver con la pregunta, ya que es el margen de colapso entre hermanos. generalmente significa si una caja superior tiene margin-bottom: 30px
y una caja hermana tiene margin-top: 10px
. El margen total entre ellos es en 30px
lugar de 40px
.
Solución 6
El margen superior de un elemento de bloque en flujo se contrae con el primer margen superior del niño a nivel de bloque en flujo si el elemento no tiene borde superior, sin relleno superior y el niño no tiene espacio libre.
Esto es muy interesante y solo puedo agregar una línea de borde superior
#outer{
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto;
border-top: 1px solid red;
}
#inner {
background: #FFCC33;
height: 50px;
margin: 50px;
}
Y también <div>
está en el nivel de bloque predeterminado, por lo que no tiene que declararlo a propósito. Perdón por no poder publicar más de 2 enlaces e imágenes debido a mi reputación de novato. Al menos sabes de dónde viene el problema la próxima vez que veas algo similar.