2009-08-07 13 views
8

EDIT: Esto ocurre sólo en IE8, que funciona bien en IE7, Firefox, Opera, etcIE8 - Contenedor con margin-top: 10px no tiene margen

En primer lugar, aquí hay una imagen que he hecho en photoshop para demostrar mi problema: http://richardknop.com/pict.jpg

Ahora debe tener una idea acerca de mi problema. Aquí es una versión simplificada de marcado que estoy usando (omití contenido más irrelevante):

<div class="left"> 
    <div class="box"> 
     // box content 
    </div> 
    <div class="box"> 
     // box content 
    </div> 
    <div class="box"> 
     // box content 
    </div> 
</div> 
<div class="right"> 
    <div class="box"> 
     // box content 
    </div> 
    <div class="box"> 
     // box content 
    </div> 
    <div class="box"> 
     // box content 
    </div> 
</div> 
<div class="clear"></div> 
<div class="box"> 
    // 
    // NOW THIS BOX HAS NO TOP MARGIN 
    // 
</div> 
<div class="box"> 
    // box content 
</div> 

y estilos CSS ir así:

.clear { 
    clear: both; 
} 
.left { 
    float: left; 
} 
.right { 
    float: right; 
} 
.box { 
    overflow: auto; 
    margin-top: 10px; 
} 

Obviamente he dejado fuera todos los estilos como irreevant fronteras, colores e imágenes de fondo, tamaños de letra, etc. He guardado solamente cosas importantes.

¿Alguna idea de dónde podría ser el problema?

+0

¿Tiene un conjunto de DOCTYPE (por ejemplo, ¿se está ejecutando en el modo de estándares IE8? O ¿peculiaridades?) – scunliffe

+0

Sí, tengo:

+0

No he analizado su problema en detalle, pero me pregunto si podría ser causado por márgenes colapsando, por ejemplo, http://www.andybudd.com/archives/2003/11/no_margin_for_error/ – ChrisW

Respuesta

9

Ver si padding-top: 10px funciona. Es posible que el margen intente ir desde la parte superior de la página.

+0

No puedo usar padding-top: 10px; porque las casillas ya tienen el color de fondo y ya tienen relleno: 10px así que el contenido dentro de ellas se ve mejor. –

+6

Intenta agregar un relleno como ' ' al separador claro. Recuerdo que había un error en alguna versión anterior que necesitaba un contenido como ese. – Justin

+0

Añadiendo   resolvió el problema :) Solo tuve que agregar la altura: 0 ; a la clase .clear. –

1

Intente cerrar su división clara.

<div class="clear"></div> 
+0

Eso es un problema, pero no el problema. Al agregar la clase 'clear' al cuadro div, se borrará todo lo anterior. – Justin

+0

Me olvidé de cerrarlo aquí, está cerrado en el código fuente. Edité mi publicación. –

1

No acabo de entender este enfoque. Puede envolver el <div> s con la clase derecha e izquierda en otro <div> y aplicar overflow: hidden, width: 100% para que los elementos debajo de flotación se muestren correctamente.

+0

Sí, pero prefiero tener un marcado mínimo y usar solo tantos divs que sean absolutamente necesarios. Esto simplemente agregaría otro elemento sin significado semántico que ni siquiera es necesario para el diseño. –

+1

@Richard, yo diría que

 
es exactamente lo mismo. Y personalmente elegiría la solución de desbordamiento, ya que el HTML se ve mejor. Pero ese soy yo. – dalizard

1

enter code here Pruebe usar un contenedor con un ancho con desbordamiento: oculto alrededor de los divs flotantes, y elimine el div eliminado.

<div id="container"> 
     <div class="left">  
      <div class="box">  // box content </div>  
      <div class="box">  // box content </div>  
      <div class="box">  // box content </div> 
     </div> 
     <div class="right">  
      <div class="box">  // box content right </div>  
      <div class="box">  // box content </div>  
      <div class="box">  // box content </div> 
     </div> 
    </div> 
    <div class="box"> // // NOW THIS BOX HAS NO TOP MARGIN //</div> 
<div class="box"> // box content</div> 

Y el CSS

#container { width: 100%; overflow: hidden; } 

(lo siento, me fui IE7 en mi máquina de trabajo para las pruebas así que no puedo comprobar)

+0

y agregar desbordamiento: oculto y funcionará :-) – dalizard

+0

¡justo, me atrapó en el proceso de hacer eso! – ScottE

6

Creo que esto es un error de IE8. Se relaciona con un elemento hermano de un div flotante izquierdo y derecho. Con o sin div de compensación, el elemento flotante final pierde su margen superior en IE8.

Hemos probado esto, y sólo IE8 se equivoca:

http://www.inventpartners.com/content/ie8_margin_top_bug

también se nos ocurrió con 3 soluciones.

+0

Buena investigación. El tema complicado es el colapso de los márgenes con el claro dentro. Los 3 márgenes superiores de los divs no flotantes se contraen en su ejemplo, por lo que el margen superior del tercero no se pierde; colapsó con el primero. Sin propiedad clara, el comportamiento de IE8 es definitivamente correcto, y otros navegadores están de acuerdo. Lo que agregar propiedad clara debería hacer no es tan claro. Mira el comportamiento de Opera. Por cierto, no necesitas dos flotadores para tu demostración. –

+0

Interesante. No lo había pensado así. IE8 claramente está siendo mucho más estricto en el colapso de margen que gecko. Ya he escrito anteriormente sobre otro problema de colapso de margen con display: tabla en gecko que se procesa mejor (de manera diferente) en IE8 . Sospecho que habrá bastantes más de estas incoherencias de colapso de margen que provocarán el error de los desarrolladores HTML en los próximos meses! –

+0

Hola buti-oxa: He agregado una nota a pie de página a mi artículo que detalla tu análisis de este problema. Espero que esté bien. Avísame si quieres que lo cambie en absoluto. –

0

No tengo IE8 conmigo ... pero tratas de agregar clear: tanto al div inferior como al agregar un margen inferior a uno de los floats superiores? Estoy bastante seguro de que obtendría el mismo efecto sin ningún divs extra.

1

Tengo problemas similares, y las soluciones proporcionadas por Matt Bradley no funcionaron para mí (¡pero gracias por publicarlas de todos modos!). Quería tener margin-top: 10px en un elemento h1.

La solución que se me ocurrió fue agregando posición: relativa, superior: 10px y margen superior: 0px al elemento h1.

Cuestiones relacionadas