2012-09-28 20 views
16

Tengo un div interno dentro de un div que contiene.Margen de div interno que afecta al margen de div

HTML

<div id="container"> 
    <div id="inner"></div> 
</div> 

CSS

#container { 
    width: 100px; 
    height: 100px; 
    background-color: red; 
} 
#inner { 
    margin: 30px; 
    width: 40px; 
    height: 40px; 
    background-color: black; 
} 

violín

http://jsfiddle.net/8xUTJ/4/

espero esto para hacer una pequeña caja de negro centrado verticalmente y horizontalmente en una caja roja grande. En su lugar, tengo una caja negra pegada en la parte superior de la caja roja, y la caja roja tiene el margen superior.

¿Alguien puede explicar lo que CSS piensa que está haciendo aquí?

+0

Gracias problema bien manchado. me llevó años descubrir lo que ha estado sucediendo en mi código. – djpalme

Respuesta

23

Agregar overflow:auto al #container div.

jsFiddle example

O

añadir un borde a la #container div.

Puede leer más sobre este comportamiento de margen colapso en W3C.

+0

No estoy seguro de quién votó negativamente, pero si cree que hay algo no útil acerca de la respuesta, por favor hable. – j08691

+0

Solo digo que no fui yo, a pesar de tu voto negativo de mi respuesta;) –

+1

disculpas de nuevo. Tu comentario sobre mi solución y un voto negativo llegaron en segundos el uno del otro ... así que solo hice una suposición. Mi error. Yo también deseo que la gente explique los votos negativos en lugar de simplemente dar gestos de desaliento. –

12

Si bien las soluciones proporcionadas son viables, nadie explica el problema. Se llama colapso de margen que ocurre en varios escenarios.

Escenario 1: estos elementos solo estarán separados 30px, porque los márgenes colapsan y el más grande prevalece.

<div style="margin-bottom: 20px"></div> 
<div style="margin-top: 30px"></div> 

Escenario 2 - (su escenario) el margen de la caja interna se derrama fuera de la caja exterior.

<div class="outer"> 
    <div style="margin-top: 20px"></div> 
</div> 

La solución es dar a la caja exterior algo de relleno o un borde (como se sugiere por otros). Muchas veces, yo uso el siguiente CSS en la caja exterior para mitigar situaciones como esta:

.outer { 
    margin-top: -1px; 
    border-top: 1px solid transparent; 
} 
+3

Supongo que se perdió el enlace en mi publicación de la explicación del W3C de los márgenes que se derrumban. – j08691

+0

Buena pregunta y buena respuesta. – Eric

+1

@ j08691 - Si mira la hora de su publicación original y la hora de su adición (con la referencia al W3C), puede ver que estaba escribiendo mi respuesta en ese momento (sí, tardé más de 5 minutos) para escribir mi respuesta b/c, pruebo mi código antes de publicarlo). Siempre leo atentamente antes de hacer acusaciones. Disculpas por el momento inconveniente. –

1

cheque esta fiddle

Necesitas float el interior div para que funcione

#inner {  
    margin:30px; 
    float:left; /* give float */ 
    width: 40px; 
    height: 40px; 
    background-color: black; 
}​ 

O bien, otorgue la propiedad overflow:auto al div#container.

cheque esta fiddle

2

En primer lugar, tiene #containermargin-top:0#inner y tiene margin-top:30px. La relación de estos elementos es la de un padre y un primer hijo.

Si no hay frontera, el relleno, el contenido en línea, o recogida de separar el margen superior de un bloque con el margen superior de su bloque niño primero , o sin borde, el relleno, el contenido en línea, altura, min-height, o max-height para separar el margen inferior de un bloque con el margen inferior de su último hijo, luego esos márgenes colapsan. El margen contraído termina afuera del padre.

medios de margen colapso estos márgenes se combinan en un solo margen cuyo tamaño es el más grande de los márgenes combinados en él

Estas reglas se aplican incluso a los márgenes que son cero, por lo que el margen de un primer/último hijo termina fuera de su padre (de acuerdo con las reglas anteriores ) si es o no el margen de la matriz es cero

es por eso que es d con 30px margen superior aplicada exterior del elemento #container, desde su violín:

30px and 0 top margins collapse

Cuestiones relacionadas