¿Hay alguna manera de desactivar el colapso de margen por completo? Las únicas soluciones que he encontrado (por el nombre de "colapso") implican usar un borde de 1px o un relleno de 1px. Esto me parece inaceptable: el píxel extraño complica los cálculos sin una buena razón. ¿Hay alguna forma más razonable de desactivar este colapso de margen?
203
margin-bottom
pero déjalomargin-top
como 0.Respuestas:
Hay dos tipos principales de colapso del margen:
El uso de un relleno o borde evitará el colapso solo en el último caso. Además, cualquier valor
overflow
diferente de su valor predeterminado (visible
) aplicado al padre evitará el colapso. Por lo tanto, tantooverflow: auto
yoverflow: hidden
tendrá el mismo efecto. Quizás la única diferencia cuando se usahidden
es la consecuencia involuntaria de ocultar contenido si el padre tiene una altura fija.Otras propiedades que, una vez aplicadas al padre, pueden ayudar a corregir este comportamiento son:
float: left / right
position: absolute
display: inline-block / flex
Puede probarlos todos aquí: http://jsfiddle.net/XB9wX/1/ .
Debo agregar que, como de costumbre, Internet Explorer es la excepción. Más específicamente, en IE 7 los márgenes no colapsan cuando se especifica algún tipo de diseño para el elemento padre, como
width
.Fuentes: artículo de Sitepoint Márgenes colapsados
fuente
overflow: auto
puede hacer que aparezcan barras de desplazamiento en el elemento primario, en lugar de permitir que el contenido se desborde, según lo establecidooverflow: visible
.flex
diferente de su valor predeterminado también deshabilitará el colapso del margenTambién puede usar el buen micro clearfix para esto.
Ver violín actualizado: http://jsfiddle.net/XB9wX/97/
fuente
:before
y:after
elementos. Ahora he añadido esta regla a mi hoja de estilo:div:before, div:after{content: ' '; display: table;}
. Fantástico. De repente, las cosas comienzan a comportarse como se esperaba.Un buen truco para deshabilitar el colapso del margen que no tiene impacto visual, que yo sepa, es configurar el relleno del padre para
0.05px
:El relleno ya no es 0, por lo que el colapso ya no ocurrirá, pero al mismo tiempo el relleno es lo suficientemente pequeño como para que visualmente se redondee a 0.
Si se desea algún otro relleno, aplique el relleno solo en la "dirección" en la que no se desea el colapso del margen, por ejemplo
padding-top: 0.05px;
.Ejemplo de trabajo:
Editar: cambió el valor de
0.1
a0.05
. Como Chris Morgan mencionó en un comentario a continuación, y de esta pequeña prueba , parece que, de hecho, Firefox toma0.1px
en cuenta el relleno. Sin embargo,0.05px
parece hacer el truco.fuente
*{padding-top:0.1px}
. ¿Estamos seguros de que funciona en todos los navegadores?0.05px
Todavía parece una opción específica, no un número de truco aleatorio del navegador, preferiría0.01px
.overflow:hidden
evita el colapso de los márgenes, pero no está libre de efectos secundarios, es decir, oculta el desbordamiento.Aparte de esto y de lo que has mencionado, solo tienes que aprender a vivir con él y aprender para el día en que realmente sean útiles (viene cada 3 a 5 años).
fuente
overflow: auto
es bueno para evitar desbordamientos ocultos y aún así evitar márgenes de colapso.overflow:auto;
hizo que mi área de contenido ganara una barra de desplazamiento en algunas páginas.En realidad, hay uno que funciona perfectamente:
pantalla: flex; dirección flexible: columna;
fuente
<div>
dentro de.container
, de lo contrario.container
controlará el modelo de caja de sus hijos. Por ejemplo, los elementos en línea se convertirán en elementos de bloque de ancho completo; si tienen márgenes, también se colapsarán.Todos los navegadores basados en webkit deberían admitir las propiedades
-webkit-margin-collapse
. También hay subpropiedades para configurarlo solo para el margen superior o inferior. Puede darle el colapso de los valores (predeterminado), descartar (establece el margen en 0 si hay un margen adyacente) y separarlo (evita el colapso del margen).He probado que esto funciona en las versiones 2014 de Chrome y Safari. Desafortunadamente, no creo que esto sea compatible con IE porque no está basado en webkit.
Lea la referencia CSS de Safari de Apple para obtener una explicación completa.
Si revisa la página de extensiones de webkit CSS de Mozilla , enumeran estas propiedades como propietarias y recomiendan no usarlas. Esto se debe a que probablemente no entrarán en CSS estándar en el corto plazo y solo los navegadores basados en webkit los admitirán.
fuente
Sé que esta es una publicación muy antigua, pero solo quería decir que usar flexbox en un elemento primario deshabilitaría el colapso de margen para sus elementos secundarios.
fuente
Tuve un problema similar con el colapso del margen debido a que los padres se
position
establecieron en relativo. Aquí hay una lista de comandos que puede usar para deshabilitar el colapso de márgenes.AQUÍ HAY JUEGO PARA PRUEBA
Solo intenta asignar cualquier
parent-fix*
clase a undiv.container
elemento, o cualquier clasechildren-fix*
adiv.margin
. Elija el que mejor se adapte a sus necesidades.Cuando
div.absolute
con el fondo rojo se colocará en la parte superior de la página.div.absolute
colocará en la misma coordenada Y quediv.margin
Aquí está jsFiddle con un ejemplo que puedes editar
fuente
En el navegador más nuevo (excluyendo IE11), se usa una solución simple para evitar el colapso del margen padre-hijo
display: flow-root
. Sin embargo, aún necesitaría otras técnicas para evitar el colapso de elementos adyacentes.DEMO (antes)
DEMO (después)
fuente
Para su información, podría usar la cuadrícula pero con efectos secundarios :)
fuente