Hoy blogueo, mañana existo.

Columnas 100% altas

Páginas: 1 2 3 4

Overflow, Margin y Padding

Esta es, sin duda, la más practica y fácil de las tres técnicas y la que más recomiendo. Con esta técnica puedes aplicar un color o una imagen a cada columna y se extenderán hasta abajo. Tampoco depende del ancho de la columna, así que funciona para layouts líquidos también. Igual es compatible con todos los navegadores que pude probarlo (IE6, IE7, Firefox, Opera, Safari). Así que vale la pena probarlo. ;)

El HTML y CSS

Volvemos a usar el ejemplo de nuestro layout con 3 columnas sin ninguna técnica para expandir las columnas hasta el fondo. Ahora bien, vamos a agregar un padding en la parte de abajo de nuestras columnas... un padding tan enorme que ocupará todo el alto que deseemos usar en nuestra página.

CSS:
  1. #izquierda, #central, #derecha {
  2.     padding-bottom: 32768px
  3. }

Con este cambio vamos a tener tres columnas de 9999em 32768px de alto (lo cual es BASTANTE). Algo como esto:

Ejemplo columnas con padding 1

Pero nuestro contenido (probablemente) no va a ser de 9999em 32768px de alto, así que para compensar este padding tan enorme, agregaremos un margen negativo al fondo del mismo tamaño. Al mismo tiempo, a nuestro #contenedor debemos agregarle un overflow: hidden para esconder todo este espacio.

CSS:
  1. #izquierda, #central, #derecha {
  2.     padding-bottom: 32768px;
  3.     margin-bottom: -32768px
  4. }
  5. #contenedor {
  6.     overflow: hidden
  7. }

Con esto compensaremos el tamaño tan enorme y mantendremos nuestras columnas del tamaño indicado, pero manteniendo nuestro fondo. Algo como esto:

Ejemplo columnas con padding 2

Como ven, el #contenido (marcado en azul) se expande al tamaño necesario de las columnas. A su vez, esconde el espacio creado por el padding: 9999em 32768px que no es usado. Las columnas mantienen su color de fondo y todo es bueno y bello.

Aquí está el ejemplo de esta última técnica para manejar las columnas de la misma altura aquí está el ejemplo con el valor en pixeles de 32768. El anterior ejemplo no funcionaba en Internet Explorer.

Las desventajas

  • Requiere de un div extra.
  • Si vas a usar anchors en la misma página (<a href="#seccion">) y este anchor está dentro de la columna, el contenido que esté antes de ese anchor se esconderá y permanecerá invisible a menos de que haya otro div que vaya hasta arriba de la página.
  • Es tan sencillo que duele no haberlo encontrado antes.

Espero que no se vuelvan a quebrar más la cabeza ni tengan que volver a usar un javascript para lograr sus columnas del mismo alto. Por ahora me despido, con la satisfacción de haber sacado este post que tenía guardado en mis borradores. (pff, ¡Y los que me faltan!)

ACTUALIZACIÓN

Después de encontrar un bug en Internet Explorer con la última técnica, y de probar con varios valores, intenté con 32768px (el cuál es el valor máximo que se puede usar en la propiedad z-index, además de en varios programas de Microsoft) en lugar de 9999em. Al parecer, 32768 también es el límite en pixeles sobre la propiedad padding. Así que en lugar de usar 9999em, utilicen 32768px

ACTUALIZACIÓN 14 - Agosto - 2007

He actualizado el ejemplo de la última técnica. Me había olvidado de actualizarlo por el verdadero valor de 32768px. Para la gente que había dicho que no le mostraba nada, prueben ahora, que a mi me va bien. :)

Páginas: 1 2 3 4

