2010-10-11 13 views
58

Consulte mi código, no entiendo por qué los márgenes de estos divs se superponen.Superposición de márgenes CSS Problema

<div class="alignright"> 

    <div class="social"> 
     <a href="#" class="twit"></a> 
     <a href="#" class="fb"></a> 
    </div><!-- social --> 

    <div class="contact"> 
     Get in Touch: <span>+44 10012 12345</span>    
    </div><!-- contact --> 

    <div class="search"> 
     <form method="post" action=""> 
      <input type="text" value="" name="s" gtbfieldid="28"> 
     </form> 
    </div><!-- search --> 

</div> 

El CSS:

.alignright {float: right} 

#header .social {margin-top: 50px;} 
#header .social a {display: inline-block;} 
#header .social .fb {width: 64px; height: 1px; padding-top: 60px; overflow: hidden;} 
#header .social .twit {width: 64px; height: 1px; padding-top: 60px; overflow: hidden;} 

#header .contact {margin: 20px 70px 20px 0; font-size: 14px; font-weight: bold;} 
#header .contact span {color: #FFFFFF;} 

#header .search {margin: 10px 0 0;} 

picture

+2

Es posible encontrar este artículo en contextos de formato interesante: http: // tjkdesign. com/articles/block-formatting-contexts_and_hasLayout.asp – jensgram

+0

Parece que le faltan algunas de las reglas que está utilizando allí. ¿Están todos los elementos dentro de .alignright también flotando? –

Respuesta

59

Creo que es un margen colapsado. Solo se tiene en cuenta el margen más grande entre la parte inferior del primer elemento y la parte superior del segundo.

Es bastante normal no tener demasiado espacio entre dos párrafos, por ejemplo.

No puede evitar eso con dos elementos adyacentes, por lo que tiene que aumentar o reducir el margen más grande.

EDITAR: cf. W3C

dos márgenes son adyacentes si y sólo si:

  • ambos pertenecen a las cajas a nivel de bloque en el flujo que participan en el contexto de formato mismo bloque
  • no hay cajas de línea, sin distancia, sin relleno y sin borde separados
  • ambos pertenecen a la caja verticalmente adyacente bordes

No hay ningún colapso con float que saca el elemento del flujo.

+0

¿por qué sucede? y cómo eliminar eso? –

+0

Simplemente baje su margen a lo que quiere que sea. – Kissaki

+0

Editado, simplemente amplíe o reduzca el margen más grande o use el relleno – MatTheCat

29

Márgenes, a diferencia del relleno (que rellena un ancho específico) es un "haz esto como una distancia mínima".

No pondrá esa distancia a todos los elementos.

Como puede ver, el ponerse en contacto Margen inferior del bloque está marcado en el cuadro de entrada. Ese es el margen activo aquí. El otro margen, el margen superior de la entrada, no está en vigor, ya que es más pequeño y no llega a un elemento de bloque donde en realidad retrocede el elemento. Los 2 márgenes se superponen y no se afectan entre sí.

+1

Siento que esta es la respuesta correcta y lo que la pregunta original estaba buscando –

0

Añadir una etiqueta div clara entre los dos objetos

+2

No funciona para mí. –

Cuestiones relacionadas