Solución al problema de float en maquetación CSS

Valoración del artículo:
Cuando una capa tiene un float la capa contenedor sobre la que está situada muchas veces no acompaña. Lo solucionamos con el atributo CSS overflow:hidden y definiendo un width al contenedor.
Publicado: 27/3/09
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
Si estamos maquetando con CSS nuestras páginas web, algo que deberíamos estar haciendo ya desde hace tiempo, podremos haber observado un problema que a veces tiene la maquetación cuando utilizamos float para alinear capas a la izquierda o la derecha. En este artículo vamos a tratar de explicar el problema, cuándo se produce y dar una sencilla solución.

Esta solución que publicamos en el Taller de CSS de DesarrolloWeb.com está ampliamente divulgada y aceptada por diversos desarrolladores.

El problema del float y el crecimiento de las capas contenedor

Imaginemos que tenemos un contenedor en una capa DIV que tiene sus características, como un color de fondo, un borde o lo que queramos poner. Ahora imaginemos que en ese contenedor colocamos dentro un par de capas DIV y que estas están flotando a la izquierda y derecha, con el atributo float: left y float: right.

Esta configuración de capas, que es bastante habitual, podría ser utilizada para por ejemplo crear una estructura de dos columnas en la página web. Para aclararnos, llamaremos contenedor a la capa que incluye a las otras capas con el float, que llamaremos capas flotantes.

En las capas flotantes supuestamente colocaremos diversos contenidos, como texto, imágenes o lo que deseemos. Por tanto, las capas flotantes crecerán hacia abajo el espacio suficiente para albergar a todos los contenidos que coloquemos. Lo ideal es que el contenedor acompañase el crecimiento de las capas flotantes, haciéndose tan alto como sea necesario para alojar las dos capas flotantes. Pero realmente no siempre ocurre esto y muchas veces habremos observado cómo el contenedor se queda con un tamaño mínimo, arriba del todo, y no crece lo suficiente para que las capas flotantes quepan en él.

Quizás este problema ya lo hayamos experimentado y entonces podremos entenderlo. En cualquier caso, lo mejor es mirar una imagen para que quede claro el efecto poco deseable que a menudo nos encontraremos:


Esto es lo que ocurriría con un código como este:

<style type="text/css">
#contenedor{
   border: 1px solid #bbb;
   background: #ddd;
   padding: 10px;
}
#flotanteizquierda{
   float: left;
   background: #fc3;
   width: 200px;
   padding: 10px;
}
#flotantederecha{
   float: right;
   background: #3cf;
   width: 200px;
   padding: 10px;
}
</style>

<div id="contenedor">
   <div id="flotanteizquierda">
      Esta capa tiene un float, para alinearse a la izquierda. El problema es que el contenedor de la misma no se entera que esta capa crece mucho hacia abajo y parece como si terminase en seguida.
   </div>
   <div id="flotantederecha">
      Aquí también tenemos float, para alinearse a la derecha. Pero el contenedor donde está colocada no se entera que la capa crece hacia abajo.
   </div>
</div>

Solución con overflow:hidden y definiendo un width

Lo que sería deseable es que el contenedor se haga suficientemente grande para albergar todo el contenido que se ponga dentro, independientemente de que las capas que coloquemos dentro tengan el atributo float. Se puede ver en la siguiente imagen


Esto en realidad se consigue con una combinación de dos atributos que debemos colocar en los estilos CSS de la capa contenedor.

Por un lado tenemos atributo CSS llamado overflow, que ya explicamos en el artículo Overflow en CSS. Simplemente tenemos que asignar el valor hidden al atributo overflow. Esto funciona correctamente en navegadores como Firefox, Opera o Chrome (en general en todos los navegadores menos Explorer, al menos en versiones actuales).

Para conseguir que Explorer también expanda el contenedor hasta la medida suficiente como para albergar el contenido flotante, tenemos que colocar un atributo width, con un valor cualquiera.

Por ejemplo, el contenedor se vería correctamente con este código CSS:

#contenedor{
   overflow: hidden;
   width: 450px;
   border: 1px solid #bbb;
   background: #ddd;
   padding: 10px;
}

El atributo width puede tener cualquier valor, por lo que no tenemos por qué asignarle un valor fijo. Por ejemplo, también funcionaría con un width: 100%;

Para acabar, dejo el enlace a un ejemplo donde se puede ver el problema de maquetación CSS con float y la solución combinando el overflow: hidden y el width. Ver el ejemplo en una página aparte.

Comentarios
Fueron enviados 11 comentarios al artículo
4 comentarios no revisados
7 comentarios revisados:
Por: Tomás Corral
28/3/09
Este ejemplo es interesante, pero el mismo ejemplo proporcionando un overflow:auto en lugar de overflow:hidden tiene el mismo resultado y sin los problemas de perder contenido.
Por: Tomás (baireswebdesign.com)
02/4/09
Estimados,

Es mucho mejor utilizar un cuarto div que se ubique debajo de los 2 flotantes pero antes de cerrar el div contenedor, a este div le damos la propiedad clear: both

ej:

<div id="contenedor">
<div id="flota1">texto</div>
<div id="flota2">texto 2</div>
<div style="clear:both"></div>
</div>
De esta forma contenedor siempre abarcara a los que estaban flotando y podran meter contenido variado dentro de los divs, sin importarl el "alto" final de los mismos
Por: josepzin
03/4/09
Yo lo solucionaba de otra manera, agregando estos valores al primer contenedor: <div id="contenedor" style="float: left; width: 100%;">

Con tu método no conviertes el contenedor en "float", que tambien es muy util.
Por: minotau
03/4/09
Yo personalmente lo conseguia metiendo una capa sin contenido al final de las dos capas flotantes pero dentro del contenedor al que le definia el atributo css "clear: both;". Asi obligaba a la capa contenedor a bajar hasta debajo de las capas flotantes. Espero haber dado una alternativa. Aunq me parece tambien muy bien el atributo overflow y width ;)
clear: both
09/4/09
Yo también lo hacía metiendo un <div> sin contenido con el estilo clear:both, pero probaré esto de meter el oferflow, porque parece una solución más limpia.
Gracias!
otro mas que metia capas vacias
Por: pepi
10/4/09
pero no conocia eso de clear:both, asi que miraba cuanto faltaba de alto y ese era el alto que le daba a la capa vacia, claro que tenia el problema de que si se agrandaba el teto tenia que redimensionarlo.
Buena solución
Por: uy
26/4/09
No siempre el clear sirve, y no sirve meter más capas sirve.

En mi caso, se rompía toda la estructura, y con overflow:hidden se soluciona perfectamente. El único problema que habría es si tuviera una altura determinada #contenedor, pero en ese caso, tampoco tendríamos éste problema. Por lo que la solución es muy buena e interesantemente limpia.

Saludos.

Manuales relacionados
Categorias relacionadas
El autor
Lectura recomendada
Compra este libro en Agapea, la librería urgente a domicilio.
Últimas noticias
Alojados en el grupo