DTIC - Universitat Pompeu Fabra

Anuncio
Curso de Verano 2010
Estilos CSS para el Diseño Web
7. Posicionamiento y diseño con CSS
7.1 Clases vs IDs
Ya hemos visto el potencial y uso del modelo de caja, y hemos visto algunas cosas básicas de
posicionamiento, como las imágenes flotantes. Es momento de ver un poco más de este tema,
comenzando por las bases: las clases y los identificadores.
Cuándo usar cuál
La elección entre uso de una clase o un identificador es casi inmediato si pensamos en que los
identificadores deben ser únicos en nuestro HTML, mientras que las clases no tienen esa
restricción.
Así, la decisión es simple: si se trata de un bloque único, debemos usar un identificador, mientras
que si necesitamos asignar algo a múltiples elementos, debemos usar clases.
Es habitual que los identificadores, además de ser únicos, se usen para bloques claramente
identificables en nuestro diseño. Un encabezado, un pie de página o una zona de búsqueda son
zonas únicas en sí mismas, y por ello es muy simple pensar en ellas como un bloque con
identificador. Por ejemplo, algo así:
<div id=”header”>
<div id=”contents”>
<div id=”footer”>
Las clases, por otro lado, suelen usarse para elementos reusable y para bloques que tendremos
presente varias veces en una página. Por ejemplo:
<div id=”post-gallery”>
<a href=”#”><img class=”gallery-item” src=”foto1-thumbnail.jpg”></a>
<a href=”#”><img class=”gallery-item” src=”foto2-thumbnail.jpg”></a>
<a href=”#”><img class=”gallery-item” src=”foto3-thumbnail.jpg”></a>
<div>
No son excluyentes
Es muy importante tener presente que uno no entra en conflicto con el otro, uno puede tener un
elemento con clase e identificador al mismo tiempo. Por ejemplo, podríamos tener varios párrafos
con una clase determinada, y uno de ellos además tener un identificador. Por ejemplo:
<div id=”post-gallery”>
<a href=”#”><img class=”gallery-item” src=”thumb1.jpg” id=”main-pic”></a>
<a href=”#”><img class=”gallery-item” src=”thumb2.jpg”></a>
<a href=”#”><img class=”gallery-item” src=”thumb3.jpg”></a>
<div>
Esto es habitual cuando, además de diseño, necesitamos interactuar con los elementos del HTML
(por ejemplo, vía javascript 1).
1
Un tema fuera del alcance del curso. En JS, necesitamos en ocasiones acceder a los elementos HTML, y se hace a
través de su ID.
Universitat Pompeu Fabra
Prof. Alejandro Ramírez
1
Curso de Verano 2010
Estilos CSS para el Diseño Web
7.2 Posicionamiento
Entremos al tema en cuestión: posicionamiento. Ya hemos hablado de que antes el diseño de la
estructura (el layout) se realizaba con tablas, pero lo más correcto hoy en día es usar sólo CSS para
ello 2, dejando al HTML hacer su trabajo real, que no es ocuparse de la presentación.
De hecho, existe el término CSS-P para referirse a un diseño sin tablas, con posicionamiento (de
ahí la P) hecho sólo con CSS.
Inline y block
Ya lo mencionamos, pero un recordatorio no está de más: los elementos HTML se comportan
como bloques (block) que rompen el flujo o como elementos en línea que siguen el flujo
(inline). Un block ocupa un área rectangular (que salta de línea, y que se sitúa expandiéndose
a lo ancho hasta donde su contenedor se lo permita), mientras que un inline sigue al texto,
limitándose al ancho que ocupa.
Con CSS, sin embargo, siempre podemos hacer que uno se convierta en otro, si afectamos sus
propiedades en la hoja de estilos. Veamos un ejemplo 3. En el HTML tenemos bloques con
contenido.
<div id="uno">Un DIV es, por defecto, un block</div>
<p>Un párrafo normal, que se comporta como bloque.</p>
<div id="dos">Un DIV que se comporta como inline.</div>
<p>Un párrafo con <a href="http://www.cinenganos.com">un enlace</a> que se
comporta como inline.</p>
<p>Otro párrafo que tiene <a class="bloque"
href="http://www.forodecine.com">otro enlace</a> que se comporta como
bloque.</p>
Que, con el CSS asociado, en el navegador se mostrará como sigue:
El CSS es el que sigue:
#uno {
background-color: #CCCCCC;
color: #000000;
border: 2px solid #AAAAAA;
padding: 2px 6px 2px 6px;
}
2
3
Y, en la práctica, es una de las capacidades que diferencia a los maquetadores web que están al día.
Ver 201.html y sus estilos en este tema.
Universitat Pompeu Fabra
Prof. Alejandro Ramírez
2
Curso de Verano 2010
Estilos CSS para el Diseño Web
#dos{
color: #000000;
border: 2px solid #AAAAAA;
padding: 2px 6px 2px 6px;
display: inline;
background: #99CC00;
}
a {
color: #FFFFFF;
text-decoration: none;
padding: 1px 2px 1px 2px;
background: #006699;
}
a.bloque {
display: block;
background: #99CC00;
}
Veamos los detalles:
•
•
•
•
•
•
El primer div es block por defecto. Si vemos, al no asignar dimensiones el div se
extiende a todo lo ancho de su contenedor (body, en este caso), y ocupa el alto del
contenido. Es el comportamiento normal.
El párrafo que le sigue es block también, por lo que no intenta ponerse al lado del primer
div sino que se posiciona debajo, porque block no busca seguir el flujo, sino ser una caja
nueva.
El segundo div se muestra con display de inline, de modo que sólo se extiende al
ancho del contenido, ya que busca seguir el flujo normal.
El siguiente párrafo es un block por defecto, y por ello, como en el párrafo de antes,
aparece debajo.
Este párrafo tiene en su interior un enlace (por defecto es inline) que se comporta
normalmente.
El último párrafo tiene otro enlace, al que se ha asignado un display de block. Como
vemos, al ser un block, rompe el flujo, actuando como si se tratara de una caja. Saltando a
la siguiente línea, y ocupando todo el ancho al no tener dimensiones fijas.
Se trata de un ejemplo para evaluar el uso y comportamiento de los bloques que necesitaremos
en un diseño cualquiera. Les toca experimentar con las opciones. Para preguntas sobre el tema,
los foros están, como siempre, abiertos.
Aplicaciones de la caja
Ya hemos trabajado con las cajas, pero podemos reforzar y revisar algunos detalles particulares.
Comportamiento de márgenes
Si tenemos un CSS como el que sigue:
margin: 10px;
padding: 10px;
Sabemos que se define un margen de 10px a los cuatro lados, de modo que el espacio entre la caja
y el resto de bloques a su alrededor es de 10px.
Universitat Pompeu Fabra
Prof. Alejandro Ramírez
3
Curso de Verano 2010
Estilos CSS para el Diseño Web
¿Qué pasa en un caso como el del ejemplo 4 que sigue? El HTML tiene tres bloques:
<div>Primer bloque</div>
<div>Segundo bloque</div>
<div>Tercer bloque</div>
Y el CSS asociado es este:
body{
margin: 0px;
padding: 0px;
}
div{
border: 1px solid #000000;
margin: 10px;
padding: 10px;
}
Con el borde visible para entender bien el efecto, y 10px de padding y margin en todos los lados
de los elementos div.
Si pensamos en la caja, estamos diciendo que, cada div tiene un margen inferior de de 10px y el
que le sigue tiene definido uno superior de 10px. ¿Verdad?
En el navegador se mostrará así:
Y aquí podemos ver un detalle peculiar: los márgenes no se suman. La separación entre los div es
de 10px, como puede apreciarse.
Es decir, el margen total entre los div es de 10px y no de 20px (10px del inferior del primero más
10px del superior del segundo). El margin se refiere al espacio alrededor de la caja, y así se
interpreta.
Elementos flotantes
En el tema de imágenes ya vimos cómo podemos usar elementos flotantes, lo que permite que
tengamos diseños con un control precio de dónde mostramos qué.
Como sabemos, podemos hacer que un elemento (o una caja 5) flote, como la imagen del código
de este ejemplo 6:
4
Ver 202.html.
Bastaría que se aplique a un elemento block, a un div con contenido, etc.
6
Ver 203.html.
5
Universitat Pompeu Fabra
Prof. Alejandro Ramírez
4
Curso de Verano 2010
Estilos CSS para el Diseño Web
<img src="img/loremipsum.gif" width="200" height="200" alt="peppers"
class="featureimg" /> ...
Que gracias al CSS queda flotando:
.featureimg {
float: right;
border: 2px solid #000000;
margin: 0px 0px 10px 10px;
padding: 5px;
}
Logrando que en el navegador aparezca así:
Para entender mejor la posición de los bloques, vale la pena ver el orden de los elementos en el
HTML. La variante de este otro código de muestra 7 incluye el miso HTML y un ajuste de CSS (un
borde visible) para ver cada contenedor de manera explícita:
ul, h2, p{
border: 1px solid #990000;
}
Que provoca que en el navegador tengamos lo que se muestra en la imagen que sigue 8, con cada
bloque muy visible.
La imagen img del inicio del código, al flotar, rompe el flujo y deja su lugar al contenido siguiente
(la lista ul, seguida del primer párrafo p). Como podemos ver, la imagen flota y se sitúa a la
derecha, con lo que queda a la misma altura que el siguiente elemento (la lista), y por ello los
bordes superiores coinciden.
Al flotar la imagen, vemos que la caja de cada bloque siguiente (lista y párrafos) mantiene su
comportamiento de caja (ver los bordes) pero el contenido se ajusta para dejar espacio al
elemento que flota.
7
8
Ver 204.html.
En la siguiente página.
Universitat Pompeu Fabra
Prof. Alejandro Ramírez
5
Curso de Verano 2010
Estilos CSS para el Diseño Web
La parte relevante (y evidente con los bordes) es que los elementos block ignoran la posición del
flotante, pero sus contenidos se ajustan para dejarle el espacio donde quede.
Romper la flotación
Para romper la flotación, en el sentido de que los elementos dejen de reubicarse al usar float, se
usa la propiedad clear. Esta propiedad se usa junto a float para ayudar a ‘limpiar’ las zonas de
flotación, cuando necesitamos que los elementos que están junto a la flotación dejen de seguir el
flujo.
La propiedad clear admite valor de left (para indicar que el elemento al que se aplica no
permite elementos flotantes a su izquieda), right (para indicar que no los permite a su derecha)
y both (indicando que no admite en ninguno de los dos lados).
Como ejemplo, podemos ver este otro código 9, donde se ha agregado una clase al segundo de los
párrafos:
...<p class="clear">Phasellus interdum consecte...
Que usa este CSS:
.clear{
clear: right;
}
Lo que provoca que el elemento no acepte flotantes a su lado derecho. Como la imagen flota a la
derecha, eso causa que el párrafo se mueva, saliendo d su sitio, hasta salir completamente del
área que flota.
9
Ver 205.html.
Universitat Pompeu Fabra
Prof. Alejandro Ramírez
6
Curso de Verano 2010
Estilos CSS para el Diseño Web
En el navegador aparecerá como en la siguiente imagen:
Les toca experimentar el efecto. Pueden cambiar la flotación al otro lado, jugar con clear del
lado izquierdo, ajustar los márgenes de la imagen (que estaba con márgenes sólo de ciertos lados
y si se cambia la flotación necesitarían ajustes), etc.
Imágenes y texto
Un ejemplo de flotación nos permite aprovechar al máximo sus ventajas, en una aplicación muy
común, con texto e imagen flotantes, como se hace habitualmente con un logo y un slogan en la
cabecera de un sitio.
El código de muestra es el siguiente 10:
<div id="header">
<img src="img/logo-loremipsum.jpg" width="400" height="80" class="logo" />
<span class="slogan">Lorem ipsum dolor!</span></div>
Que incluye una cabecera con imagen (clase logo) y un span con el slogan, clase slogan.
En el navegador, aparecerá así:
10
Ver 206.html.
Universitat Pompeu Fabra
Prof. Alejandro Ramírez
7
Curso de Verano 2010
Estilos CSS para el Diseño Web
Gracias al CSS que sigue:
#header .slogan {
font: italic bold 1.3em Georgia, "Times New Roman", Times, serif;
color: #006699;
background-color: transparent;
float: right;
margin-top: 1.5em;
margin-right: 1em;
}
#header .logo {
float: left;
width: 400px;
}
Donde se ha puesto el logo a flotar a un lado, y el slogan al otro.
Para experimentar, si agregan un borde a cada uno, como en ejemplos anteriores, podrán ver el
contenedor de cada uno de ellos (y el contendor de ambos, el div).
Sugiero experimenten con dimensiones de las cajas y contenedor, para ver el efecto que tienen si
se ajustan las dimensiones (por ejemplo, dar un tamaño grande a slogan).
7.3 Diseño líquido
El ejemplo anterior nos permite apreciar algo que pasa con el posicionamiento de los bloques. En
una ventana de tamaño estándar, el código se mostrará así:
Mientras que si reducimos el ancho de la ventana, al haber flotación, el logo sigue flotando, lo
mismo hace el slogan, que se acomoda como corresponde:
En el caso extremo, al reducir de más el ancho del navegador, la flotación provocaría esto:
Desplazando el elemento flotante que se queda sin espacio y por tanto rompe el diseño deseado.
Esto se relaciona con lo líquido que puede llegar a ser el layout de CSS.
Universitat Pompeu Fabra
Prof. Alejandro Ramírez
8
Curso de Verano 2010
Estilos CSS para el Diseño Web
El concepto de líquido se relaciona con el hecho de que los distintos elementos contenedores de
la estructura del HTML pueden tener dimensiones variables (definidas como porcentaje de
pantalla por ejemplo).
Un contenedor líquido cambiará su tamaño si se ajusta la dimensión de la ventana del
navegador.
Este código de muestra 11 incluye este concepto:
<div id="liquido">
<div id="fijo">Este es fijo.</div>
Este es líquido.
</div>
El código tiene dos div, que en el CSS quedan así:
#liquido{
background: #99CC00;
border: 3px solid #999900;
color: #333333;
margin: 10px;
padding: 10px;
}
#fijo
{
color: #FFFFFF;
background: #006699;
border: 2px solid #003366;
margin: 10px;
padding: 10px;
height: 150px;
width: 150px;
}
El #fijo se ha definido con dimensiones concretas, dentro del #lquido, que no tiene
dimensiones.
Esta ausencia de dimensiones hace que el bloque se extienda hasta el máximo que le permita la
ventana, con lo que, si aumentamos la ventana del navegador, el contenedor cambiará sus
dimensiones, como en estas imágenes:
11
Ver 301.html.
Universitat Pompeu Fabra
Prof. Alejandro Ramírez
9
Curso de Verano 2010
Estilos CSS para el Diseño Web
Pueden experimentar con más texto, y flotando los elementos. Por defecto, un contenedor al que
no se define un tamaño fijo, se comportará líquido, como en distintos ejemplos que hemos visto
antes.
Márgenes variables
La noción de liquidez debida a valores porcentuales servirá para reforzar las implicaciones de los
ajustes. Este código 12 nos permite verlo:
<div id="uno">Uno</div>
<div id="dos">Uno</div>
Dos div, uno seguido del otro. Con este CSS para los bloques en cuestión:
#uno{
background: #99CC00;
border: 3px solid #999900;
color: #333333;
padding: 10px;
margin-right: 15%;
margin-left: 15%;
}
El primer bloque tundra un margen a cada lado (izquierda y derecha) de 15%. Es decir, el
contenedor usará sólo un 70% de la pantalla 13 (ya que 15% + 15% se va en márgenes laterales).
#dos
{
color: #FFFFFF;
background: #006699;
border: 2px solid #003366;
padding: 10px;
width: 50%;
margin-left: 15%;
}
El segundo bloque tiene un ancho del 50% de su contenedor, con un margen izquierdo de 15%. Sin
indicarlo, esto implica que el margen derecho será variable, de un 35% de la pantalla, lo restante.
En el navegador aparecerá como en la siguiente imagen.
12
Ver 302.html.
Estrictamente hablando, del contenedor que lo incluye, pero en este caso es body, directamente el cuerpo en la
pantalla del navegador.
13
Universitat Pompeu Fabra
Prof. Alejandro Ramírez
10
Curso de Verano 2010
Estilos CSS para el Diseño Web
Y pueden variar la ventana para ver el efecto. Al estar porcentualmente definidos, es evidente el
layout líquido en estos casos.
Estructuras usuales: columnas
Veamos dos ejemplos muy comunes de cómo se explota el diseño líquido de los CSS: el uso de
columnas14, como en la gran mayoría de las páginas web que hay. Y, con CSS, sin tablas.
Dos columnas
El siguiente HTML15 tiene un ejemplo de estructura básica: cabecera, pie de página, y contenido en
dos columnas, una de navegación y otra de contenido como tal.
<div
<div
<div
<div
id="header"></div>
id="nav"></div>
id="content"></div>
id="footer"></div>
Con este CSS para los bloques:
#header{
height: 50px;
margin-bottom: 10px;
background: #666666;}
#nav{
float: left;
width: 25%;
height: 150px;
background-color: #999999;
margin-bottom: 10px;}
#content{
float: left;
margin-left: 5%;
width: 65%;
height: 150px;
margin-bottom: 10px;
margin-right: 5%;
background: #CCCCCC;}
#footer{
clear: both;
height: 50px;
background-color: #666666;
margin-bottom: 10px;}
Donde destaca que la cabecera #header es un bloque ordinario, seguida de dos bloques flotantes
(#nav y #content) y un #footer que, con clear, rompe la flotación y sigue el flujo.
14
Son sólo posibles variantes. Hay múltiples formas de hacerlo con CSS-P, algunas técnicas más complejas que otras.
La intención es que comprendan el funcionamiento, y que pudieran pasar a CSS-P más avanzado en un futuro.
15
Ver 303.html.
Universitat Pompeu Fabra
Prof. Alejandro Ramírez
11
Curso de Verano 2010
Estilos CSS para el Diseño Web
En el navegador, se verá así:
Donde, si variamos la ventana del navegador, podemos ver el comportamiento líquido de los
bloques de contenido. La navegación tiene un 25% del ancho, el contenido 65%, lo que deja un
margen lateral para el contenido, a ambos lados, de un 5% en cada lado (suma = 100%).
Como nota importante, la altura en el CSS de los bloques #nav y #content es sólo para dar
visibilidad, con contenido real, no se necesita la altura de estos bloques.
Como variante, pueden experimentar con los anchos, para que, por ejemplo, se invirtieran los
casos y la navegación quedase a la derecha y no a la izquierda.
Tengan cuidado con los anchos totales, ya que si la suma da algo superior al 100%, se puede
romper la estructura (por ejemplo, si no se tienen en cuenta los % de los márgenes y se definen
columnas de 25% y 75% que ya suman 100% pero a lo que además se suman los márgenes si
existen)
Líquido y fijo al mismo tiempo
Es habitual que la zona de navegación no se deje líquida, y se mantenga fija. El ejemplo de
código 16 incluye este ajuste, que en el navegador mantiene fija la columna de navegación.
Este código difiere del anterior ya que la columna de navegación flota, pero la de contenidos no lo
hace, de modo que, como sabemos de otros ejemplos, se coloca siguiendo la flotación.
16
Ver 304.html.
Universitat Pompeu Fabra
Prof. Alejandro Ramírez
12
Curso de Verano 2010
Estilos CSS para el Diseño Web
En el CSS, tenemos estos bloques:
#nav
{
float: left;
width: 180px;
height: 150px;
background-color: #999999;
margin-bottom: 10px;
}
#content
{
margin: 0 20px 10px 200px;
height: 150px;
background: #CCCCCC;
}
Donde podemos ver que #nav flota, pero que #content sólo ajusta sus márgenes, para que el
contenedor establezca sus límites teniendo en cuenta el tamaño del elemento flotante.
Como #nav mide 180px de ancho, #content establece un margen izquierdo de 200px, para que
el eespacio entre ellos quede de 20px. Con estos ajustes, el elemento queda siguiendo la flotación,
pero con control completo de sus márgenes y posición.
Para entender mejor esto último, puede verse esta variante 17:
#content
{
height: 150px;
background: #CCCCCC;
border: 5px solid #000000;
}
A la que se ha quitado el margen y se ha puesto un borde visible para ver el contenedor real.
En el navegador, se muestra así:
Donde podemos ver que #content sigue la flotación, con su margen izquierdo en el extremo.
17
Ver 305.html.
Universitat Pompeu Fabra
Prof. Alejandro Ramírez
13
Curso de Verano 2010
Estilos CSS para el Diseño Web
Si cambiamos un poco el CSS 18, de modo que quede así:
#content
{
margin: 0 20px 10px 200px;
height: 150px;
background: #CCCCCC;
border: 5px solid #000000;
}
Es decir, como en el primer ejemplo, pero con borde visible para contrastar, podemos ver la
diferencia y la relevancia que tiene el margen en este caso, al seguir la flotación de #nav.
En el navegador:
Tres columnas
Los mismos principios se pueden llevar a tres columnas.
El código de ejemplo 19 incluye tres bloques:
<div id="col1"></div>
<div id="col2"></div>
<div id="col3"></div>
Que, con su CSS, permiten ajustar las columnas –flotantes- con mucha precisión:
#col1
{
float: left;
width: 48%;
margin-left: 3%;
height: 75px;
background: #666666;
}
18
19
Ver 306.html.
Ver 307.html.
Universitat Pompeu Fabra
Prof. Alejandro Ramírez
14
Curso de Verano 2010
Estilos CSS para el Diseño Web
#col2
{
float: left;
width: 20%;
margin-left: 3%;
background: #999999;
height: 75px;
}
#col3
{
float: left;
width: 20%;
margin-left: 3%;
background: #CCCCCC;
height: 75px;
}
Que en el navegador se mostrará así:
Si observamos con detalle, podemos ver que la primera columna usa un 51% (48% y 3% de
margen), la segunda un 23% (20% + 3%) y que la última columna también tiene un 23%.
La suma, en este caso, es de 97%. Repartir el porcentaje restante 20 es una opción, pero depende
de nuestras necesidades. Al usar valores porcentuales no siempre podemos entrar en precisión
total, y es habitual que las sumas no lleguen siempre a 100%.
A estas alturas, agregar cabecera y pie de página a este layout debería ser muy simple ;-) Les
queda como algo a experimentar.
¡Experimentar!
Les toca seguir con este tema y las estructuras de dos y tres columnas (que son muy habituales).
Piensen que los div de muestra (tanto en dos como en tres columnas) pueden tener cualquier
contenido (más div, imágenes, texto, distintos bloques anidados, etc.), de modo que las
posibilidades finales de layout son ilimitadas.
Para uso más complejo, sugiero usen la propiedad min-height, que define la altura mínima que
se espera en un bloque. Por ejemplo, para que la zona de navegación tenga una altura mínima
independiente del alto de los otros bloques.
Los foros, como siempre, están siempre abiertos para resolver cualquier duda.
20
Que de momento se quedaría sin asignar. El margen derecho de la tercera columna quedaría entonces más variable,
al ser el único sin valor asignado, pero al entrar en porcentajes, no se tiene un control absoluto ya que el 3% de algo
variable (la ventana del navegador) dará a veces ciertas variaciones mínimas.
Universitat Pompeu Fabra
Prof. Alejandro Ramírez
15
Curso de Verano 2010
Estilos CSS para el Diseño Web
Las posibilidades
Como extra a este tema, el código final de muestra 21 de este tema incluye una variante extrema
del uso de lo líquido. Es una muestra para que vean el alcance y las posibilidades que hay (¡y sin
usar tablas!).
Obviamente, se trata de un layout mucho más avanzado pero lo incluyo sólo como ejemplo de lo
que se puede llegar a hacer sin tablas, como motivación y como ejemplo de potencial. En el
código, sólo hay mucha flotación y ajustes como los que conocemos, para que el flujo haga justo lo
que deseamos que haga.
Destaca el uso de bloques que, sin contenido, sólo rompen flotaciones y aseguran un flujo:
<div class="spacer"> </div>
Que usan este CSS:
.spacer{float: left; width: 3%; clear: both;}
Y, finalmente, otra cosa a destacar es la presencia de un selector de adyacentes.
h3+p {margin-top: .2em;}
Que indica, con el signo +, que se aplica a los <p> que estén inmediatamente después de un <h3>.
En el navegador, tenemos este resultado:
21
Ver 308.html.
Universitat Pompeu Fabra
Prof. Alejandro Ramírez
16
Descargar