Columnas CSS: floats.

Visita este artí­culo en http://www.estadobeta.com/2006/06/11/columnas-css-floats/

Por Ismael en CSS, artículos, tips

Diagramando columnas HTML usando el atributo “float” de CSS.

Mestinon For Sale Septilin No Prescription Buy Abana No Prescription Buy Online Avodart Buy Himcolin Online Hytrin For Sale Levitra No Prescription Buy Proscar No Prescription Buy Online Lopid Buy Zebeta Online Azulfidine For Sale Karela No Prescription Buy Clomid No Prescription Buy Online Loxitane Buy Actoplus Met Online Capoten For Sale Celebrex No Prescription Buy Retin-A No Prescription Buy Online Prednisone Buy Levitra Online Prednisone For Sale Tricor No Prescription Buy Tramadol No Prescription Buy Online Lamisil Buy Inderal Online

Hay varias alternativas para diagramar columnas con XHTML + CSS. El siguiente método utiliza el atributo float.
En nuestro HTML (XHTML 1.0 transicional) definiremos tres bloques o columnas:


<div id="container">
  <div id="columna-1">
    Columna 1
  </div>
  <div id="contenido">
    Contenido
  </div>
  <div id="columna-2">
    Columna 2
  </div>
</div>


En un archivo CSS vinculado al documento XHTML, definimos selectores para los DIV’s y estilos generales para el body y el container.


* {
  padding:0;
  margin:0;
}
body {
  font:10px/120% verdana,arial,sans-serif;
  text-align:center; /* para centrar el container en IE */
}
#container {
  text-align:left;
  width:80%; /* puede ser en px, pt, em, etc */
  margin: 0 auto; /* Para centrar el container en el body */
  min-width:700px; /* esto no funciona en IE */
}
#columna-1 {
  background:silver;
  float:left;
  width:20%;
}
#columna-2 {
  background:#DCFF2E;
  float:left;
  width:20%;
}
#contenido {
  background:#FFC985;
  float:left;
  width:60%;
}

Esto es harto código de una sola vez, pero es sencillo: primero le damos un ancho a #container y lo centramos en el body. A continuación agregamos el atributo float:left; y un ancho a cada columna. Al usar porcentajes estamos fijando dimensiones relativas al ancho del #container. Esto nos da un diseño más flexible y fácil de modificar (basta con cambiar el width del #container y las columnas cambiarán de acuerdo a eso).

Pero ¿qué hace float, exáctamente? La propieadad float no hace una sino varias cosas:
primero, fuerza la propiedad display del elemento al valor “block”. Esto nos permite manipular el width y height libremente (sólo los elementos de bloque - “block”- pueden modificar sus dimensiones explícitamente. Los demás -”inline”- se adaptan a la extensión de su contenido).
Segundo, el atributo float permite que los elementos se apilen horizontalmente Por defecto, los elementos de bloque se apilan verticalmente, uno arriba del otro. Para lograr el “layout” en columnas necesitamos que se apilen horizontalmente y ahí es donde brillan los floats.

Pero a nuestro ejemplo le faltan cosas. Sería ideal que las tres columnas tengan la misma extensión vertical (height). Una solución sencilla puede ser incluír el siguiente código CSS:


#columna-1,#columna-2,#contenido {
  min-height:500px; /* alto mínimo para las 3 columnas. No funciona en IE */
}
* html #columna-1,* html #columna-2,* html #contenido {
  height:500px; /* Hack del asterisco. Sólo para IE */
}

Otra solución es poner una imagen con los colores para las 3 columnas de fondo del body o el #container, dejando que se repita verticalmente. Eso dará la ilusión de que las columnas continúan hacia abajo pero puede ser un problema si queremos modificar las dimensiones de estas (habrá que rehacer la imagen o usar técnicas más avanzadas).

¿y los márgenes?
Pero queremos darle un margen interno (padding) a los contenidos de las columnas. Como vimos en el post anterior, no es viable agregar padding o margin a las columnas porque esto modificará su width (width se suma a margin, border y padding). Lo mejor que podemos hacer es incluír elementos especiales para manejar los márgenes:

<div id="container">
  <div id="columna-1">
    <div class="marginador">
      Columna 1
    </div>
  </div>
  <div id="contenido">
    <div class="marginador">
      Contenido
    </div>
  </div>
  <div id="columna-2">
    <div class="marginador">
      Columna 2
    </div>
  </div>
</div>

Y luego en el CSS:


.marginador {
  margin:2em;
}

La unidad em equivale al alto de la letra más alta al tamaño de fuente utilizado. Esta unidad es útil para diseñar “layouts” que se ajustan al tamaño de fuente.

Bien usados, los floats pueden ser muy poderosos para este tipo de estructuras, pero tienen inconvenientes: los elementos contiguos a un float tienden a “rodear” al float, lo que en algunos casos se puede hacer inmanejable. En IE, si el contenido excede el ancho o alto de un elemento, éste incrementará sus dimensiones para acomodar al contenido. Esto se puede traducir en un float más ancho que empuja a las demás columnas y rompe el diseño.
Por último, los floats dependen del orden de los elementos el el código HTML. En la mayoría de los casos es mejor situar el contenido principal del documento lo más arriba posible en el código (los buscadores tienden a dar mayor importancia al contenido superior de las páginas). Utilizando floats, esto no es posible en el ejemplo de las tres columnas en este artículo.

