Intento agregar valores de margen en un div dentro de otro div. Todo funciona bien, excepto el valor superior, parece ser ignorado. ¿Pero por qué?
Lo que esperaba:
Lo que consigo:
Código:
#outer {
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto 0 auto;
display: block;
}
#inner {
background: #FFCC33;
margin: 50px 50px 50px 50px;
padding: 10px;
display: block;
}
<div id="outer">
<div id="inner">
Hello world!
</div>
</div>
W3Schools no tiene explicación de por qué el margen se comporta de esta manera.
float:left;
esto funciona ... pero ¿por qué es esto necesario? No quiero que flote. ¿Y por qué funciona el margen para izquierda / derecha?Respuestas:
En realidad, está viendo que el margen superior del
#inner
elemento colapsa en el borde superior del#outer
elemento, dejando solo el#outer
margen intacto (aunque no se muestra en sus imágenes). Los bordes superiores de ambas cajas están alineados entre sí porque sus márgenes son iguales.Estos son los puntos relevantes de la especificación W3C:
Puede realizar cualquiera de las siguientes acciones para evitar que el margen se contraiga:
La razón por la cual las opciones anteriores evitan que el margen se contraiga es porque:
Los márgenes izquierdo y derecho se comportan como esperaba porque:
fuente
Intenta usar
display: inline-block;
en el div interno.fuente
display:inline-block;
. También retrasado para cuando se usadisplay:inline-block;
es que pierde el ancho del 100% en el div.display:inline-block
trabajó para mi. Muchas gracias.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
eso significa que puedo agregar
float:left
a cualquiera#outer
o#inner
demo1 .También tenga en cuenta que
float
invalidaría elauto
margen.Solución 2
aparte de
visible
, pongamosoverflow: hidden
en#outer
. Y de esta manera parece bastante simple y decente. Me gusta.Solución 3
o
estos dos métodos romperán el flujo normal de
div
Solución 4
es lo mismo que @enderskill
Solución 5
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 tienemargin-top: 10px
. El margen total entre ellos es en30px
lugar de40px
.Solución 6
Esto es muy interesante y solo puedo agregar una línea de borde superior
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.fuente
No estoy seguro de por qué lo que tienes no funciona, pero puedes agregar
overflow: auto;
a la div exterior.
fuente
Si agrega algún relleno
#outer
, funciona.Manifestación
fuente
No estoy seguro de por qué, pero cambiando el CSS interno a
parece funcionar;
fuente
No responde el "por qué" (tiene que ser algo con un margen de colapso), pero parece que la forma más fácil / lógica de hacer lo que está tratando de hacer sería agregar
padding-top
al div externo :http://jsfiddle.net/hpU5d/1/
Nota menor: no debería ser necesario establecer un div a
display:block;
menos que haya algo más en su código que le indique que no se bloquee.fuente
prueba esto:
http://jsfiddle.net/7AXTf/
Buena suerte
fuente
Supongo que establecer la propiedad de posición del #inner div en relativo también puede ayudar a lograr el efecto. Pero de todos modos probé el código original pegado en la Pregunta en IE9 y la última versión de Google Chrome y ya dan el efecto deseable sin ninguna modificación.
fuente
Uso
padding-top:50px
para div externo. Algo como esto:Nota: el relleno aumentará el tamaño de tu div. En este caso, si el tamaño de su div es importante, quiero decir si debe tener una altura específica. disminuir la altura en 50 px .:
fuente
¿Has intentado! Importante antes de todo, forzará todo:
fuente
Solo para una solución rápida, intente envolver los elementos secundarios en un
div
elemento como este:El margen de
inner
div no colapsará debido al relleno de1px
intermediosouter
yinner
div. Entonces, lógicamente, tendrá1px
espacio adicional junto con el margen existente deinner
div.fuente