Saltar índice de contenido - Desplazarse al índice de navegación.
Contenido: Preliminares. Caja centrada. Dos columnas. Tres columnas. Marcos sin marcos. Bloques en línea. Fondo elástico. Comentarios.
En el anterior taller hemos visto algunas técnicas de implementación de ciertas características del nivel 2 de CSS. Supongo que es un buen momento para utilizar toda esa munición. Para comprender estos modelos, amén de la lectura comprensiva del mencionado taller, es conveniente estar familiarizado con la especificación CSS2. A continuación unos cuantos ejemplos simples de maquetación. Son modelos que tradicionalmente se conseguían mediante tablas. Quizás en un futuro taller se aborden esquemas más complejos y acabados. Sin embargo, en este primer contacto ha primado la sencillez sobre todo lo demás.
El ya clásico problema de centrar un cuadro en horizontal y en vertical. Bajo mi punto de vista admite tres versiones más una, y por tanto hay cuatro ejemplos.
Este ejemplo es de una simplicidad aplastante. Simplemente se posiciona en absoluto la caja y se especifican sus coordenadas y dimensiones a porcentaje.
<div id="CentradaLL">... contenido de la caja... </div>
div#CentradaLL { position:absolute; top:10%; left:10%; width:80%; height:80%; }
Ejemplo: Caja centrada (margen líquido-contenido líquido).
El truco consiste en posicionar la caja al cincuenta por ciento. El efecto de centrado se consigue dando unos márgenes negativos que sean la mitad del ancho y del alto.
<div id="CentradaLS">... contenido de la caja... </div>
div#CentradaLS { position:absolute; top:50%; left:50%; width:500px; height:300px; margin-left:-250px; margin-top:-150px; }
Ejemplo: Caja centrada (margen líquido-contenido sólido).
La caja es absoluta, y se dibuja a partir de sus coordenadas. Internet Explorer no es capaz de calcular las dimensiones de una caja a partir de esos valores, de manera que se incluye un script que maneja el evento resize
para calcular.
<div id="CentradaSL">... contenido de la caja... </div>
div#CentradaSL { position:absolute; top:64px; right:64px; bottom:64px; left:64px; }
var MargenH = 80; var MargenV = 64;
var ELM = (document.getElementById);
var IE5 = ((ELM) && (navigator.userAgent.toLowerCase().indexOf('msie')!=-1) && !(window.opera));
if (IE5) window.onresize=Dimensionar;
function Dimensionar () {
document.getElementById('CentradaSL').style.width = (document.body.clientWidth-2*MargenH)+'px';
document.getElementById('CentradaSL').style.height = (document.body.clientHeight-2*MargenV)+'px';
}
Ejemplo: Caja centrada (margen sólido-contenido líquido).
Antes de pasar a otros modelos, podemos detenernos en un caso parecido, como puede ser el de centrar sólo en horizontal una caja de ancho fijo. Es un modelo que tradicionalmente se ha venido haciendo insertando el contenido en una tabla, y esta a su vez en un div alineado y también en un obsoleto elemento center. La solución es tremendamente sencilla, con un solo elemento:
<div id="CentradaHS">... contenido de la caja... </div>
div#CentradaHS { width:400px; margin:auto; }
Sin embargo, y una vez más, Internet Explorer parece no reconocer la declaración CSS. Para conseguir lo mismo, podemos recurrir a una ligera artimaña, basada precisamente en otro error de interpretación:
<div id="Contenedora">
<div id="CentradaHS">... contenido de la caja... </div>
</div>
div#Contenedora { width:100%; text-align:center; }
div#CentradaHS { width:400px; margin:auto; text-align:left; }
La declaración text-align:center
no debería tener efecto sobre la colocación del bloque interior, sino sobre sus elementos en línea, pero este nuevo fallo de implementación nos permite simular el comportamiento correcto. Obsérvese que hay que corregir la alineación real en la segunda regla.
Ejemplo: Caja centrada en horizontal (contenido sólido).
La presentación a dos columnas es una de las más repetidas, más que típica es ya un tópico. Hay varias maneras de conseguirla, y la más sencilla pasa por definir ambas columnas a porcentaje. Aquí vamos a optar por una disposición algo más arriesgada, consistente en bloquear el tamaño de la columna izquierda. El mayor peligro que se corre es que la derecha quede demasiado estrecha cuando las dimensiones de la ventana sean pequeñas, lo cual se salva utilizando la propiedad min-width
. En el anterior taller se da la solución para cubrir esta última propiedad en Internet Explorer, que no la reconoce.
<div id="Izquierda">... contenido de la caja izquierda... </div>
<div id="Derecha">... contenido de la caja derecha... </div>
div#Izquierda { position:absolute; top:0; left:0; width:200px; height:inherit; }
div#Derecha { margin-left:200px; min-width:350px; }
Si la anterior es un tópico, ésta es el "Santo Grial", al menos así llaman muchos a la presentación a tres columnas. Incluso el W3C adopta este esquema en su página inicial, pero lo gestionan mediante una tabla (en casa del herrero cuchillo de palo). Aquí lo haremos a nuestra manera, y por supuesto sin tablas. Simplificando al máximo, las cajas laterales van posicionadas en absoluto y su ancho es fijo. Al estar fuera de flujo, el lugar que ocupan dentro del código HTML es lo de menos. Los márgenes de la caja central tienen que coincidir con lo que ocupan las cajas laterales.
Para evitar que los contenidos se superpongan cuando el tamaño de la ventana sea pequeño, se anidan las tres cajas en otra que hace uso de la propiedad min-width
. Además del apaño para emular esto mismo en Internet Explorer, también hay que hacer unos retoques mínimos en los márgenes de las cajas centrales, debido a que las cajas tienen borde, y el citado navegador también los interpreta incorrectamente.
<div id="Madre">
<div id="Izquierda">... contenido de la caja izquierda... </div>
<div id="Central">... contenido de la caja central... </div>
<div id="Derecha">... contenido de la caja derecha... </div>
</div>
div#Madre { position:relative; min-width:620px; height:inherit; }
div#Izquierda { position:absolute; top:0; left:0; width:180px; height:100%; }
div#Central { margin-left:179px; margin-right:179px; }
html>body div#Central { margin-left:181px; margin-right:181px; }
div#Derecha { position:absolute; top:0; right:0; width:180px; height:100%; }
La manida presentación en paneles, usual en las páginas que usan marcos (ver el debate sobre marcos), puede reproducirse sin necesidad de usarlos, al menos en las últimas versiones de Internet Explorer y en los navegadores basados en el núcleo "Gecko". Otros navegadores importantes, como Opera o Konqueror no reconocen la declaración overflow:auto;
y su aplicación acarrea graves problemas de accesibilidad, al poder quedar oculta una parte del texto. De manera que para evitar esto, se parte de un modelo más sencillo (que se deja como ejercicio para el lector) para aplicar el estilo avanzado donde funcione. Por lo demás, el modelo es muy simple, tres cajas posicionadas con dimensiones porcentuales.
<div id="Superior">... contenido de la caja superior... </div>
<div id="Izquierda">... contenido de la caja izquierda... </div>
<div id="Derecha">... contenido de la caja derecha... </div>
body { overflow:auto; }
div#Superior { position:absolute; top:0; left:0; width:100%; height:15%; overflow:auto; }
div#Izquierda { position:absolute; top:15%; left:0; width:25%; height:85%; overflow:auto; }
div#Derecha { position:absolute; top:15%; left:25%; width:75%; height:85%; overflow:auto; }
A falta de una propiedad CSS más indicada para esto que sea soportada por una mínima parte de navegadores, nos tenemos que conformar con utilizar cajas flotantes. La única pega es que si no tienen todas la misma altura la colocación es impredecible, y no tiene arreglo sin utilizar el DOM (e incluso ni por esas).
<div>...contenido de la caja...</div>
<div>...contenido de la caja...</div>
<div>...contenido de la caja...</div>
...
div { float:left; width:190px; height:190px; margin:1px; }
Este modelo da solución al problema de incluir un fondo con ornamento en los bordes, pero que pueda cambiar de tamaño sin problemas. Es más difícil explicarlo que ponerlo en funcionamiento.
<div id="Todo">
<div id="CajaN">
<div id="CajaNO"></div>
<div id="CajaNE"></div>
</div>
<div id="CajaO">...contenido de la caja...</div>
<div id="CajaS">
<div id="CajaSO"></div>
<div id="CajaSE"></div>
</div>
</div>
div#Todo { margin:48px; background:#FC9 url('fondo_e.png') right top repeat-y; }
div#CajaN { height:45px; background:url('fondo_n.png') repeat-x; }
div#CajaNO { float:left; width:45px; height:45px; background:url('fondo_no.png') no-repeat; }
div#CajaO { background:url('fondo_o.png') repeat-y; }
div#CajaNE { float:right; width:45px; background:url('fondo_ne.png') right top no-repeat; }
div#CajaS { height:45px; background:url('fondo_s.png') repeat-x; }
div#CajaSO { float:left; width:45px; height:45px; background:url('fondo_so.png') no-repeat; }
div#CajaSE { height:45px; background:url('fondo_se.png') right top no-repeat; }
Publicado por yulio, 19/01/09, 02:24
Siempre he querido hacer una página Web y no sabía como comenzar.
Gracias porque ahora me lanzo con zapato y todo. No será gran cosa Mi Página Web porque hace dos meses que estoy en esto.
Gracias y saludos
Yulio
Publicado por Sebas, 19/01/09, 04:51
El autor del artículo de la pagina que nombras es el mismo que de Tierra de nómadas.
Al final del artículo lo dice...
http://www.webtaller.com/construccion/lenguajes/css/lecciones/maquetacion_css-5.php
Publicado por Marfilia, 04/07/09, 10:59
Hola, de verdad muchas gracias por la informacion, me ha servido mucho para poder trabajar paginas usando capas y estilos. De mucha ayuda y bien explicado.
un abrazo
Publicado por Marfilia, 05/07/09, 03:02
Hola tu aporte es grandioso, pero como hariamos para maquetar el pie de pagina?????
Publicado por ERICK, 23/11/09, 03:19
Gracias por este post, era lo que ocupaba desde hace mucho tiempo. Mil Gracias
Publicado por ERICK, 23/11/09, 05:09
Gracias por este post, era lo que ocupaba desde hace mucho tiempo. Mil Gracias
Publicado por José Antonio, 23/01/10, 01:45
No suelo escribir comentarios, pero de verdad, muy completo, muy bien explicado y de adaptación del código super sencilla. Gracias
Publicado por Gabriel, 02/02/10, 02:24
Excelente tu taller de maquetación. Llevo un día entero con un problema de maquetación de columnas, tendría que haber visto tu página antes :-)
Saludos.
Publicado por Jose Tapia, 10/07/10, 03:11
Excelente aporte dema bonita la explicacion para los q somos medio tiesos para hacer las cajas jaja, muchas gracias por tu esfuerzo y trabajo te deseo lo mejor
http://www.voipsystemscr.com
08/05/2002. sysifus. Taller nº 3.
Estás en: tierra de nómadas > tallerWeb > Maquetación CSS.