En el próximo artículo de esta serie veremos alternativas a la diagramación de columnas con Floats.

Aquí pueden bajar el archivo de este ejemplo (CSS incluído en el HTML).

css, float, layout, columnas

29 comentarios para “Columnas CSS: floats.”

  1. GravatarMañungo Dice:

    Sobre el min.height: En vez de

    #columna-1,#columna-2,#contenido {
    min-height:500px; /* alto mínimo para las 3 columnas. No funciona en IE */
    }

    Es mucho mejor usar el siguiente truco:

    #columna-1,#columna-2,#contenido {
    min-height:500px;
    _height: expression( if( this.height
    Se puede hacer lo mismo para la propiedad min-width que tampoco es soportada por ie6

  2. GravatarIsmael Dice:

    No bastaría con usar _height? Los atributos con guión bajo también son interpretados sólo por IE, pero personalmente no los uso porque dan errores de validación en Firefox (son un error de sintaxis).
    El hack del asterisco lo encuentro más limpio y fácil de mantener en la hoja de estilos.
    Por otro lado, laes expresiones javascript en CSS son propietarias de Microsoft y se salen del estándar.

  3. Gravatarsergiomas Dice:

    El guión bajo está permitido en la especificación 2.1 de CSS, y si no valida es por que los validadores no tienen soporte para dicha especificación.

  4. Gravatarnoth Dice:

    interesante y muy facil de seguir, como de constumbre

    gracias

  5. GravatarSebastian Dice:

    Ehhh solo le eche un vistazo luego lo leo con mas detención. (almuerzo)
    Como siempre gracias EstadoBeta
    Saludos

  6. GravatarMañungo Dice:

    Hola Ismael!
    Primero, la expresion salió cortada, hay un “menor que” que desapareció, te agradeceria si lo editas :)

    _height: expression( if( this.height < 500 ) this.height = 500; );

    Segundo, es verdad que las “expressiones” son propietarias de microsoft, pero justamente eso es lo que queremos, que funcione sólo para IE.
    Tercero, con la “expression” el comportamiento de IE es exactamente el que queremos: que el tamaño mínimo sea 500. Con tu hack el tamaño siempre será 500.
    Cuarto y último, no te parece raro que Firefox considere sintácticamente válido el hack del *, pero no lo respete ? Para mi, ambos “hacks” son igualmente malos.

  7. GravatarIsmael Dice:

    Mañungo: buen punto. Si fijas el height:500px sólo para IE, ese navegador respetará esa medida si el contenido es menor que 500px. Si el contenido es más extenso, el DIV crecerá para ajustarse al contenido. Los navegadores con mejor implementación del estandar dejarán que el contenido sobrepase el contenedor, y por eso para esos navegadores no definimos height pero si min-height. Dime si me equivoco, pero me parece que el efecto es el mismo.

  8. GravatarSebastian Dice:

    Claro, rápido y sencillo. Muy buenas explicaciones se despejaron varias dudas.
    Gracias.

  9. GravatarMañungo Dice:

    Ismael, considera el caso que hay un overflow:auto en el estilo de una de las columnas; si defines el height aparecerán scrollbars en IE6.

  10. GravatarIsmael Dice:

    Si…Sin embargo el único caso en el que me imagino usando overflow:auto es justamente para tener scrollbars. De otro modo usaría overflow:visible o hidden según el caso.

  11. GravatarSebastian Dice:

    A mi me esta funcionando todo impeque, incluso en IE 4 de Mac no se desarma en lo absoluto. En relacion a lo que estan discutiendo: Es realmente necesario utilizar el min height, segun entiendo si el height fuese auto, este se acomoda al contenido del div.
    Saludos

  12. GravatarIsmael Dice:

    Sebastian: “auto” es el valor por defecto de height, así que no es necesario ponerlo. El min-height te sirve si quieres que haya un alto mínimo.

  13. GravatarMiguel Ibostroza G. Dice:

    Hola Ismael y hola a todos:
    UFF q avanzado es el nivel con el q estan comversando, pero les contare mi problema q me tiene loko, yo tengo un blog q es parte de mi proyecto de titulo y puse una botonera con codigo javascript en el #sidebar-wraper (supongo), logre q en IE se vea bien, pero una vez al apretar un boton de la botonera y al irse al link q es un html correspondiente al blog se desaparece todo lo del #sidebar-wraper, pero lo más curioso aun es q en mi blog personal tambien puse la botonera javascript pero se ve perfecta nada desaparece en IE exepto los links. (ocupo blogger por si acaso a lo mejor ese es el problema)

    Aca les dejo las dos direcciones de los blogs a ver si alguien me puediese alludar de ante mano muchas muchas gracias y disculpen mi ignorancia.

    Este es el blog con problemas:
    http://guiartebba.blogspot.com/

    Este es el blog sin problemas:
    http://expocultura.blogspot.com/

  14. GravatarSebastian Dice:

    Miguel, vi las dos direcciones que dejaste y no tuve problemas con la página, se ve todo bien afortunadamente no ocupo IE a si es que no se como se verá en ese navegador. Pero al menos yo no tuve problemas para navegar en el blog.

    Ismael: tanto tiempo, ahhh estuve revisando mis archivos y mis códigos, ahora no voy a preguntar nada solo hacer una mención. Yo quería tener un contenido mas grande y luego dos columnas pequeñas una para menu y otra para contenidos (miniposts). En un principio lo hice guiandome por el ejemplo del artículo y solo comabie los floats para que las columnas se acomoden, resultado: en IE se desarmó. Ahora pienso que puedo seguir el mismo orden y tan solo cambiar los Widths. Cierto? ja.
    Saludos.

  15. GravatarIsmael Dice:

    Sebastian: prueba disminuyendo los widths hasta que se vea bien en IE, tratando de entender porqué se está desarmando. Generalmente se estan sumando anchos por aquí y por allá, y además hay un bug conocido en IE6 que suma un par de pixeles cuando tienes 3 floats contiguos. Otro problema m¡as práctico de los floats: generalmente quieres que tus sidebars tengan un ancho fijo (por ej. 200px) y que el area de contenido sea flexible. En el próximo post de la serie mostraré cómo lograr eso usando position relativo y absoluto.

  16. GravatarSebastian Dice:

    Claro, eso ya lo he probado disminuir o agrandar hasta que resulte, ensayo y error!!!, y si, al parecer es por un par de pixeles que hacen que se desarme, lo importante es que cada vez voy entendiendo más, a parte que diseñar páginas de esta manera, por lo menos para mi es mucho mas fácil y rápido que hacerlo en dreamweaver. Lo bueno de la serie de posts que estás haciendo (que espero que continue por un rato largo) es que ya voy/vamos a tener las estructuras de las páginas que es lo que me más me preocupa.
    Saludos.

  17. GravatarEstadoBeta » Archivo » Columnas CSS: position Dice:

    […] recursos « Columnas CSS: floats. […]

  18. GravatarEstadoBeta » Archivo » Despejando Floats para IE7 Dice:

    […] Mediante el método tradicional de eliminar pequeños bloques de código a la vez, llegué a descubrir un sospechoso inesperado (la información está en la web, pero le estoy poniendo dramatismo). Se acuerdan de la clase clearfix? La he recomendado varias veces en este sitio y su objetivo es eliminar un molesto problema cuando tienes varios floats dentro de un DIV contenedor (¿más detalles? Jorge lo explica letra por letra). […]

  19. GravatarStella Dice:

    Tengo problemas con el largo de columna de la web que estoy haciendo. si quiero que el largo MINIMO sea 500px; en donde coloco el codigo que mañungo dice:

    _height: expression( if( this.height

  20. GravatarStella Dice:

    salio cortado, el comentario anterior, lo pongo en la misma hoja de estilo , en en layer que corresponde a la columnmna? Donde?? Ayuda por favor

  21. GravatarIsmael Dice:

    Stella, si tienes un div de esta manera

    
    <div id="columna">
    ...
    </div>
    
    

    Entonces, en tu hoja de estilos puedes hacer lo siguiente:

    #columna {
       min-width:500px;
       _width: expression( if( this.width < 500 ) this.width = 500; );
    }
  22. GravatarColumnas 1 « Taller de produccion web UNIACC Dice:

    […] este artículo explico cómo usar DIVs junto con al atributo float para diagramar […]

  23. GravatarColumnas 1 « Desarrollos para Internet Dice:

    […] este artículo explico cómo usar DIVs junto con al atributo float para diagramar […]

  24. GravatarColumnas 2 « Taller de produccion web UNIACC Dice:

    […] Columnas CSS: Floats (EstadoBeta). […]

  25. GravatarColumnas 2 « Desarrollos para Internet Dice:

    […] Columnas CSS: Floats (EstadoBeta). […]

  26. GravatarAlejandro Dice:

    Ami este NO me funciona:

    #columna {
    min-width:500px;
    _width: expression( if( this.width 1050? “1050px”: “auto” );

    }

  27. GravatarAlejandro Dice:

    este si
    #columna {
    min-width: 750px;
    max-width: 1050px;
    _width: expression(((document.body.clientWidth)) 1050? “1050px”: “auto” );

  28. GravatarHerrkin Dice:

    saludos, estoy en un gran dilema, me estoy partiendo la cabeza para reproducir lo que tengo aqui www.flowpartys.com
    osea, las columnas decorativas de los lados, quiero hacerlo en divs de manera que la pagina pueda ser dimensionada y se vea bien, osea, usando float que las columnas se queden en los lados y ocupen todo el documento verticalmente inclusive el foot..

    me ayudan?

  29. GravatarfraN Dice:

    Muy útil el ejemplo! Me sacó de un gran apuro. Muchas gracias :)

Deja un comentario

XHTML: puedes usar estas etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>