Layout 100% alto

Después de haber navegado mucho buscando la versión perfecta – que pienso que no existe – yo hago mi pequeña y humilde propuesta. Yo desde luego que le voy a sacar mucho provecho. Si desde luego a alguien más le sirve y le evita tener que darle a la cabeza, otra alegría que me llevo.

La idea se basa en una estrucura similar a esta

1
2
3
4
5
6
<div id="layout">
<div id="cabecera">capa cabecera</div>
<div id="lateral">capa lateral</div>
<div id="contenido">capa contenido</div>
<div id="pie">capa pie</div>
</div>

Y la hoja de estilos pretende ser algo como esto, y después intento explicar el porqué y como.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
html,body {
height:100%;
/* necesario para las sub-alturas */
}

body {
margin:0;
padding:0;
overflow-x: hidden;
/* Para evitar el feo scroll horizontal de explorer 7 */
background:#fff;
}

body, div, p {
font-family: verdana;
font-size:12px;
color:#000;
}

div#layout {
position:relative;
/* necesario para el posicionamiento */
margin:0 auto;
/* lo centramos, aunque no funciona para explorer 5 */
width:750px;
height:auto !important;
/* para los navegadores de verdad */
height:100%;
/* Para que explorer lo interprete como alto mínimo */
min-height:100%;
/* para los navegadores de verdad */
background:#f0f0f0;
}

div#cabecera {
background:#cc0000;
height: 80px;
padding:10px;
color: #fff;
}

div#lateral {
float: left;
width: 150px;
padding: 10px;
padding-bottom: 50px;
/* Este padding debe ser igual a la altura del footer */
background: #ccc;
}

div#contenido {
padding: 10px;
padding-bottom: 50px;
/* Este padding debe ser igual a la altura del footer */
margin-left: 170px;
/* 150px del ancho del lateral
más 20px del padding del mismo */

background: #eeeAA0;
}

div#pie {
position:absolute;
width:730px;
/* 750px del ancho del layout menos 20px del padding */
height: 30px;
padding:10px;
color: #fff;
bottom:0;
/* lo encajamos al fondo de todo */
background:#006699;
}

Lo primero de todo es permitir alcanzar un 100% de altura a la entidad más importante de la estructura, y en este caso me refiero a las etiquetas <html> y <body>, por lo que les damos una altura del 100%.

Acto seguido a la capa «layout» que es la que va a contener el resto de elementos, la posicionamos de forma relativa. Esto nos permite posicionar otros elementos con respecto al contenedor principal, es decir, a la capa «layout«. Después le aplicamos el famoso truco dándole un mínimo de altura del 100%, altura automática declarándola como !important, y para hacerlo compatible con los navegadores de mentira, volvemos a declarar la altura al 100%. Esto evidentemente no anula la altura anterior para los navegadores buenos, ya que hemos puesto el !important.

La cabecera y las columnas contenido y lateral, no tienen nada fuera del otro mundo, a no ser un «padding-bottom» que es igual a la altura de nuestro footer. Esto se debe a que el footer lo posicionamos de forma absoluta, a 0px del fondo (bottom:0px;) por lo que siempre estará pegado al fondo y puede llegar a tapar con su altura parte del texto de las capas citadas.

Espero haberme explicado del porqué de determinados estilos, aunque como dice un conocido

No me enteré de lo que dijo, pero si funciona me vale

Pués eso. Solo apuntar para terminar, que las capas lateral y contenido no se estiran con el resto del layout – eso sería otra historia. Lo que pretendía con este tutorial era que el footer se mantenga siempre abajo de todo e independiente del tamaño de la ventana y del contenido del mismo, que se mantuviera igual.

Alguien me preguntaba por la mañana si esto sirve para el caso en que el lateral necesite tener un color de fondo que alcance hasta el footer. Mi respuesta es si. Simplemente crearíamos un fondo del ancho deseado, y lo colocaríamos de fondo en la capa layout repitiéndose verticalmente.

[ demo ] [ descargar ]