60 Comentarios

  1. Vaya! No conocía la última técnica y es simplemente excelente! Aunque me duela admitirlo hasta ahora solía tirar de la opción de la imágen de fondo... Gracias por compartirla!

  2. Yo no conocía ninguna de las tres! :(
    Muy buen tutorial, gracias :D

  3. Genial enserio, es excelente poder ver el diseño de esa manera!

  4. De peeelos!!!

    Simplemente me quedo con la ultima xP

    Gracias!!!!

    Saludos y lo pondre a preubas sin dudas!

  5. Saludos:

    Acabo de probar (sobre windows XP SP2) el excelente tutorial que has escrito y estos son mis resultados:

    Methodo 2
    IE 6.0 SP2 : OK (las 3 columnas crecen hasta la barra de estado).
    Safari 3.0.3 : KO (No se ve la imagen de fondo).
    Firefox 2.0.0.6: OK

    Methodo 2
    IE 6.0 SP2 : la columna central es mas larga.
    Safari 3.0.3 : OK.
    Firefox 2.0.0.6: OK

    Methodo 3
    IE 6.0 SP2 : no logro ver ninguna columna.
    Safari 3.0.3 : OK.
    Firefox 2.0.0.6: OK

  6. _argos: Me parece interesante que el último método no te haya funcionado en IE6, ya que a mi me funciona perfectamente. Una pregunta ¿Qué valor usaste para el margin y padding? ¿32768px? Si es así, ¿podrías subir tu código a algún lugar para revisarlo? De antemano, gracias.

  7. Chicoblog: Yo también, es la más práctica que hay, sin embargo he visto un error ( mio, quizá ) extraño, cuando un anchor direcciona a un elemento del sitio ( #elemento ), el scroll empieza desde ahí y no se ve lo anterior. Metal.orgy si puedes hacer algo para ayudarme sería genial.

  8. Hola,

    a mi tampoco me aparece nada con la última opción en un IE6.0 sp2 :(

    qué lástima!

  9. david: He subido una versión revisada del ejemplo de la última técnica que utiliza 32768px en lugar de 9999em. Visítala y dime si te va bien, que ya la he revisado en una computadora con IE6 por defecto y funciona perfectamente bien. Si sigue sin funcionar (Que no creo), tendré que actualizar y poner métodos alternativos para IE6.

    xmas: No he entendido bien, pero creo que sé por qué es y, en dado caso, no es un error, sino el comportamiento normal de los elementos y muy probablemente una desventaja. Igual te pido un favor: sube un html simple donde se vea bien el error y veré que puedo hacer. :)

  10. MeTaL_oRgY : Estaba por enviarte el codigo, pero probe con la version modficada y mi IE 6.0 SP2 funciona correctamente, salvo que las columnas llegan hasta el borde de la barra de estado, gracias por leer mi mensaje y brindar una pronta solucion.

  11. _argos: Entonces el error si era el valor que había usado originalmente. experimento curioso: ve aumentando de a poco el valor de los pixeles en el segundo ejemplo y mira como va desapareciendo de a poco el contenido. IE se comporta de maneras extrañas... jajaja

    ¡Saludos!

  12. xmas Hmm.... no había pensado en eso, y después de algo de investigación he descubierto que, si vas a usar anchors en la misma página dentro de las columnas, esta técnica no es la opción. Ahora actualizo el post.

  13. WUAU! loco sos una maquina!

  14. increible... me encanta esta pagina, justo cuando me topo con un problema diseñando, vengo aca y YA ESTA LA SOLUCION!!... grandioso trabajo amigo.

    Gracias!!!

  15. Wuau! de nuevo... muchisimas gracias metalize me dejaste asombrado xD

  16. No sabes cuantos dolores de cabeza tuve para solucionar esto...gracias a ti..se han ido..

    Saludos!

  17. ¡Felicidades! y ¡Gracias!
    El problema que yo tengo, no se soluciona con estos ejemplos (tengo un diseño muy complicado, con muchos elementos) pero la lección de soluciones imaginativas es excelente.

  18. Sin duda alguna une excelente tutorial para solucionar el problema con las divs en un contenido largo para alguna de ellas. Me habían preguntado de estos errores pero ahora creo que ya tengo la solución. Buen aporte! =)

  19. hola
    te escribo esto para decirte que en los feeds solo aparece la primera pagina del posteo. o sea, de ultima no es guaa un re impedimento, pero que se yo.
    buen tutorial, saludos.

  20. He probado el tercer método y funciona muy bien, excepto por un problema: si se le aplica un background a las columnas y nuestra maquetación posee un footer, este aparece tapado por las columnas, ¿alguna idea para solucionar esto?
    Otro detalle: en el último código CSS que muestras aparece 32768pxem cuando debe ser 32768px [tienes que sacar los "em"]

  21. Sergio: ¡Saludos! Gracias por avisarme del error en el post, ahora mismo lo arreglo. ;) En cuanto a tu problema, intenta aplicar position: relative al footer además de un z-index: 9999. Con eso debería de verse. ;)

    ¡Saludos!

  22. Recuerdo haber visto la ultima tecnica antes... creo que en "The search for the perfect layout"?

    Muy buenas explicaciones, felicitaciones.

  23. Estas loco Rammy

  24. [...] http://metalize.liveonstyle.com/2007/08/13/columnas-100-altas/ [...]

  25. [...] En Metalize nos traen un excelente tip de diseño para quienes usamos CSS y en más de una ocasión nos hemos encontrado con la situación de que al usar columnas en nuestro layout estas no crecen al 100%. [...]

  26. Excelente articulo.
    Consulta en caso de agregar una img de fondo en
    #contenedor {
    width: 748px;
    margin: 0 auto;
    overflow: hidden;
    background: white url(../images/fondo-bottom.gif) bottom left repeat-x ;
    }
    En IE7 - 6 no la veo en FF si, como puedo resolverlo, mgcias de ante mano

  27. holaaaaaaa
    ME ENCANTA EL CUARTETOOOOOOOOOOOOO

    A MUERTE!!!!!!!!

    cuarteto_victoria@hotmail.com

  28. Mariana: Es algo difícil diagnosticar algo así. ¿Podrías subir tu código para echarle un ojo y así decirte bien qué es lo que pasa? :)

    ¡Saludos!

  29. Lo he logrado Metal.ize!!! jodeer, y creiamos que era tan dificil...

    char temp, world[5]="mundo";
    int b=4;
    for(int a=0; a=4; a++){
    temp=world[a];
    world[a]=world[b];
    world[b]=temp;
    b--;
    }

    veeees, ahora ya no es "mundo", ahora es "odnum", dio un giro de 180 grados...

    He cambiado al mundo y ahi esta el codigo fuente !!!!!!!! XD

  30. He descubierto un pequeño pero molestoso problema con la primera solución metal.orgy. Se trata de que hace la página un poco más pesada y sobretodo hace que los efectos AJAX o simplemene javascript se vean lentos, lo digo por experiencia, quité la imagen de fondo y todo era muy rápido. Tengo la teoría que como hay movimiento en la página, CSS trata de mantener el fondo para que no se mueva o algo así a causa de los movimientos que hay, lo que hace que haya un conflicto entre ambos y por eso se pone lento. Es la única explicación que puedo darle.

  31. La ultima solucion no es del todo buena, no ?? ya que al esconder lo que sobra por abajo, se pierden cosas. Por ejemplo, simplemente que añadas bordes a las capas "#izquierda #derecha..." los bordes de abajo no se ven. Como solucionas eso ??

  32. OIGAN! Decubrí la solución perfecta al alcance de todos, duele no haberla encontrado antes, está en Cristalab, miren: http://www.cristalab.com/tips/39039/columnas-variables-de-igual-altura-con-div-y-css

  33. [...] Leyendo el artículo de metal.orgy pude observar 3 excelentes soluciones para lograr que las columnas de un diseño midan igual con respecto al contenido de alguna de ellas; lastimosamente, ninguna de las soluciones que planteó se adecuaron a mi diseño y me parecieron algo complicadas. [...]

  34. [...] Ir al contenido Sin Comentarios, Comentario o Ping [...]

  35. [...] En el blog de MeTaL_oRgY [...]

  36. [...] Varias soluciones a la altura de las columnas [...]

  37. Desde mi ignorancia, porq estoy comenzando a utilizar el CSS. No es posible hacer lo siguiente:

    esquematicamente

    en donde la tabla tengo un fondo q se corresponda con los colores de los div (o las imagenes), de esta forma si una columna crece (yo porq uso paginas dinamica y nose la altura de la columna) tambien crecera la tabla y por ende se vera la imagen de fonde de la misma.

    Otra cosa la tabla va sin bordes ni margenes, y con el width al 100% asi dependera del superior. independizando las caracteristicas del layout de la tabla.

    Puede q no este en lo correcto, pero a mi me vino de maravilla. Cualquier duda envienmen un mail q paso el codigo

    Saludos

    Seba
    SanFernando-MalosAires-Argentina

  38. No salio el esquema en el post :p

    ahy va:

    div>
    table>
    tr>
    td>
    div id="left"> /div>
    div id="centro"> /div>
    div id="rigth"> /div>
    /td>
    /tr>
    /table>
    /div>

    saque los

  39. Seba: Ouch... vamos seba, que este post trata exactamente de cómo hacer lo que quieres hacer, y sin necesidad de imagenes.

    Echale un ojo a la página dos de este tutorial; que hace lo que tu, pero en lugar de usar una tabla (Que es un gran error de semántica) usa un div.

  40. Tienes razon, pero en mi caso: con una web dinamica (.php) en donde la columna de la izquierda crece desmedidamente, no me sirve ningun ejemplo (todos tiene width pre-fijado). O no los supe asimilar bien. Pero me parecia una buena opcion, gracias por la correccion :)

  41. Seba: Estas tecnicas precisamente tratan sobre contenido dinámico. No sabemos el alto de las columnas en ningún caso (y en algunos de ellos, tampoco el ancho).

    En definitiva, yo trataría de eliminar esa tabla por cualquier medio posible.

  42. Ah perfecto, ya creo haber entendido, y la ultima opcion es la q mas me sirve, muchas gracias por aclararme las dudas. Muy bueno el material, envio un cordial saludo !!!

  43. Buenisima la 3ª solción, una pena no haberla conocido antes.

    Saludos y gracias!

  44. Excelente las explicacion, mis mayores respetos a ustedes. saludos

  45. vi un tutorial que utilizan javascript, pero estaba en ingles y es muy complicado, conocen un metodo explicado a su estilo?

  46. Tengo unas dudas sobre el método 3!
    Que sucede si tengo menos contenido que la altura de la resolución y quiero que el contenedor y los divs interiores se estiren el 100%???
    Probé con este método pero no funciona del todo bien, en IE6 no funciona.. y en IE7 y FF el footer se queda arriba y no en el top.

    Les dejo la url donde puede verlo:
    http://www.grmn.ws/DIVS/lalala.html
    http://www.grmn.ws/DIVS/lala.css

    Gracias.

  47. Esta tecnica sirve tb para tablas... pero hay una descompensacion cuando tienen un footer que esta tambien dentro del "contenedor". En firefox se ve bien, pero en el explorer se estira todo el diseño :(

  48. Bravo! este tercer truco me ha resultado muy útil! Gracias por el post, un saludo :-)

  49. Hola!

    Antetodo enhorabuena por este tipo de tutoriales que ayudan a seguir investigando y no derrumbarse :)
    Dicho esto, ahí lanzo mi pregunta: ¿Hay alguna manera de combinar la opción 3 con la posibilidad de que el alto inicial (sin ningun contenido) sea el 100%? He probrado de todo ya y no sé qué más puedo hacer. Gracias

  50. WenaS! tremenda ayuda esta jajaja justo lo k buscaba, pero tengo un problemita, utilizando el 3er metodo no me funciona bien en opera, los layers krecen hacia abajo infinitamente casi jajaja, en FF si todo perfect!

  51. Hola, muchísimas gracias por las ideas. He aplicado la última y al principio resultó muy bien y probándolo en IE, también era aceptable. Faltaban los bordes inferiores (lo solucioné a modo de chapucilla, poniendo un borde superior al footer, lo que sirvió para crear un borde inferior ficticio para los 3 cuerpos, main y 2 sidebars, lo comento por si es útil para alguien, aunque sea obvio y chapucerillo). Bueno el misterioso problema surge después: IE directamente NO abre mi página. Eliminé el código (los mágenes y padding y overflow) y se resuelve el problema.

    ¿Sabes por qué pasa esto y si se puede resolver? me pareció muy misterioso. No es cosa de mi navegador, me lo advirtieron varios usuarios de IE.

    En fin, me encantó, pero claro, tenía que venir el Maligno con sus cosas...

    Gracias Metal, enhorabuena por el diseño, me ha dejado patidifusa :)

  52. Dejo aquí feliz constancia de que tras varios ajustes en mi plantilla, todo funciona con hermosura.

    Muchísimas gracias por tu ayuda y por la idea ;D

  53. Muy bueno! Gracias :)

  54. Sos mi ídolo! Gracias por ahorrarme horas de trabajo y tedioso javascript =D

  55. La última es sin duda la mejor opción.

    Gracias!!

  56. Estuve probando la tecnica 3 con IE 7 y con firefox 3 y no me funciona con ninguno de los 2, con IE7 hace como si no pusiera el "overflow: hidden" y con firefox no hace nada, estare haciendo algo mal
    :(

  57. ya solucione el problema anterior poniendo en el estilo del div contenedor width: 100%;height: 100%
    :)

  58. Hola, estoy probando el tutorial, y con la 3 técnica tengo un problema.
    Los tamaños de las columnas funcionan perfectamente en ie7 i ff3.
    Pero cualquier div u spam que le ingreso dentro de la columna, no me toma ninguna propiedad css definida en mi hoja de estilo.
    Que puede ser?
    slds, marcelo.

  59. Solo tengo algo que decir:

    "Es tan sencillo que duele no haberlo encontrado antes." :P

    Muchas gracias MeTaL_oRgY esto es lo que me hacía falta, lástima que donde lo necesitaba uso anchors :P

  60. Dejando de lado los casos de los anchors, decidí hacerlo para "prácticarlo" y entenderlo; y según pude ver para que funcione todas las columnas deben tener anchos fijos, ni siquiera se puede dejar a una columna con ancho variable (que tome el ancho restante del div contenedor - los otros anchos)

    Si es posible reparar esto de alguna forma que no he visto, me alegraría que posteen la respuesta, sino, entonces sería otra desventaja :(

Dejar un comentario

* Campos requeridos
   El Email no será publicado