U02 CSS3
U02 CSS3
Programación Web
Unidad 2: CSS3
1
Índice
1. CSS y HTML 3
2. Estilos y estructura 3
2.1. Elementos block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2. Modelos de caja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
6. Propiedades CSS3 20
6.1. Las nuevas reglas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
6.2. Plantilla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
6.3. Border-radius . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
6.4. Box-shadow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
6.5. Text-shadow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.6. @font-face . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.7. Gradiente lineal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
6.8. Gradiente radial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
6.9. RGBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
6.10. HSLA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.11. Outline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.12. Border-image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.13. Transform y transition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
6.13.1. Transform: scale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
6.13.2. Transform: rotate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.13.3. Transform: skew . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.13.4. Transform: translate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
6.14. Transformando todo al mismo tiempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
6.15. Transformaciones dinámicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
6.16. Transiciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2
Unidad 2 - Estilos CSS y modelos de caja
1. CSS y HTML
La nueva especificación de HTML (HTML5) no describe solo los nuevos elementos HTML o el lenguaje
mismo. La web demanda diseño y funcionalidad, no solo organización estructural o definición de secciones. En
este nuevo paradigma, HTML se presenta junto con CSS y Javascript como un único instrumento integrado.
Ahora vamos a analizar CSS, su relevancia dentro de esta unión estratégica y su influencia sobre la
presentación de documentos HTML.
Oficialmente CSS nada tiene que ver con HTML5. CSS no es parte de la especificación y nunca lo fue. Este
lenguaje es, de hecho, un complemento desarrollado para superar las limitaciones y reducir la complejidad de
HTML. Al comienzo, atributos dentro de las etiquetas HTML proveı́an estilos esenciales para cada elemento,
pero a medida que el lenguaje evolucionó, la escritura de códigos se volvió más compleja y HTML por sı́
mismo no pudo más satisfacer las demandas de diseñadores. En consecuencia, CSS pronto fue adoptado como
la forma de separar la estructura de la presentación. Desde entonces, CSS ha crecido y ganado importancia,
pero siempre desarrollado en paralelo, enfocado en las necesidades de los diseñadores y apartado del proceso
de evolución de HTML.
La versión 3 de CSS sigue el mismo camino, pero esta vez con un mayor compromiso. La especificación
de HTML5 fue desarrollada considerando CSS a cargo del diseño. Debido a esta consideración, la integración
entre HTML y CSS es ahoravital para el desarrollo web y esta es la razón por la que cada vez que mencio-
namos HTML5 también estamos haciendo referencia a CSS3, aunque oficialmente se trate de dos tecnologı́as
completamente separadas.
En este momento las nuevas caracterı́sticas incorporadas en CSS3 están siendo implementadas e incluidas
ju nto al resto de la especificación en navegadores compatibles con HTML5.
Conceptos básicos
CSS es un lenguaje que trabaja junto con HTML para proveer estilos visuales a los elementos del
documento, como tamaño, color, fondo, bordes, etc.
2. Estilos y estructura
A pesar de que cada navegador garantiza estilos por defecto para cada uno de los elementos HTML, estos
estilos no necesariamente satisfacen los requerimientos de cada diseñador. Normalmente se encuentran muy
distanciados de lo que queremos para nuestros sitios webs. Diseñadores y desarrolladores a menudo deben
aplicar sus propios estilos para obtener la organización y el efecto visual que realmente desean.
Elementos block son posicionados uno sobre otro hacia abajo en la página.
Elementos inline son posicionados lado a lado, uno al lado del otro en la misma lı́nea, sin ningún salto
de lı́nea a menos que ya no haya más espacio horizontal para ubicarlos.
Casi todos los elementos estructurales en nuestros documentos serán tratados por los navegadores como
el ementos block por defecto. Esto significa que cada elemento HTML que representa una parte de la orga-
nización visual (por ejemplo, <section>, <nav>, <header>, <footer>, <div>) será posicionado debajo del
anterior.
En el tema anterior creamos un documento HTML con la intención de reproducir un sitio web tradicional.
El diseño incluyó barras horizontales y dos columnas en el medio. Debido a la forma en que los navegadores
3
muestran estos elementos por defecto, el resultado en la pantalla está muy lejos de nuestras expectativas. Tan
pronto como el archivo HTML con el código del Listado 18, Apunte HTML 5, es abierto en el navegador,
la posición errónea en la pantalla de las dos columnas definidas por los elementos <section> y <aside> es
claramente visible. Una columna está debajo de la o tra en lugar de estar a su lado, como corresponderı́a.
Cada bloque (block) es mostrado por defecto tan ancho como sea posible, tan alto como la información que
contiene y uno sobre otro, como se muestra en la Figura 1.
Figura 1: Representación visual de una página web mostrada con estilos por defecto
Manos a la obra
Dentro de un archivo de texto vacı́o, copie cada código HTML estudiado en los siguientes listados y
abra el archivo en su navegador para comprobar su funcionamiento. Tenga en cuenta que el archivo
debe tener la extensió[Link] para ser abierto y procesado correctamente.
Usar la técnica demostrada anteriormente es una buena manera de probar estilos y obtener una vista
rápida de sus efectos, pero no es recomendado para aplicar estilos a todo el documento. La razón es simple:
cuando usamos esta técnica, debemos escribir y repetir cada estilo en cada uno de los elementos que queremos
modificar, incrementando el tamaño del documento a proporciones inaceptables y haciéndolo imposible de
mantener y actualizar. Solo imagine lo que ocurrirı́a si decide que en lugar de 20 pixeles el tamaño de cada
uno de los elementos <p> deberı́a ser de 24 pixeles. Tendrı́a que modificar cada estilo en cada etiqueta <p>
en el documento completo.
Manos a la obra
De ahora en adelante agregaremos estilos CSS al archivo llamado [Link]. Debe crear este archivo
en el mismo directorio (carpeta) donde se encuentra el archivo HTML y copiar los estilos CSS en su
interior para comprobar cómo trabajan.
Conceptos básicos
Los archivos CSS son archivos de texto planos. Al igual que los archivos HTML, puede crearlos
utilizando cualquier editor de texto como el Bloc de Notas de Windows, por ejemplo.
3.4. Referencias
Almacenar todos nuestros estilos en un archivo externo e insertar este archivo dentro de cada documento
que lo necesite es muy conveniente, sin embargo no podremos hacerlo sin buenos mecanismos que nos ayuden
6
a establecer una especı́fica relación entre estos estilos y los elementos del documento que van a ser afectados.
Cuando hablábamos sobre cómo incluir estilos en el documento, mostramos una de las técnicas utilizadas
a menudo en CSS para referenciar elementos HTML. En el código 2, el estilo para cambiar el tamaño de la
letra referenciaba cada elemento <p> usando la palabra clave p. De esta manera el estilo insertado entre las
etiquetas < style > referenciaba cada etiqueta <p> del documento y asignaba ese estilo particular a cada
una de ellas.
Existen varios métodos para seleccionar cuáles eleme ntos HTML serán afectados por las reglas CSS:
Más tarde veremos que CSS3 es bastante flexible a es te respecto e incorpora nuevas y más especı́ficas
técnicas para referenciar elementos, pero por ahora aplicaremos solo estas tres.
1 p { font - size : 20 px }
¿Pero qué ocurre si solo necesitamos referenciar una etiqueta especı́fica? ¿Debemos usar nuevamente el
atributo style dentro de esta etiqueta? La respuesta es no. Como aprendimos anteriormente, el método de
Estilos en Lı́nea (usando el atributo style dentro de etiquetas HTML) es una técnica en desuso y deberı́a ser
evitada. Para seleccionar un elemento HTML especı́fico desde las reglas de nuestro archivo CSS, podemos
usar dos atributos diferentes: id y class.
La regla anterior será aplicada al elemento HTML identificado con el atributo id=”texto1” . Ahora nuestro
código HTML lucirá de esta manera:
El resultado de este procedimiento es que cada vez que hacemos una referencia usando el identificador
texto1 en nuestro archivo CSS, el elemento con ese valor de id será modificado, pero el resto de los elementos
< p >, o cualquier otro elemento en el mismo documento, no serán afectados.
Esta es una forma extremadamente especı́fica de referenciar un elemento y es normalmente utilizada para
elementos más generales, como etiquetas estructurales. El atributo id y su especificidad es de hecho más
apropiado para refe rencias en Javascript, como veremos mas adelante.
Para trabajar con el atributo class, debemos declarar la regla CSS con un punto antes del nombre. La
ventaja de este método es que insertar el atributo class con el valor texto1 será suficiente para asignar estos
estilos a cualquier elemento que queramos:
Los elementos <p> en las primeras dos lı́neas dentro del cuerpo del código 9 tienen el atributo class
con el valor texto1. Como dijimos previamente, la misma regla puede ser aplicada a diferentes elementos en
el mismo documento. Por lo tanto, estos dos primeros elementos comparten la misma regla y ambos serán
afectados por el estilo del código 8. El último elemento <p> conserva los estilos por defecto otorgados por el
navegador.
La razón por la que debemos utilizar un punto delante del nombre de la regla es que es posible construir
referencias más complejas. Por ejemplo, se puede utilizar el mismo valor para el atributo class en diferentes
elementos pero asignar diferentes estilos para cada tipo:
En el código 10 creamos una regla que referencia la clase llamada texto1 pero solo para los elementos de
tipo <p>. Si cualquier otro elemento tiene el mismo valor en su atributo class no será modificado por esta
regla en particular.
Código 11: Referenciando solo elementos <p> que tienen el atributo name.
La regla del código 11 cambia solo elementos <p> que tienen un atributo llamado name. Para imitar lo
que hicimos previamente con los atributos id y class, podemos también especificar el valor del atributo:
Código 12: Referenciando elementos <p> que tienen un atributo name con el valor mitexto.
CSS3 permite combinar ”=” con otros para hacer una selección más especı́fica:
Si usted conoce Expresiones Regulares desde otros lenguajes como Javascript o PHP, podrá reconocer los
selectores utilizados en el código 13. En CSS3 estos selectores producen similares resultados:
La regla con el selector = será asignada a todo elemento <p> que contiene un atributo name con un
valor comenzado en ”mi” (por ejemplo, ”mitexto”, ”micasa”).
La regla con el selector $= será asignada a todo elemento <p> que contiene un atributo name con un
valor finalizado en ”mi” (por ejemplo ”textomi”, ”casami”).
La regla con el selector ∗ = será asignada a todo elemento <p> que contiene un atributo name con un
valor que incluye el texto ”mi” (en este caso, el texto podrı́a también encontrarse en el medio, como
en ”textomicasa”).
En estos ejemplos usamos el elemento <p>, el atributo name, y una cadena de texto al azar como ”mi”,
pero la misma técnica puede ser utilizada con cualquier atributo y valor que necesitemos. Solo tiene que
escribir los corchetes e insertar entre ellos el nombre del atributo y el valor que necesita para referenciar el
elemento HTML correcto.
9
4. Aplicando CSS a nuestra plantilla
Como ya aprendimos, todo elemento estructural es considerado una caja y la estructura completa es
presentada como un grupo de cajas.
Las cajas agrupadas constituyen lo que es llamado un Modelo de Caja.
Siguiendo con los conceptos básicos de CSS, vamos a estudiar lo que es llamado el Modelo de Caja
Tradicional. Este modelo has sido implementado desde la primera versión de CSS y es actualmente soportado
por cada navegador en el mercado, lo que lo ha convertido en un estándar para el diseño web.
Todo modelo, incluso aquellos aún en fase experimental, pueden ser aplicados a la misma estructura
HTML, pero esta estructura debe ser preparada para ser afectada por estos estilos de forma adecuada.
Nuestros documentos HTML deberán ser adaptad os al modelo de caja seleccionado.
5.1. Plantilla
En la unidad anterior construimos una plantilla HTML5. Esta plantilla tiene todos los elementos necesarios
para proveer estructura a nuestro documento, pero algunos detalles deben ser agregados para aplicar los estilos
CSS y el Modelo de Caja Tradicional.
Este modelo necesita agrupar cajas juntas para ordenarlas horizontalmente. Debido a que el contenido
completo del cuerpo es creado a partir de cajas, debemos agregar un elemento <div> para agruparlas,
centrarlas y darles un tamaño especı́fico.
La nueva plantilla lucirá de este modo:
11
Código 14: Nueva plantilla HTML5 lista para estilos CSS
El código 14 provee una nueva plantilla lista para recibir los estilos CSS. Dos cambios importantes pueden
distinguirse al comparar este código con el del Listado 18 de [Link]. El primero es que ahora varias
etiquetas fueron identificadas con los atributos id y class. Esto significa que podemos referenciar un elemento
especı́fico desde las reglas CSS con el valor de su atributo id o podemos modificar varios elementos al mismo
tiempo usando el valor de su atributo class.
El segundo cambio realizado a la vieja plantilla es la adición del elemento <div> mencionado anteriormen-
te. Este <div> fue identificado con el atributo y el valor id=”agrupar” , y es cerrado al final del cuerpo con
la etiqueta de cierre </div>. Este elemento se encarga de agrupar todos los demás elementos permitiéndonos
aplicar el modelo de caja al cuerpo y designar su posición horizontal, como veremos más adelante.
Manos a la obra
Compare el código del Listado 18 de HTML5 con el código 14 anterior y ubique las etiquetas de
apertura y cierre del elemento <div> utilizado para agrupar al resto. También compruebe cuáles
elementos se encuentran ahora identificados con el atributo id y cuáles con el atributo class.
Confirme que los valores de los atributos id son únicos para cada etiqueta. También necesitará reemplazar
el código en el archivo HTML creado anteriormente por el del Listado 2-25 para aplicar los siguientes estilos
CSS.
Con el documento HTML finalizado es tiempo de trabajar en nuestro archivo de estilos.
1 * {
2 margin : 0 px ;
3 padding : 0 px ;
4 }
Conceptos básicos
Recuerde que en HTML cada elemento es considerado como una caja. El margen (margin) es en
realidad el espacio alrededor del elemento, el que se encuentra por fuera del borde de esa caja (el
estilo padding, por otro lado, es el espacio alrededor del contenido del elemento pero dentro de sus
bordes, como el espacio entre el tı́tulo y el borde de la caja virtual formada por el elemento <h1>
que contiene ese tı́tulo). El tamaño del margen puede ser definido por lados especı́ficos del elemento
o todos sus lados a la vez. El estilo margin: 0px en nuestro ejemplo establece un margen 0 o nulo
para cada elemento de la caja. Si el tamaño hubiese sido especificado en 5 pixeles, por ejemplo, la
caja tendrı́a un espacio de 5 pixeles de ancho en todo su contorno. Esto significa que la caja estarı́a
separada de sus vecinas por 5 pixeles.
12
Manos a la obra
Debemos escribir todas las reglas necesarias para otorgar estilo a nuestra plantilla en un archivo CSS.
El archivo ya fue incluido dentro del código HTML por medio de la etiqueta <link>, por lo que lo
único que tenemos que hacer es crear u n archivo de texto vacı́o con nuestro editor de textos preferido,
grabarlo con el nombre [Link] y luego copiar en su interior la regla del código 15 y todas las
presentadas a continuación.
1 h1 {
2 font : bold 20 px verdana , sans - serif ;
3 }
4 h2 {
5 font : bold 14 px verdana , sans - serif ;
6 }
La propiedad font, asignada a los elementos <h1> y <h2> en el código 16, nos permite declarar todos
los estilos para el texto en una sola lı́nea. Las propiedades que pueden ser declaradas usando font son: font-
style, font-variant, font-weight, font-size/line-height, y font-family en este orden. Con estas reglas estamos
cambiando el grosor, tamaño y tipo de letra del texto dentro de los elementos <h1> y <h2> a los valores
que deseamos.
A partir de ahora, los elementos afectados por la regla del código 17 serán posicionados uno sobre otro a
menos que especifiquemos algo diferente más adelante.
1 body {
13
2 text - align : center ;
3 }
1 # agrupar {
2 width : 960 px ;
3 margin : 15 px auto ;
4 text - align : left ;
5 }
5.7. La cabecera
Continuemos con el resto de los elementos estructurales. Siguiendo la etiqueta de apertura del <div>
principal se encuentra el primer elemento estructural de HTML5: <header>. Este elemento contiene el tı́tulo
principal de nuestra página web y estará ubicado en la parte superior de la pantalla. En nuestra plantilla,
<header> fue identificado con el atributo id y el valor cabecera.
Como ya mencionamos, cada elemento block, ası́ como el cuerpo, por defecto tiene un valor de ancho del
100 %. Esto significa que el elemento ocupará todo el espacio horizontal disponible. En el caso del cuerpo, ese
espacio es el ancho total de la pantalla visible (la ventana del navegador), pero en el resto de los elementos
el espacio máximo disponible estará determinado por el ancho de su elemento padre. En nuestro ejemplo,
el espacio máximo disponible para los elementos dentro de la caja principal será de 960 pixeles, porque su
padre es la caja principal la cual fue previamente configurada con este tamaño.
1 # cabecera {
2 background : # FFFBB9 ;
3 border : 1 px solid #999999;
4 padding : 20 px ;
5 }
Debido a que <header> ocupará todo el espacio horizontal disponible en la caja principal y será tratado
como un elemento block (y por esto posicionada en la parte superior de la página), lo único que resta por
hacer es asignar estilos que nos permitirán reconocer el elemento cuando es presentado en pantalla. En la
regla mostrada en el código 20 le otorgamos a <header> un fondo amarillo, un borde sólido de 1 pixel y un
margen interior de 20 pixeles usando la propiedad padding.
1 # menu {
2 background : # CCCCCC ;
3 padding : 5 px 15 px ;
4 }
5
6 # menu li {
7 display : inline - block ;
8 list - style : none ;
9 padding : 5 px ;
10 font : bold 14 px verdana , sans - serif ;
15
11 }
En el código 21, la primera regla referencia al elemento <nav> por su atributo id, cambia su color de
fondo y agrega márgenes internos de 5px y 15px con la propiedad padding.
Conceptos básicos:
La propiedad padding trabaja exactamente como margin. Cuatro valores pueden ser especificados:
superior, derecho, inferior, izquierdo, en este orden. Si solo declaramos un valor, el mismo será asignado
para todos los espacios alrededor del contenido del elemento. Si en cambio especificamos dos valores,
entonces el primero será asignado como margen interno de la parte superior e inferior del contenido y
el segundo valor será asignado al margen interno de los lados, izquierdo y derecho.
Dentro de la barra de navegación hay una lista creada con las etiquetas <ul> y <li>. Por defecto, los
ı́tems de una lista son posicionados unos sobre otros. Para cambiar este comportamiento y colocar cada
opción del menú una al lado de la otra, referenciamos los elementos <li> dentro de este elemento <nav>
en particular usando el selector #menu li, y luego asignamos a todos ellos el estilo display: inline-block para
convertirlos en lo que se llama cajas inline. A diferencia de los elementos block, los elementos afectados por el
parámetro inline-block estandarizado en CSS3 no generan ningún salto de lı́ne a pero nos permiten tratarlos
como elementos block y ası́ declarar un valor de ancho determinado. Este parámetro también a justa el
tamaño del elemento de acuerdo con su contenido cuando el valor del ancho no fue especificado.
En esta última regla también eliminamos el pequeño gráfico generado por defecto por los navegadores
delante de cada opción del listado utilizando la propiedad list-style.
1 # seccion {
2 float : left ;
3 width : 660 px ;
4 margin : 20 px ;
5 }
6
7 # columna {
8 float : left ;
9 width : 220 px ;
10 margin : 20 px 0 px ;
11 padding : 20 px ;
12 background : # CCCCCC ;
13 }
La propiedad de CSS float es una de las propiedades más ampliamente utilizadas para aplicar el Modelo
de Caja Tradicional. Hace que el elemento flote hacia un lado o al otro en el espacio disponible. Los elementos
afectados por float actúan como elementos block (con la diferencia de que son ubicados de acuerdo al valor
de esta propiedad y no el flujo normal del documento). Los elementos son movidos a izquierda o derecha en
el área disponible, tanto como sea posible, respondiendo al valor de float.
Con las reglas del código 22 declaramos la posición de ambas cajas y sus respectivos tamaños, generando
ası́ las columnas visibles en la pantalla. La propiedad float mueve la caja al espacio disponible del lado
16
especificado por su valor, width asigna un tamaño horizontal y margin, por supuesto, declara el margen del
elemento.
Afectado por estos valores, el contenido del elemento <section> estará situado a la izquierda de la pantalla
con un tamaño de 660 pixeles, más 40 pixeles de margen, ocupando un espacio total de 700 pixeles de ancho.
La propiedad float del elemento <aside> también tiene el valor left (izquierda). Esto significa que la caja
generada será movida al espacio disponible a su izquierda. Debido a que la caja previa creada por el elemento
<section> fue también movida a la izquierda de la pantalla, ahora el espacio disponible será solo el que esta
caja dejó libre. La nueva caja quedará ubicada en la misma lı́nea que la primera pero a su derecha, ocupando
el espacio restante en la lı́nea, creando la segunda columna de nuestro diseño.
El tamaño declarado para esta segunda caja fue de 220 pixeles. También agregamos un fondo gris y con-
figuramos un margen interno de 20 pixeles. Como resultado final, el ancho de esta caja será de 220 pixeles
más 40 pixeles agregados por la propiedad padding (los márgenes de los lados fueron declarados a 0px).
Conceptos básicos
El tamaño de un elemento y sus márgenes son agregados para obtener el valor real ocupado en pantalla.
Si tenemos un elemento de 200 pixeles de ancho y un margen de 10 pixeles a cada lado, el área real
ocupada por el e lemento será de 220 pixeles. El total de 20 pixeles del margen es agregado a los 200
pixeles del elemento y el valor final es representado en la pantalla. Lo mismo pasa con las propiedades
padding y border. Cada vez que agregamos un borde a un elemento o creamos un espacio entre el
contenido y el borde usando padding esos valores serán agregados al ancho del elemento para obtener
el valor real cuando el elemento es mostrado en pantalla. Este valor real es calculado con la fórmula:
valor real = tamaño + márgenes + márgenes internos + bordes.
Manos a la obra
Lea el código 14. Controle cada regla CSS creada hasta el momento y busque en la plantilla los
elementos HTML correspondientes a cada una de ellas. Siga las referencias, por ejemplo las claves
de los elementos (como h1) y los atributos id (como cabecera), para entender cómo trabajan las
referencias y cómo los estilos son asignados a cada elemento.
5.10. Footer
Para finalizar la aplicación del Modelo de Caja Tradicional, otra propiedad CSS tiene que ser aplicada al
elemento <footer>. Esta propiedad devuelve al documento su flujo normal y nos permite posicionar <footer>
debajo del último elemento en lugar de a su lado:
1 # pie {
2 clear : both ;
3 text - align : center ;
4 padding : 20 px ;
5 border - top : 2 px solid #999999;
6 }
Código 23: Otorgando estilos a <footer> y recuperando el normal flujo del documento.
La regla del código 23 declara un borde de 2 pixeles en la parte superior de <footer>, un margen interno
(padding) de 20 pixeles, y centra el texto dentro del elemento. A sı́ mismo, restaura el normal flujo del
documento con la propiedad clear. Esta propiedad simplemente restaura las condiciones normales del área
ocupada por el elemento, no permitiéndole posicionarse adyacente a una caja flotante. El valor usualmente
utilizado es both, el cual significa que ambos lados del elemento serán restaurados y el elemento seguirá el
flujo normal (este elemento ya no es flotante como los anteriores). Esto, para un elemento block, quiere decir
que será posicionado debajo del último elemento, en una nueva lı́nea. La propiedad clear también empuja
los elementos verticalmente, haciendo que las cajas flotantes ocupen un área real en la pantalla. Sin esta
propiedad, el navegador presenta el documento en pantalla como si los elementos flotantes no existieran y las
cajas se superponen.
17
Figura 2: Representación visual del modelo de caja tradicional.
Cuando tenemos cajas posicionadas una al lado de la otra en el Modelo de Caja Tradicional siempre
necesitamos crear un elemento con el estilo clear: both para poder seguir agregando otras cajas debajo de
un modo natural. La Figura 2 muestra una representación visual de este modelo con los estilos básicos para
lograr la co rrecta disposición en pantalla.
Los valores left (izquierda) y right (derecha) de la propiedad float no significan que las cajas deben estar
necesariamente posicionadas del lado izquierdo o derecho de la ventana. Lo que los valores hacen es volver
flotante ese lado del elemento, rompiendo el flujo normal del documento. Si el valor es left, por ejemplo,
el navegador tratará de posicionar el elemento del lado izquierdo en el espacio disponible. Si hay espacio
disponible luego de otro elemento, este nuevo elemento será situado a su derecha, porque su lado izquierdo
fue configurado como flotante. El elemento flota hacia la izquierda hasta que encuentra algo que lo bloquea,
como otro elemento o el borde de su elemento padre. Esto es importante cuando queremos crear varias
columnas en la pantalla. En este caso cada columna tendrá el valor left en la propiedad float para asegurar
que cada columna estará continua a la otra en el orden correcto. De este modo, cada columna flotará hacia
la izquierda hasta que es bloqueada por otra columna o el borde del elemento padre.
1 article {
2 background : # FFFBCC ;
3 border : 1 px solid #999999;
4 padding : 20 px ;
5 margin - bottom : 15 px ;
6 }
7
8 article footer {
9 text - align : right ;
10 }
11
12 time {
18
13 color : #999999;
14 }
15
16 figcaption {
17 font : italic 14 px verdana , sans - serif ;
18 }
La primera regla del código 24 referencia todos los elementos <article> y les otorga algunos estilos básicos
(color de fondo , un borde sólido de 1 pixel, margen interno y margen inferior). El margen inferior de 15
pixeles tiene el propósito de separar un elemento <article> del siguiente verticalmente.
Cada elemento <article> cuenta también con un elemento <footer> que muestra el número de comentarios
recibidos. Par a referenciar un elemento <footer> dentro de un elemento <article>, usamos el selector article
footer que significa “cada <footer> dentro de un <article> será afectado por los siguientes estilos”. Esta
técnic a de referencia fue aplicada aquı́ para alinear a la derecha el texto dentro de los elementos <footer>
de cada <article>.
Al final del código 24 cambiamos el color de cada elemento <time> y diferenciamos la descripción de la
imagen (insertada con el elemento <figcaption>) del resto del texto usando una tipo de letra diferente.
Manos a la obra
Si aún no lo ha hecho, copie cada regla CSS listada en este capı́tulo desde el código 15, una debajo
de otra, dentro del archivo [Link], y luego abra el archivo HTML con la plantilla creada en
código 14 en su navegador. Esto le mostrará cómo funciona el Modelo de Caja Tradicional y cómo los
elementos estructurales son organizados en pantalla.
5.12. Box-sizing
Existe una propiedad adicional incorporada en CSS3 relacionada con la estructura y el Modelo de Caja
Tradicional. La propiedad box-sizing nos permite cambiar cómo el espacio total ocupado por un elemento en
pantalla será calculado forzando a l os navegadores a incluir en el ancho original los valores de las propiedades
padding y border.
Como explicamos anteriormente, cada vez que el área total ocupada por un elemento es calculada, el
navegador obtiene el valor final por medio de la siguiente fórmula: tamaño + márgenes + márgenes internos
+ bordes. Por este motivo, si declaramos la propiedad width igual a 100 pixeles, margin en 20 pixeles, padding
en 10 pixeles y border en 1 pixel, el área horizontal total ocupada por el elemento será: 100+40+20+2=
162 pixeles (note que tuvimos que duplicar los valores de margin, padding y border en la fórmula porque
consideramos que los mismos fueron asignados tanto para el lado derecho como el izquierdo).
Esto significa que cada vez que declare el ancho de un elemento con la propiedad width, deberá recordar
que el área real para ubicar el elemento en pantalla será seguramente más grande. Dependiendo de sus
costumbres, a veces podrı́a resultar útil forzar al navegador a incluir los valores de padding y border en el
tamaño del elemento. En este caso la nueva fórmula serı́a simplemente: tamaño + márgenes.
1 div {
2 width : 100 px ;
3 margin : 20 px ;
4 padding : 10 px ;
5 border : 1 px solid #000000;
6 -moz - box - sizing : border - box ;
7 - webkit - box - sizing : border - box ;
8 box - sizing : border - box ;
9 }
La propiedad box-sizing puede tomar dos valores. Por defecto es configurada como content-box, lo que
significa que los navegadores agregarán los valores de padding y border al tamaño especificado por width y
19
height. Usando el valor border-box en su lugar, este comportamiento es cambiado de modo que padding y
border son incluidos dentro del elemento.
El código 25 muestra la aplicación de esta propiedad en un elemento <div>. Este es solo un ejemplo y
no vamos a usarlo en nuestra plantilla, pero puede ser útil para algunos diseñadores dependiendo de qué tan
familiarizados se encuentran con los métodos tradicionales propuestos por versiones previas de CSS.
IMPORTANTE
La propiedad box-sizing, al igual que otras importantes propiedades CSS3 estudiadas más adelante,
pueden encontrarse en estado experimental en algunos navegadores. Para aplicarla efectivamente a
sus documentos, debe declararla con los correspondientes prefijos, como hicimos en el código 25.
Los prefijos para los navegadores más comunes son los siguientes:
6. Propiedades CSS3
6.1. Las nuevas reglas
La web cambió para siempre cuando unos años atrás nuevas aplicaciones desarrolladas sobre implemen-
taciones Ajax mejoraron el diseño y la experiencia de los usuarios. La versión 2.0, asignada a la web para
describir un nuevo nivel de desarrollo, representó un cambio no solo en la forma en que la información era
transmitida sino también en cómo los sitios web y nuevas aplicaciones eran diseñados y construidos.
Los códigos implementados en esta nueva generación de sitios web pronto se volvieron estándar. La innova
ción se volvió tan importante para el éxito de cualquier proyecto en Internet que programadores desarrollaron
librerı́as completas para superar las limitaciones y satisfacer los nuevos requerimientos de los diseñadores.
La falta de soporte por parte de los navegadores era evidente, pero la organización responsable de los
estándares web no tomó las tendencias muy seriamente e intentó seguir su propio camino. Afortunadamente,
algunas mentes brillantes siguieron desarrollando nuevos estándares en paralelo y pronto HTML5 nació. Luego
del retorno de la calma (y algunos acuerdos de por medio), la integración entre HTML, CSS y Javascript bajo
la tutela de HTML5 fue como el caballero bravo y victorioso que dirige las tropas hacia el palacio enemigo.
A pesar de la reciente agitación, esta batalla comenzó mucho tiempo atrás, con la primera especificación
de la tercera versión de CSS. Cuando finalmente, alrededor del año 2005, esta tecnologı́a fue oficialmente
considerada estándar, CSS est aba listo para proveer las funciones requeridas por desarrolladores (aquellas
que programadores habı́an creado desde años atrás usando códigos Javascript complicados de implementar y
no siempre compatibles).
Ahora vamos a estudiar las contribuciones hechas por CSS3 a HTML5 y todas las propiedades que
simplifican la vida de diseñadores y programadores.
6.2. Plantilla
Las nuevas propiedades CSS3 son extremadamente poderosas y deben ser estudiadas una por una, pero
para facilitar su aprendizaje vamos a aplicar todas ellas sobre la misma plantilla. Por este motivo comenza-
remos por crear un documento HTML sencillo con algunos estilos básicos:
20
1 <! DOCTYPE html >
2 < html lang = " es " >
3 < head >
4 < title > Nuevos Estilos CSS3 </ title >
5 < link rel = " stylesheet " href = " nuevocss3 . css " >
6 </ head >
7
Nuestro documento solo tiene una sección con un texto breve en su interior. El elemento <header> usado
en la plantilla podrı́a ser reemplazado por <div>, <nav>, <section> o cualquier otro elemento estructural
de acuerdo a la ubicación en el diseño y a su función. Luego de aplicar los estilos, la caja generada con el
código 26 lucirá como una cabecera, por consiguiente decidimos usar <header> en este caso.
Debido a que el elemento <font> se encuentra en desuso en HTML5, los elementos usados para mostrar
texto son normalmente <span> para lı́neas cortas y <p> para párrafos, entre otros. Por esta razón el texto
en nuestra plantilla fue insertado usando etiquetas <span>.
Manos a la obra
Use el código provisto en el código 26 como la plantilla para este capı́tulo. Necesitará además crear un
nuevo archivo CSS llamado [Link] para almacenar los estilos estudiados de aquı́ en adelante.
Los siguientes son los estilos básicos requeridos por nuestro documento HTML:
1 body {
2 text - align : center ;
3 }
4
5 # principal {
6 display : block ;
7 width : 500 px ;
8 margin : 50 px auto ;
9 padding : 15 px ;
10 text - align : center ;
11 border : 1 px solid #999999;
12 background : # DDDDDD ;
13 }
14
15 # titulo {
16 font : bold 36 px verdana , sans - serif ;
17 }
No hay nada nuevo en las reglas del código 27, solo los estilos necesarios para dar forma a la plantilla y
crear una caja ancha, posicionada en el centro de la ventana, con un fondo gris, un borde y un texto grande
en su interior que dice “Estilos CSS Web 2.0”.
Una de las cosas que notará sobre esta caja cuando sea mostrada en pantalla es que sus esquinas son
rectas. Puede ser un factor psicológico o no, lo cierto es que a casi nadie en este negocio le agradan las
esquinas rectas. Por lo tanto, lo primero que haremos será cambiar este aspecto.
21
6.3. Border-radius
Por muchos años diseñadores han sufrido intentando lograr el efecto de esquinas redondeadas en las cajas
de sus páginas web. El proceso era casi siempre frustrante y extenuante. Todos lo padecieron alguna vez.
Si mira cualquier presentación en video de las nuevas caracterı́sticas incorporadas en HTML5, cada vez que
alguien habla sobre las propiedades de CSS3 que hacen posible generar fácilmente esquinas redondeadas, la
audiencia enloquece. Esquinas redondeadas eran esa clase de cosas que nos hacı́an pensar: “deberı́a ser fácil
hacerlo”. Sin embargo nunca lo fue.
Esta es la razón por la que, entre todas las nuevas posibilidades e increı́bles propiedades incorporadas en
CSS3, la que exploraremos en primera instancia es border-radius:
1 body {
2 text - align : center ;
3 }
4 # principal {
5 display : block ;
6 width : 500 px ;
7 margin : 50 px auto ;
8 padding : 15 px ;
9 text - align : center ;
10 border : 1 px solid #999999;
11
Manos a la obra
Copie dentro del archivo CSS llamado [Link] los estilos que quiera probar y abra el archivo
HTML generado con el código 26 en su navegador para comprobar los resultados.
6.4. Box-shadow
Ahora que finalmente contamos con la posibilidad de generar bonitas esquinas para nuestras cajas podemos
arriesgarnos con algo más. Otro muy buen efecto, que habı́a sido extremadamente complicado de lograr hasta
este momento, es sombras. Por años diseñadores han combinado imágenes, elementos y algunas propiedades
CSS para generar sombras.
Gracias a CSS3 y a la nueva propiedad box-shadow podremos aplicar sombras a nuestras cajas con solo
una simple lı́nea de código:
1 body {
2 text - align : center ;
3 }
4
5 # principal {
6 display : block ;
7 width : 500 px ;
8 margin : 50 px auto ;
9 padding : 15 px ;
10 text - align : center ;
11 border : 1 px solid #999999;
12 background : # DDDDDD ;
22
13 -moz - border - radius : 20 px ;
14 - webkit - border - radius : 20 px ;
15 border - radius : 20 px ;
16 -moz - box - shadow : rgb (150 ,150 ,150) 5 px 5 px ;
17 - webkit - box - shadow : rgb (150 ,150 ,150) 5 px 5 px ;
18 box - shadow : rgb (150 ,150 ,150) 5 px 5 px ;
19 }
20
21 # titulo {
22 font : bold 36 px verdana , sans - serif ;
23 }
La propiedad box-shadow necesita al menos tres valores. El primero, que puede ver en la regla del código
29, es el color. Este valor fue construido aquı́ utilizando la función rgb() y números decimales, pero podemos
escribirlo en números hexadecimales también, como hicimos previamente para otros parámetros.
Los siguientes dos valores, expresados en pixeles, establecen el desplazamiento de la sombra. Este des-
plazamiento puede ser positivo o negativo. Los valores indican, respectivamente, la distancia horizontal y
vertical desde la sombra al elemento. Valores negativos posicionarán la sombra a la izquierda y arriba del el
emento, mientras que valores positivos crearán la sombra a la derecha y debajo del elemento. Valores de 0 o
nulos posicionarán la sombra exactamente detrás del elemento, permitiendo la posibilidad de crear un efecto
difuminado a todo su alrededor.
Manos a la obra
Para probar los diferentes parámetros y posibilidades con los que contamos para asignar una sombra
a una caja, copie el código 29 dentro del archivo CSS y abra el archivo HTML con la plantilla 26 en
su navegador. Puede experimentar cambiando los valores de la propiedad box-shadow y puede usar el
mismo código para experimentar también con los nuevos parámetros estudiados a continuación.
La sombra que obtuvimos hasta el momento es sólida, sin gradientes o transparencias (no realmente
como una sombrasuele aparecer). Existen algunos parámetros más y cambios que podemos implementar para
mejorar la apariencia de la sombra.
Un cuarto valor que se puede agregar a la propiedad ya estudiada es la distancia de difuminación. Con
este efecto ahora la sombra lucirá real. Puede intentar utilizar este nuevo parámetro decla rando un valor de
10 pixeles a la regla del código 29, como en el siguiente ejemplo:
Agregando otro valor más en pixeles al final de la propiedad desparramará la sombra. Este efecto cambia
un poco la naturaleza de la sombra expandiendo el área que cubre. A pesar de que no recomendamos utilizar
este efecto, puede ser aplicable en algunos diseños.
Manos a la obra
Intente agregar un valor de 20 pixeles al final del estilo del código 30 y combine éste con el código 29
para probarlo.
El último valor posible para box-shadow no es un número sino más bien una palabra clave: inset. Esta
palabra clave convierte a la sombra externa en una sombra interna, lo cual provee un efecto de profundidad
al elemento afectado.
El estilo en el ćodigo 31 mostrará una sombra interna alejada del borde de la caja por unos 5 pixeles y
con un efecto de difuminación de 10 pixeles.
Manos a la obra
Los estilos de los ćodigos 30 y 31 son solo ejemplos. Para comprobar los efectos en su navegador debe
aplicar estos cambios al grupo completo de reglas presentado en el Listado 29.
IMPORTANTE
Las sombras no expanden el elemento o incrementan su tamaño, por lo que tendrá que controlar
cuidadosamente que el espacio disponible es suficiente para que la sombra sea expuesta y correctamente
dibujada en la pantalla.
6.5. Text-shadow
Ahora que conoce todo acerca de sombras probablemente estará pensando en generar una para cada
elemento de su documento. La propiedad box-shadow fue diseñada especialmente para ser aplicada en cajas.
Si intenta aplicar este efecto a un elemento <span>, por ejemplo, la caja invisible ocupada por este elemento
en la pantalla tendrá una sombra, pero no el conteni do del elemento. Para crear sombras para figuras
irregulares como textos, existe una propiedad especial llamada text-shadow :
1 body {
2 text - align : center ;
3 }
4
5 # principal {
6 display : block ;
7 width : 500 px ;
8 margin : 50 px auto ;
9 padding : 15 px ;
10 text - align : center ;
11 border : 1 px solid #999999;
12 background : # DDDDDD ;
13 -moz - border - radius : 20 px ;
14 - webkit - border - radius : 20 px ;
15 border - radius : 20 px ;
16 -moz - box - shadow : rgb (150 ,150 ,150) 5 px 5 px 10 px ;
17 - webkit - box - shadow : rgb (150 ,150 ,150) 5 px 5 px 10 px ;
18 box - shadow : rgb (150 ,150 ,150) 5 px 5 px 10 px ;
19 }
20
21 # titulo {
22 font : bold 36 px verdana , sans - serif ;
23 text - shadow : rgb (0 ,0 ,150) 3 px 3 px 5 px ;
24 }
Los valores para text-shadow son similares a los usados para box-shadow. Podemos declarar el color de la
sombra, la distancia horizontal y vertical de la sombra con respecto al objeto y el radio de difuminación.
En el código 32 una sombra azul fue aplicada al tı́tulo de nuestra plantilla con una distancia de 3 pixeles
y un radio de difuminación de 5.
24
6.6. @font-face
Obtener un texto con sombra es realmente un muy buen truco de diseño, imposible de lograr con métodos
previos, pero más que cambiar el texto en sı́ mismo solo provee un efecto tridimensional. Una sombra, en este
caso, es como pintar un viejo coche, al final será el mismo coche. En este caso, será el mismo tipo de letra.
El problema con las fuentes o tipos de letra es tan viejo como la web. Usuarios regulares de la web a
menudo tienen un número limitado de fuentes instaladas en sus ordenadores, usualmente estas fuentes son
diferentes de un usuario a otro, y la mayorı́a de las veces muchos usuarios tendrán fuentes que otros no.
Por años, los sitios webs solo pudieron utilizar un limitado grupo de fuentes confiables (un grupo básico que
prácticamente todos los usuarios tienen i nstalados) y ası́ presentar la información en pantalla.
La propiedad @font-face permite a los diseñadores proveer un archivo conteniendo una fuente especı́fica
para mostrar sus textos en la página. Ahora podemos incluir cualquier fuente que nec esitemos con solo
proveer el archivo adecuado:
1 body {
2 text - align : center ;
3 }
4
5 # principal {
6 display : block ;
7 width : 500 px ;
8 margin : 50 px auto ;
9 padding : 15 px ;
10 text - align : center ;
11 border : 1 px solid #999999;
12 background : # DDDDDD ;
13 -moz - border - radius : 20 px ;
14 - webkit - border - radius : 20 px ;
15 border - radius : 20 px ;
16 -moz - box - shadow : rgb (150 ,150 ,150) 5 px 5 px 10 px ;
17 - webkit - box - shadow : rgb (150 ,150 ,150) 5 px 5 px 10 px ;
18 box - shadow : rgb (150 ,150 ,150) 5 px 5 px 10 px ;
19 }
20
21 # titulo {
22 font : bold 36 px MiNuevaFuente , verdana , sans - serif ;
23 text - shadow : rgb (0 ,0 ,150) 3 px 3 px 5 px ;
24 }
25
Manos a la obra
Descargue un archivo .ttf (al que en el código llamamos [Link]) desde la web o use uno que ya posea
y cópielo en el mismo directorio (carpeta) de su archivo CSS.
25
IMPORTANTE
El archivo conteniendo la fuente debe encontrarse en el mismo dominio que la página web (o en el
mismo ordenador, en este caso). Esta es una restricción de algunos navegadores como Firefox, por
ejemplo.
La propiedad @font-face necesita al menos dos estilos para declarar la fuente y cargar el archivo. El estilo
construido con la propiedad font-family especifica el nombre que queremos otorgar a esta fuente en particular,
y la propiedad src indica la URL del archivo con el código correspondiente a esa fuente. En el código 33, el
nombre MiNuevaFuente fue asignado a nuestro nuevo tipo de letra y el archivo [Link] fue indicado como el
archivo correspondiente a esta fuente.
Una vez que la fuente es cargada, podemos comenzar a usarla en cualquier elemento del documento
simplemente escribiendo su nombre (MiNuevaFuente). En el estilo font en la regla del código 33, especificamos
que el tı́tulo será mostrado con la nueva fuente o las alternativas verdana y sans-serif en caso de que la fuente
incorporada no sea cargada apropiadamente.
1 body {
2 text - align : center ;
3 }
4
5 # principal {
6 display : block ;
7 width : 500 px ;
8 margin : 50 px auto ;
9 padding : 15 px ;
10 text - align : center ;
11 border : 1 px solid #999999;
12 background : # DDDDDD ;
13 -moz - border - radius : 20 px ;
14 - webkit - border - radius : 20 px ;
15 border - radius : 20 px ;
16 -moz - box - shadow : rgb (150 ,150 ,150) 5 px 5 px 10 px ;
17 - webkit - box - shadow : rgb (150 ,150 ,150) 5 px 5 px 10 px ;
18 box - shadow : rgb (150 ,150 ,150) 5 px 5 px 10 px ;
19 background : - webkit - linear - gradient ( top , # FFFFFF , #006699) ;
20 background : -moz - linear - gradient ( top , # FFFFFF , #006699) ;
21 }
22
23 # titulo {
24 font : bold 36 px MiNuevaFuente , verdana , sans - serif ;
25 text - shadow : rgb (0 ,0 ,150) 3 px 3 px 5 px ;
26 }
27
28 @font - face {
29 font - family : ’ MiNuevaFuente ’;
30 src : url ( ’ font . ttf ’) ;
31 }
Los gradientes son configurados como fondos, por lo que podemos usar las propiedades background o
backgroundimage para declararlos. La sintaxis para los valores declarados en estas propiedades es linear-
26
gradient(posición inicio, color inicial, color final). Los atributos de la función linear-gradient() indican el
punto de comienzo y los colores usados para crear el gradiente. El primer valor puede ser especificado en
pixeles, porcentaje o usando las palabras clave top, bottom, left y right (como hicimos en nuestro ejemplo). El
punto de comienzo puede ser reemplazado por un ángulo para declarar una dirección especı́fica del gradiente:
Manos a la obra
Reemplace la linea correspondiente del código 34 por la linea del código 37 para probar el efecto en
su navegador (no olvide agregar los prefijos –moz- o -webkit- dependiendo del navegador que esté
usando).
IMPORTANTE
Pruebe sus códigos en cada navegador disponible en el mercado para comprobar el estado actual de
las diferentes implementaciones.
6.9. RGBA
Hasta este momento los colores fueron declarados como sólidos utilizando valores hexadecimales o la
función rgb() para decimales. CSS3 ha agregado una nueva función llamada rgba() que simplifica la asignación
de colores y transparencias. Esta función además resuelve un problema previo provocado por la propiedad
opacity.
La función rgba() tiene cuatro atributos. Los primeros tres son similares a los usados en rgb() y simplemente
declaran los valores para los colores rojo, verde y azul en números decimales del 0 al 255. El último, en cambio,
corresponde a la nueva capacidad de opacidad. Este valor se debe encontrar dentro de un rango que va de 0
a 1, con 0 como totalmente transparente y 1 como totalmente opaco.
1 # titulo {
2 font : bold 36 px MiNuevaFuente , verdana , sans - serif ;
3 text - shadow : rgba (0 ,0 ,0 ,0.5) 3 px 3 px 5 px ;
4 }
Manos a la obra
Reemplace la linea correspondiente del código 34 por la linea del código 38 para probar el efecto en
su navegador.
6.10. HSLA
Del mismo modo que la función rgba() agrega un valor de opacidad a rgb( ), la función hsla() hace lo
mismo para la función hsl().
La función hsla() es simplemente un función diferente para generar colores, pero es más intuitiva que
rgba(). Algunos diseñadores encontrarán más fácil generar un set de colores persona lizado utilizando hsla().
La sintaxis de esta función es: hsla(tono, saturación, luminosidad, opacidad).
1 # titulo {
2 font : bold 36 px MiNuevaFuente , verdana , sans - serif ;
3 text - shadow : rgba (0 ,0 ,0 ,0.5) 3 px 3 px 5 px ;
4 color : hsla (120 , 100 % , 50 %, 0.5) ;
5 }
Siguiendo la sintaxis, tono representa el color extraı́do de una rueda imaginaria y es expresado en grados
desde 0 a 360. Cerca de 0 y 360 están los colores rojos, cerca de 120 los verdes y cerca de 240 los azules. El
valor saturación es representado en porcentaje, desde 0 % (escala de grises) a 100 % (todo color o comple-
tamente saturado). La luminosidad es también un valor en porcentaje desde 0 % (completamente oscuro) a
100 % (completamente iluminado). El valor 50 % representa luminosidad normal o promedio. El último valor,
ası́ como en rgba(), representa la opacidad.
Manos a la obra
Reemplace la linea correspondiente del código 34 por la linea del código 39 para probar el efecto en
su navegador.
6.11. Outline
La propiedad outline es una vieja propiedad CSS que ha sido expandida en CSS3 para incluir un valor
de desplazamiento. Esta propiedad era usada para crear un segundo borde, y ahora ese borde puede ser
mostrado alejado del borde real del elemento.
1 # principal {
2 display : block ;
3 width : 500 px ;
4 margin : 50 px auto ;
5 padding : 15 px ;
6 text - align : center ;
7 border : 1 px solid #999999;
28
8 background : # DDDDDD ;
9 outline : 2 px dashed #000099;
10 outline - offset : 15 px ;
11 }
En el código 40 agregamos a los estilos originalmente aplicados a la caja de nuestra plantilla un segundo
borde de 2 pixeles con un desplazamiento de 15 pixeles. La propiedad outline tiene similares caracterı́sticas
y usa los mismos pará metros que border. La propiedad outline-offset solo necesita un valor en pixeles.
Manos a la obra
Reemplace la linea correspondiente del código 34 por la linea del código 40 para probar el efecto en
su navegador.
6.12. Border-image
Los posibles efectos logrados por las propiedades border y outline están limitados a lı́neas simples y solo
algunas opciones de configuración. La nueva propiedad border-image fue incorporada para superar estas limi-
taciones y dejar en manos del diseñador la calidad y variedad de bordes disponibles ofreciendo la alternativa
de utilizar imágenes propias.
La propiedad border-image toma una imagen y la utiliza como patrón. De acuerdo a los valores otorgados,
la imagen es cortada como un pastel, las partes obtenidas son luego ubicadas alrededor del objeto para
construir el borde.
Figura 3: Este es el patrón desde el cual vamos a construir nuestro borde. Cada pieza es de 29 pixeles de
ancho, como indica la figura.
Para hacer el trabajo, necesitamos especificar tres atributos: el nombre del archivo de la imagen, el tamaño
de las piezas que queremos obtener del patrón y algunas palabras clave para declarar cómo las piezas serán
distribuidas alrededor del objeto.
1 # principal {
2 display : block ;
3 width : 500 px ;
4 margin : 50 px auto ;
5 padding : 15 px ;
6 text - align : center ;
7 border : 29 px ;
8 -moz - border - image : url ( " diamonds . png " ) 29 stretch ;
29
9 - webkit - border - image : url ( " diamonds . png " ) 29 stretch ;
10 border - image : url ( " diamonds . png " ) 29 stretch ;
11 }
Con las modificaciones realizadas en el código 41 estamos definiendo un borde de 29 pixeles para la caja
de nuestra cabecera y luego cargando la imagen [Link] para construir ese borde. El valor 29 en la
propiedad border-image declara el tamaño de las piezas y stretch es uno de los métodos disponibles para
distribuir estas piezas alrededor de la caja.
Existen tres valores posibles para el último atributo. La palabra clave repeat repetirá las piezas tomadas
de la imagen todas las veces que sea necesario para cubrir el lado del elemento. En este caso, el tamaño de
las piezas es preservado y la imagen será cortada si no existe más espacio para ubicarla. La palabra clave
round considerará qué tan largo es el lado a ser cubierto y ajustará el tamaño de las piezas para asegurarse
que cubren todo el lado y ninguna pieza es cortada.
Finalmente, la palabra clave stretch (usada en el código 41) estira solo una pieza para cubrir el lado
completo. En nuestro ejemplo utilizamos la propiedad border para definir el tamaño del borde, pero se puede
también usar border-with para especificar diferentes tamaños para cada lado del elemento (la propiedad
border-with usa cuatro parámetros, con una sintaxis similar a margin y padding). Lo mismo ocurre con
el tamaño de cada pieza, hasta cuatro valores pueden ser declarados para obtener diferentes imágenes de
diferentes tamaños desde el patrón.
1 # principal {
2 display : block ;
3 width : 500 px ;
4 margin : 50 px auto ;
5 padding : 15 px ;
6 text - align : center ;
7 border : 1 px solid #999999;
8 background : # DDDDDD ;
9 -moz - transform : scale (2) ;
10 - webkit - transform : scale (2) ;
11 }
En el ejemplo del código 42 partimos de los estilos básicos utilizados para la cabecera generada en el código
27 y aplicamos transformación duplicando la escala del elemento. La función scale recibe dos parámetros: el
valor X para la escala horizontal y el valor Y para la escala vertical. Si solo un valor es provisto el mismo
valor es aplicado a ambos parámetros.
Números enteros y decimales pueden ser declarados para la escala. Esta escala es calculada por medio de
una matriz. Los valores entre 0 y 1 reducirán el elemento, un valor de 1 mantendrá las proporciones originales
y valores mayores que 1 aumentarán las dimensiones del elemento de manera incremental.
Un efecto atractivo puede ser logrado con esta función otorgando valores negativos:
30
1 # principal {
2 display : block ;
3 width : 500 px ;
4 margin : 50 px auto ;
5 padding : 15 px ;
6 text - align : center ;
7 border : 1 px solid #999999;
8 background : # DDDDDD ;
9 -moz - transform : scale (1 , -1) ;
10 - webkit - transform : scale (1 , -1) ;
11 }
En el código 43, dos parámetros han sido declarados para cambiar la escala de la caja principal. El primer
valor, 1, mantiene la proporción original para la dimensión horizontal de la caja. El segundo valor también
mantiene la proporción original, pero invierte el elemento verticalmente para producir el efecto espejo.
Existen también otras dos funciones similares a scale pero restringidas a la dimensión horizontal o vertical:
scaleX y scaleY. Estas funciones, por supuesto, utilizan un solo parámetro.
Manos a la obra
Reemplace la linea correspondiente del código 34 por la linea del código 42 o 43 para probar el efecto
en su navegador.
1 # principal {
2 display : block ;
3 width : 500 px ;
4 margin : 50 px auto ;
5 padding : 15 px ;
6 text - align : center ;
7 border : 1 px solid #999999;
8 background : # DDDDDD ;
9 -moz - transform : rotate (30 deg ) ;
10 - webkit - transform : rotate (30 deg ) ;
11 }
Manos a la obra
Reemplace la linea correspondiente del código 34 por la linea del código 44 para probar el efecto en
su navegador.
1 # principal {
31
2 display : block ;
3 width : 500 px ;
4 margin : 50 px auto ;
5 padding : 15 px ;
6 text - align : center ;
7 border : 1 px solid #999999;
8 background : # DDDDDD ;
9 -moz - transform : skew (20 deg ) ;
10 - webkit - transform : skew (20 deg ) ;
11 }
La función skew usa dos parámetros, pero a diferencia de otras funciones, cada parámetro de esta función
solo afecta una dimensión (los parámetros actúan de forma independiente). En el código 45, realizamos una
operación transform a la caja de la cabecera para inclinarla. Solo declaramos el primer parámetro, por lo que
solo la dimensión horizontal de la caja será modificada. Si usáramos los dos parámetros, podrı́amos alterar
ambas dimensiones del objeto. Como alternativa podemos utilizar funciones diferentes para cada una de ellas:
skewX y skewY.
Manos a la obra
Reemplace la linea correspondiente del código 34 por la linea del código 45 para probar el efecto en
su navegador.
1 # principal {
2 display : block ;
3 width : 500 px ;
4 margin : 50 px auto ;
5 padding : 15 px ;
6 text - align : center ;
7 border : 1 px solid #999999;
8 background : # DDDDDD ;
9 -moz - transform : translate (100 px ) ;
10 - webkit - transform : translate (100 px ) ;
11 }
La función translate considera la pantalla como una grilla de pixeles, con la posición original del elemento
usada como un punto de referencia. La esquina superior izquierda del elemento es la posición 0,0, por lo
que valores negativos moverán al objeto hac ia la izquierda o hacia arriba de la posición original, y valores
positivos lo harán hacia la derecha o hacia abajo.
En el código 46, movimos la caja de la cabecera hacia la derecha unos 100 pixeles desde su posición
original. Dos valores pueden ser declarados en esta función si queremos mover el elemento horizontal y ver-
ticalmente, o podemos usar funciones independientes llamadas translateX y translateY.
Manos a la obra
Reemplace la linea correspondiente del código 34 por la linea del código 46 para probar el efecto en
su navegador.
32
6.14. Transformando todo al mismo tiempo
A veces podrı́a resultar útil realizar sobre un elemento varias transformaciones al mismo tiempo. Para
obtener una propiedad transform combinada, solo tenemos que separar cada función a aplicar con un espacio:
1 # principal {
2 display : block ;
3 width : 500 px ;
4 margin : 50 px auto ;
5 padding : 15 px ;
6 text - align : center ;
7 border : 1 px solid #999999;
8 background : # DDDDDD ;
9 -moz - transform : translateY (100 px ) rotate (45 deg ) scaleX (0.3) ;
10 - webkit - transform : translateY (100 px ) rotate (45 deg ) scaleX (0.3) ;
11 }
Código 47: Moviendo, escalando y rotando el elemento con solo una lı́nea de código.
Una de las cosas que debe recordar en este caso es que el orden es importante. Esto es debido a que
algunas funciones mueven el punto original y el centro del objeto, cambiando de este modo los parámetros
que el resto de las funciones utiliz arán para operar.
Manos a la obra
Reemplace la linea correspondiente del código 34 por la linea del código 47 para probar el efecto en
su navegador.
1 # principal {
2 display : block ;
3 width : 500 px ;
4 margin : 50 px auto ;
5 padding : 15 px ;
6 text - align : center ;
7 border : 1 px solid #999999;
8 background : # DDDDDD ;
9 }
10
11 # principal : hover {
12 -moz - transform : rotate (5 deg ) ;
13 - webkit - transform : rotate (5 deg ) ;
14 }
En el código 48, la regla original del código 27 para la caja de la cabecera fue conservada intacta, pero
una nueva regla fue agregada para aplicar efectos de transformación usando la vieja pseudo clase :hover. El
resultado obtenido es que cada vez que el puntero del ratón pasa sobre esta caja, la propiedad transform rota
la caja en 5 grados, y cuando el puntero se aleja la caja vuelve a rotar de regreso a su posición original. Este
efecto produce una animaciónbásica pero útil con nada más que propiedades CSS.
33
Manos a la obra
Reemplace la linea correspondiente del código 34 por la linea del código 48 para probar el efecto en
su navegador.
6.16. Transiciones
De ahora en más, hermosos efectos usando transformacio nes dinámicas son accesibles y fáciles de imple-
ment ar. Sin embargo, una animación real requiere de un proceso de más de dos pasos.
La propiedad transition fue incluida para suavizar los cambios, creando mágic amente el resto de los pasos
que se encuentran implı́citos en el movimiento. Solo agregando esta propiedad forzamos al navegador a tomar
cartas en el asunto, crear para nosotros todos esos pasos invisibles, y generar una transición suave desde un
estado al otro.
1 # principal {
2 display : block ;
3 width : 500 px ;
4 margin : 50 px auto ;
5 padding : 15 px ;
6 text - align : center ;
7 border : 1 px solid #999999;
8 background : # DDDDDD ;
9 -moz - transition : -moz - transform 1 s ease - in - out 0.5 s ;
10 - webkit - transition : - webkit - transform 1 s ease - in - out 0.5 s ;
11 }
12
13 # principal : hover {
14 -moz - transform : rotate (5 deg ) ;
15 - webkit - transform : rotate (5 deg ) ;
16 }
Como puede ver en el código 49, la propiedad transition puede tomar hasta cuatro parámetros separados
por un espacio. El primer valor es la propiedad que será considerada para hacer la transición (en nuestro
ejemplo elegimos transform). Esto es necesario debido a que varias propiedades pueden cambiar al mismo
tiempo y probablemente necesitemos crear los pasos del proceso de transición solo para una de ellas. El
segundo parámetro especifica el tiempo que la transición se tomará para ir de la posición inicial a la final.
El tercer parámetro puede ser cualquiera de las siguientes palabras clave: ease, linear, ease-in, ease-out o
ease-in-out. Estas palabras clave determinan cómo se realizará el proceso de transición basado en una curva
Bézier. Cada una de ellas representa diferentes tipos de curva Bézier, y la mejor forma de saber cómo trabajan
es viéndolas funcionar en pantalla. El último parámetro para la propiedad transition es el retardo. Éste indica
cuánto tiempo tardará la transición en comenzar.
Para producir una transición para todas las propiedades que están cambiando en un objeto, la palabra
clave all debe ser especificada.
También podemos declarar varias propiedades a la vez listándolas separadas por coma.
Manos a la obra
Reemplace la linea correspondiente del código 34 por la linea del código 49 para probar el efecto en
su navegador.
34
IMPORTANTE
En el código 49 realizamos una transición con la propiedad transform. No todas las propiedades CSS
son soportadas por la propiedad transition en este momento y probablemente la lista cambie con
el tiempo. Deberá probar cada una de ellas por usted mismo o visitar el sitio web oficial de cada
navegador para encontrar más información al respecto.
35