28 comentarios.


  • 27 de junio de 2008 a las 0:36
    r0sk dice...
    ¡Gran post!, me ha gustado la explicación. Enhorabuena.

  • 27 de junio de 2008 a las 7:45
    cmacias dice...
    Tengo que decir que cierto layout de cierta web de cierto conocido nuestro fué fuente de mi inspiración :D

  • 27 de junio de 2008 a las 13:27
    Martin dice...
    Ahora vas a tener que decir quien es! hay muy buenos layouts en www.cssplay.co.uk (incluido uno de alto 100%)

    Saludos!!

  • 27 de junio de 2008 a las 18:47
    cmacias dice...
    La persona en cuestión es un antiguo compañero de trabajo y amigo al que le estoy echando una mano con el diseño de su web, la cuál publicaré cuando esté online. ;)

  • 23 de marzo de 2010 a las 18:19
    Mauro dice...
    Hola, me parece a mi o, ni el div#lateral ni el div#contenido se pegan en al footer?
    lo vi en el chrome, en el IE 6 y en el IE7..
    podrias decirme como hacer?

  • 23 de marzo de 2010 a las 18:33
    cmacias dice...
    Hola Mauro, ni el #lateral ni el #contenido se pegan con el footer. Estas dos capas deben tener un padding-bottom igual o mayor a la altura dell footer, de forma que cuando crezcan, no se solaparan por debajo.

  • 23 de marzo de 2010 a las 18:37
    Mauro dice...
    ha.. bien pero.. me pareció que se deberían pegar al footer, o al menos eso entendí con la imagen que ilustra el post. sabes como hacer para que se peguen?
    gracias.

  • 23 de marzo de 2010 a las 18:45
    cmacias dice...
    Una de los métodos que utilizo es añadir a la capa #layout un gráfico con el fondo repetido verticalmente imitando al que debería tener el #lateral, de forma que a simple vista el efecto sea el deseado. Un ejemplo sería http://www.rimset.org/.

    El lateral realmente no llega hasta el #fotter aunque lo parezca por el fondo de color gris y los puntos que se estiran hasta el final.

    Con ese efecto conseguimos compatibilidad en todos los navegadores incluído explorer 6.

  • 23 de marzo de 2010 a las 18:52
    Mauro dice...
    HA!!, FantastiC!
    Muchas gracias genio, ... derecho a mi rss reader :), nos vemos.

  • 23 de marzo de 2010 a las 19:16
    cmacias dice...
    Un saludo y gracias a ti por leerme ;)

  • 15 de octubre de 2010 a las 0:01
    listillo dice...
    Hola, he estado probando tu código, y he logrado que el pie permaneza abajo del todo, he aplicado padding-bottom a la capa contenido equivalente a la altura del pie, pero no hay manera de que la capa contenido, independientemente de la cantidad de contenido que tenga, llegue siempre hasta abajo, u ocupe el 100% de la altura de la ventana.

  • 15 de octubre de 2010 a las 0:10
    listillo dice...
    He probado el truco del "html,body {height:100%;
    }" en todos los navegadores que se me han ocurrido, y sin recurrir a efectos visuales como el de la web rimset, he visto que dicho truco sólo funciona sólo en Opera, e IE5.5, IE6..., NO funciona ni en Firefox, ni en Safari, ni en Chrome, ni en IE7, ni en IE8, etc...

    ¿Conoces alguna solución de verdad que no sea el efecto visual de la web rimset?

    ¡Un saludo!

  • 15 de octubre de 2010 a las 7:40
    cmacias dice...
    Debería funcionarte correctamente ya que lo estoy utilizando en los últimos proyectos en los que he trabajado. Estás colocando correctamente el fondo repetido ? Has comprobado si te funciona el ejemplo que pongo para descarga ?

  • 25 de noviembre de 2010 a las 18:24
    Federico dice...
    Con este "truco" el problema surge cuando el CONTENIDO del sitio debe superar el 100% de la ventana...

    Al poner el footer en posición ABSOLUTA respecto del body/html, el contenido "extra" le pasa por encima (o por debajo, dependiendo de la ubicación de los divs en el html)

  • 25 de noviembre de 2010 a las 18:49
    cmacias dice...
    Efectivamente, Federico tienes razón. La solución - mea culpa por no publicarlo - es meterle un
    <br style="clear:both" />
    justo debajo de la capa con id="contenido"


    <div id="contenido"></div>
    <br style="clear:both" />


    Hay otras soluciones como añadirle un "overflow:hidden" tanto a la capa "lateral" como a la "contenido" o incluso circulan por internet variantes de la clase "clearFix" que también podrían solucionar el rebase de texto.


  • 26 de noviembre de 2010 a las 17:25
    Federico dice...
    Genial compañero, si yo suelo usar la clearFix, y con eso se acomoda.

    Otra solucion interesante que encontre al respecto está aquí: http://www.araudi.net/ejemplos/conjunta.html

    Es prácticamente igual a tu ejemplo, en lo que a posicionamiento de capas se refiere.

    Así que muchas gracias por compartir esta excelente solución

  • 26 de noviembre de 2010 a las 19:26
    cmacias dice...
    Gracias a ti por leerme ;)

    Con respecto al ejemplo que comentas, yo tengo algo similar :
    https://www.cmacias.com/emulando-a-los-iframes-con-css/

  • 24 de abril de 2011 a las 6:09
    Ale Photoshop dice...
    Macias! tanto tiempo sin pasar por esta web, hoy por necesidad de hacerle una consulta aun experto es que te hago esta consuta relacionada a Css y a este tema:
    Tengo una imagen de fondo de pagina que mide 1600x1200. Quiero que aparezca centrada, ya que la imagen complementa al layer que aparece en el centro del sitio. La idea es que en un monitor con 1024x768 se vea centrado y en uno con 1600x1200 tambien... pero como hago para mantenerlo centrado?
    Me sugirieron ponerlo en un div, pero claro, si lo pongo en un div, por atras del div contenedor, me van a aparecer los scroll... tiene que ser un background...
    ¿tendrias alguna sugerencia? gracias de antemano y espero que andes bien!

  • 25 de abril de 2011 a las 2:50
    cmacias dice...
    Muy buenas y re-bienvenido ;)

    Has probado con lo siguiente ?

    body {background: url(tuimagen) 50% 50% no-repeat}


    También habrían otras alternativas, como la que explico en https://www.cmacias.com/positionfixed-compatible-con-todos-los-navegadores/

    De esa forma te aseguras que independientemente de la cantidad de contenido que tengas, la imagen de fondo se verá siempre centrada :)

    Un saludo !

  • 25 de abril de 2011 a las 4:01
    Ale Photoshop dice...
    Sabés que si, habia probado con
    body {background: url(tuimagen) center center no-repeat}
    y se ve que e slo miso que 50% 50%...
    La cosa es que me lo centra a lo ancho pero no a lo alto... asi que bueno... lo voy a dejar en ves de center center, "center top" que safa mas...
    Bueno gracias por el intento! voy a volver mas seguido...

  • 25 de abril de 2011 a las 4:12
    cmacias dice...
    Y añadiendo esto a tu hoja de estilos ?


    html, body { height: 100%;}

  • 25 de abril de 2011 a las 4:17
    Ale Photoshop dice...
    Una maravillaaaa neneeee!!! Ahora si funciona!... era eso!...
    Te debo una Macias! (mas muchas otras!)

  • 25 de abril de 2011 a las 4:33
    cmacias dice...
    Un placer, amigo !!

  • 8 de febrero de 2012 a las 10:17
    Abraham dice...
    pffff!!! de lujo hermano!! muchas gracias!!!! :)

  • 22 de marzo de 2012 a las 20:04
    pagalvis dice...
    muchas gracias....de todas las paginas (n) que vi acerca de este tema, esta fue la unica que me funciono...mil gracias.

  • 22 de marzo de 2012 a las 21:07
    cmacias dice...
    Me alegro de que te haya servido de ayuda. Es todo un placer :)

    Un Saludo

  • 22 de junio de 2013 a las 22:24
    Carlos dice...
    Muchas gracias por este post, me estaba volviendo loco.
    Tengo algún problema en explorer al insertar un vídeo en el contenido, me lo coloca fuera. Pero estoy intentando solucionarlo.
Deja tu comentario