HTML y CSS
HTML y CSS
HTML & CSS
(Versión 1.5)
José María Morales Vázquez
[email protected]
CONTENIDO
1. INTRODUCCIÓN...............................................................................................................6
Historia de los lenguajes de marcas.............................................................................6
Algunos lenguajes de marcas.......................................................................................7
Componentes de un lenguaje de marcas..................................................................8
Diferencias entre HTML y XHTML....................................................................................9
Editores de texto enriquecido.....................................................................................10
Navegadores.................................................................................................................11
HTML4 vs HTML5..............................................................................................................11
2. HTML BÁSICO..................................................................................................................14
2.1. ESQUELETO BÁSICO....................................................................................................14
El DOCTYPE.....................................................................................................................14
Los elementos Básicos..................................................................................................14
2.2. ELEMENTOS DE BLOQUE Y ELEMENTOS DE LÍNEA.....................................................15
2.3. LAS ETIQUETAS MÁS COMUNES.................................................................................16
Listas................................................................................................................................17
Las imágenes.................................................................................................................18
Los hiperenlaces............................................................................................................18
Comentarios...................................................................................................................20
Dirección del texto........................................................................................................20
Acrónimos y abreviaturas.............................................................................................21
Caracteres especiales..................................................................................................21
2.4. TABLAS..........................................................................................................................21
2.5. ALGUNAS ETIQUETAS Y ATRIBUTOS DESACONSEJADOS MÁS................................24
3. CSS. SELECTORES BÁSICOS............................................................................................25
3.1. INTEGRACIÓN DE HTML CON CSS.............................................................................25
Comentarios en hojas de estilo CSS...........................................................................26
3.2. SELECTORES BÁSICOS.................................................................................................26
Selectores de tipo o de etiqueta................................................................................26
Selector universal...........................................................................................................27
Colores y propiedades básicas del texto..................................................................27
Selectores descendientes............................................................................................30
Selectores de clase.......................................................................................................31
Selectores de ID.............................................................................................................32
3.3. COMBINANDO SELECTORES......................................................................................32
4. UNIDADES DE MEDIDA Y OTRAS PROPIEDADES..........................................................34
Unidades de medida....................................................................................................34
Unidades de medida específicas de las tipografías................................................34
Unidades absolutas.......................................................................................................34
Unidades relativas.........................................................................................................35
Porcentajes....................................................................................................................36
4.1. MÁS PROPIEDADES PARA EL TEXTO..........................................................................36
4.2. APLICAR ESTILOS A LAS LISTAS...................................................................................38
4.3. DOS NUEVAS ETIQUETAS HTML: div y span...............................................................39
4.4. HERENCIA.....................................................................................................................40
4.5. ESPECIFICIDAD............................................................................................................41
La clausula !important..................................................................................................43
5. EL MODELO DE CAJAS..................................................................................................44
5.1. EL CONCEPTO DE CAJA............................................................................................44
div es la caja más versatil.............................................................................................45
5.2. PROPIEDADES DE LA CAJA........................................................................................45
Las dimensiones del contenido...................................................................................45
Márgenes interior y exterior..........................................................................................45
El borde de la caja........................................................................................................46
Imágenes de fondo en las cajas y sus propiedades................................................48
Cajas y jerarquía de elementos..................................................................................49
5.3. POSICIONANDO LAS CAJAS (Y OTROS ELEMENTOS)..............................................49
Las propiedades float y clear......................................................................................50
Introduciendo la tercera dimensión en el documento...........................................52
Visibilidad, desbordamientos y recortes....................................................................53
5.4. OTRAS PROPIEDADES..................................................................................................54
Cambiar el aspecto del puntero del ratón...............................................................54
Alterando si un elemento es de bloque o de línea..................................................55
Modificando el aspecto de los bordes de las celdas de una tabla......................55
6. SELECTORES AVANZADOS.............................................................................................56
Selector de hijos.............................................................................................................56
Selector de hermanos adyacentes (o adyacente, sin más)..................................56
Selector de atributos.....................................................................................................57
6.1. PSEUDOCLASES Y PSEUDOELEMENTOS...................................................................58
Pseudoclases................................................................................................................58
Pseudoelementos.........................................................................................................59
7. ALGUNOS DISEÑOS Y EFECTOS ÚTILES.........................................................................61
7.1. DISEÑOS DE ANCHO FIJO, LÍQUIDOS (O FLUIDOS) Y ELÁSTICOS...........................61
Ejemplo 1 – Cajas..........................................................................................................61
Ejemplo 2 – Tres columnas............................................................................................65
Ejemplo 3 – Diseño de alto y ancho fijo.....................................................................66
Ejemplos 4 y 5 – Diseños de ancho líquido................................................................67
Ejemplo 6 – Diseño fijo, fluido, fijo................................................................................67
Ejemplo 7 – Separadores entre columnas transparentes........................................68
Ejemplo 8 – Sombras y diagonales..............................................................................68
7.2. DISEÑO DE TABLAS......................................................................................................69
7.3 OTROS TRUCOS.............................................................................................................70
Ejemplos 10 y 11 – Transpariencias..............................................................................70
Ejemplo 12 – Box Punch................................................................................................72
Ejemplos 13 y 14 – Tooltips............................................................................................73
Ejemplos 15 y 16 – Menús.............................................................................................75
Ejemplo 17 – Esquinas redondeadas..........................................................................77
Ejemplo 18 – Sprites.......................................................................................................77
Ejemplo 19 – Solapas.....................................................................................................78
Ejemplos 20 y 21 – Contorneos....................................................................................79
8. FORMULARIOS Y JAVASCRIPT.......................................................................................81
8.1. FUNCIONES Y EMPLAZAMIENTO DEL CÓDIGO JAVASCRIPT..................................81
8.1.1 Funciones...............................................................................................................81
8.2. FORMULARIOS.............................................................................................................83
8.2.1. Caja de edición de texto (type=”text”)...........................................................84
8.2.2 Caja de edición de contraseñas (type=”password”).....................................85
8.2.3. Etiquetas (label)...................................................................................................85
8.2.4 Radio Buttons (type=”radio”).............................................................................85
8.2.5 Checkboxes (type=”checkbox”).......................................................................86
8.2.6. Agrupación de objetos......................................................................................86
8.2.7 Caja de edición de texto de múltiples líneas..................................................87
8.2.8 Caja de selección de ficheros...........................................................................87
8.2.9 Cajas de selección (Comboboxes y Listboxes)...............................................87
8.2.10 Botones................................................................................................................88
8.2.11. Nuevos elementos en HTML5...........................................................................89
8.3. CSS EN LOS ELEMENTOS DE LOS FORMULARIOS......................................................89
8.4. VALIDACIÓN DE FORMULARIOS MEDIANTE JAVASCRIPT.......................................91
8.4.1. Métodos, eventos y propiedades.....................................................................91
8.4.2. Eventos del elemento form................................................................................91
8.4.3. Eventos de los botones.......................................................................................91
8.4.4. DOM, Modelo de objetos del documento......................................................92
8.4.5. Validación del formulario...................................................................................93
8.4.6. Lista de eventos de Javascript disponibles en los formularios......................95
8.5. JAVASCRIPT FUERA DE LOS FORMULARIOS..............................................................97
8.5.1. Alert y otras ventanas de confirmación o entrada de datos.......................97
8.5.2. Lista de eventos de Javascript disponibles de forma genérica...................98
8.5.3. Los objetos document y window......................................................................99
9. HTML5............................................................................................................................100
9.1. ESTRUCTURA DE UN DOCUMENTO HTML5 O XHTML5............................................100
9.2. CAMBIOS EN LAS ETIQUETAS....................................................................................101
Etiquetas eliminadas...................................................................................................101
Nuevas etiquetas para la organización del documento......................................101
Solventando los problemas de versiones antiguas de Internet Explorer.............101
9.3. MEJORAS EN LOS FORMULARIOS: NUEVOS TIPOS DE INPUT.................................102
9.4. MODERNIZR................................................................................................................104
9.5. ETIQUETAS MULTIMEDIA............................................................................................107
Audio.............................................................................................................................107
Formatos de audio......................................................................................................108
Vídeo.............................................................................................................................108
Formatos de vídeo......................................................................................................109
Archivos de Flash.........................................................................................................109
9.6. DIBUJO MEDIANTE LA ETIQUETA CANVAS..............................................................109
9.7. GEOLOCALIZACIÓN.................................................................................................113
9.8. MÁS COSAS...............................................................................................................114
10. CSS3.............................................................................................................................116
10.1. LOS NUEVOS SELECTORES DE CSS3.......................................................................116
Pseudoelementos.......................................................................................................116
Pseudoclases..............................................................................................................116
Nuevos selectores para uso con formularios...........................................................117
El selector :not()...........................................................................................................117
Nuevos selectores de atributos.................................................................................118
Selector general de elementos hermanos..............................................................119
9.2. LAS NUEVAS PROPIEDADES DE CSS3.......................................................................119
Gradientes y una nueva paleta de colores............................................................119
Fondos múltiples..........................................................................................................120
Esquinas redondeadas y bordes decoradas..........................................................121
Sombras........................................................................................................................122
Opacidad.....................................................................................................................123
Más control de la tipografía......................................................................................123
Columnas más fáciles.................................................................................................124
Transformaciones y trancisiones................................................................................125
11.ENLACES, BIBLIOGRAFÍA Y REFERENCIAS..................................................................128
1. INTRODUCCIÓN
Un lenguaje de marcas es una forma de codificar un documento que, junto con
el texto, incorpora etiquetas (o marcas) que contienen información adicional
acerca de la estructura del texto o su presentación. Tal vez la forma más primitiva
que hemos usado de lenguaje de marcas fuera un dictado en el que la persona
que dicta nos va dando notas acerca de lo que tenemos que poner en negritas,
cursivas, etc. En el mundo de los ordenadores llevamos mucho tiempo usando
lenguajes de marcas. Wordstar, uno de los primeros procesadores de texto que
existieron para el mundo de los PC o Latex, el programa de autoedición favorito
para edición profesional de textos, son dos ejemplos de ello:
Wordstar
La lluvia en ^BSevilla^S es una ^Ymaravilla^S.
LATEX
La lluvia en \textbf{Sevilla} es una \textit{maravilla}.
Resultado:
La lluvia en Sevilla es una maravilla.
Es común en muchos ámbitos confundir un lenguaje de marcas con un lenguaje
de programación. Pero no: se trata de cosas diferentes. Hay, fundamentalmente,
tres carencias de los lenguajes de marcas que los distinguen:
No tienen funciones aritméticas
No tienen variables
No tienen estructuras de control
Las características principales de un lenguaje de marca son las siguientes:
Se usan siempre sobre texto plano.
Las marcas se entremezclan con el contenido del documento aunque, en
general, es fácil distinguir unas del otro.
Su procesamiento es muy sencillo.
Son muy flexibles.
Historia de los lenguajes de marcas
La primera referencia que se tiene de un lenguaje de marcas como tal está aún
alejado de la informática. Se trata de la práctica de los empleados de imprenta
de anotar marcas con instrucciones en los márgenes de las pruebas de impresión:
Algunos lenguajes de marcas
HTML es, sin duda, el lenguaje de marcas más usado y la base de las páginas
web. Su primera versión, que data de los años 90, describía sólo 22 elementos
diferentes. La versión actual es la 4.01 aunque la versión 5 está en una fase muy
avanzada y se empieza a utilizar cada vez más a pesar de que se trata de una
norma que no está aún aprobada de forma definitiva.
XHTML (Extensible HTML) es equivalente a HTML pero deriva de XML. La versión
actual es la 1.1 y la versión 2.0 está en borrador. Las diferencias entre HTML 4 y
XHTML 1 son nímias.
CSS (Cascading Style Sheets) es un lenguaje usado para definir la presentación de
un documento en HTML o XHTML. No se trata en realidad de un lenguaje de
marcas, pero se encuentra indisolublemente unido a estos dos. La versión actual
es la 2 y la versión 3 se encuentra en fase de borrador. Al igual que ocurre con
HTML5, CSS3 se usa cada vez más a pesar de no tratarse de una norma definitiva.
SGML está definido como una norma ISO mientras que el resto de los lenguajes
mencionados están definidos por la W3C (Worl Wide Web Consortium).
Componentes de un lenguaje de marcas
Veamos un primer ejemplo muy simple de HTML y analicemos los diferentes
componentes que pueden aparecer en un lenguaje de marcas y algunas de las
características particulares de HTML:
<html>
<head>
<title>.:: PAGINA DE PRUEBAS ::.</title>
</head>
<body bgcolor="black" text="white">
<center><h1>TITULAR</h1></center>
Prueba de <strong>texto normal</strong><br />
Segunda linea
-Tambien en la segunda linea
</body>
</html>
Se trata de un ejemplo reducido al mínimo y que, incluso, presenta algunos
defectos o incorrecciones, pero nos vale como primer contacto. Veamos como
se vería en un navegador:
<strong>texto normal</strong>
Etiquetas o tags: Son las marcas propiamente dichas y habitualmente van
entre corchetes quebrados <> Las hay de inicio y de fin aunque, en algunos
casos, ambas pueden coincidir en una sóla partícula con una sintaxis
especial cuando el elemento no tiene contenido:
Contenido: Es el texto base informativo del documento. Por ejemplo, en el
anterior elemento con las etiquetas strong el contenido sería el texto que
luego aparecerá en negritas.
Atributos: Es una pareja compuesta por un nombre y un valor que se
encuentra dentro de una etiqueta de inicio e identifica las propiedades
asociadas al elemento.
bgcolor="black"
En realidad, en HTML convencional es posible encontrar atributos sin valor,
pero en XHTML, que será nuestro preferido, esto no es válido como veremos
a continuación.
Diferencias entre HTML y XHTML
Como hemos dicho hace un momento, XHTML introduce ciertas restricciones a
HTML para hacer que el lenguaje resultante sea más sencillo y fácil de interpretar.
Estas diferencias son las siguientes:
Los elementos deben de cerrarse siempre. En HTML normal es
perfectamente válido, por ejemplo, empezar un párrafo con la etiqueta
<p> y, sin poner la marca de fin de párrafo </p> comenzar un segundo
párrafo de nuevo con <p>. Puesto que no podemos anidar dos párrafos
uno dentro de otro el intérprete debe de reconocer que al empezar el
segundo párrafo debería antes de terminar el primero. En XHTML hay que
cerrar el primero explicitamente o en caso contrario tendremos un error de
validación:
HTML: <p>Primer párrafo <p>Segundo párrafo
XHTML: <p>Primer párrafo</p><p>Segundo párrafo</p>
Los elementos sin contenido deben de “cerrarse” siempre usando una
etiqueta especial que realiza el autocierre en la misma etiqueta de inicio:
HTML: <br>
XHTML: <br/>
Los elementos anidados no deben solaparse. En HTML está permitido pero
en XHTML es incorrecto:
HTML: <em><strong>Texto</em></strong>
XHTML: <em><strong>Texto</strong></em>
Los valores de los atributos deben de ir siempre entre comillas simples o
dobles:
HTML: <body bgcolor=black text=white>
XHTML: <body bgcolor="black" text='white'>
Los nombres de etiquetas y atributos deben de ir siempre en minúsculas
HTML: <body BGCOLOT=black text=WHITE>
XHTML: <body bgcolor="black" text="white">
No está permitido usar un atributo sin valor (minimización de atributos)
HTML: <textarea readonly>
XHTML: <textarea readonly="readonly">
Los atributos y etiquetas desaprobados o desaconsejados (deprecated) en
HTML 4 no son válidos en XHTML. Los veremos más adelante.
Una aclaración en todo esto: un fichero que valida correctamente como XHTML
siempre validará como HTML pero no a la inversa, es decir, si escribimos de
acuerdo a la norma marcada por XHTML también conseguimos ficheros válidos
para HTML con una sintaxis más clara, legible y menos sujeta a errores de
interpretación. Por eso será nuestra elección a lo largo de todo este manual.
Editores de texto enriquecido
A la hora de trabajar con lenguajes de marcas, la elección de un editor de texto
enriquecido con ayuda contextual es muy importante:
Existen muchos editores que cumplen para esta labor, pero si te ves perdido a la
hora de empezar puedes probar con uno de estos dos:
Bluefish (multiplataforma): http://bluefish.openoffice.nl/
Notepad++ (sólo Windows): http://notepadplusplus.org/
Navegadores
En el caso del HTML y el XHTML, el navegador web funciona como visor o
intérprete del lenguaje de marcas y su respeto por los estándares es fundamental.
Muchas veces en el pasado se ha utilizado la posición de supremacía de uno de
ellos para desviarse del estándar y perjudicar a la competencia.
Afortunadamente estas prácticas parecen abandonadas hoy en día. Tenemos
varios recursos para comprobar la validez de un fichero escrito en HTML o la forma
en que el navegador implementa los estándares:
Validadores de HTML y CSS:
http://validator.w3.org/
http://jigsaw.w3.org/cssvalidator/
Tests de cumplimiento de estándares:
http://acid2.acidtests.org/
http://acid3.acidtests.org/
http://www.css3.info/selectorstest/
HTML4 vs HTML5
HTML5, aún está en estado de borrador, pero supone un enorme y esperado
cambio. La última revisión de HTML, la 4.01, se hizo en 1999 y desde entonces
Internet, nuestros hábitos y nuestras espectativas sobre lo que deberíamos de
recibir al visitar una web han cambiado mucho.
En paralelo a HTML5 existirá una versión de XHTML5 más estricta que también se
encuentra aún en estado de borrador. Las diferencias entre HTML5 y XHTML5 serán
las mismas que las ya vistas para HTML4 y XHTML4: apenas unas restricciones extras
para facilitar la interpretación del lenguaje.
HTML5, además, irá acompañado de CSS3 que mejora y simplifica el diseño web.
Las principales novedades de HTML5 y CSS3 son las siguientes:
Ya no se habla de páginas web sino de aplicaciones web. Esto quiere
reforzar el cambio en la filosofía que se persigue con esta nueva versión del
lenguaje.
La separación entre presentación y contenido se ve reforzada. En HTML5
todo lo relativo al diseño irá en los CSS. HTML5 sin CSS es en blanco y negro y
no se debería siquiera elegir un tipo de letra diferente al que el navegador
nos muestra por defecto.
Existe una gran mejora en todo lo relativo al manejo de formularios
HTML5 se encuentra plenamente integrado con Javascript. De hecho, se
encuentra ligado de forma casi indisoluble a una amplia colección de API's
de Javascript que le proporcionan soporte para diseño 2D y 3D,
geolocalización, arrastrar y soltar, multimedia, etc.
Entonces, si existen todas estas ventajas y el borrador de HTML5 está ya
prácticamente cerrado ¿por qué cuesta tanto trabajo encontrar webs realizadas
en HTML5?¿Por qué no empezamos nosotros a trabajar directamente con él? La
respuesta está en los navegadores, los intérpretes de todo esto. Veamos una
fotografía de los navegadores más usados (en septiembre de 2011):
Hoy, febrero de 2014, las tornas han cambiado bastante desde que empezamos
a escribir este manual y ya es perfectamente factible encontrar bastante a
menudo aplicaciones web construidas completamente en torno a HTML5
2. HTML BÁSICO
En este segundo apartado trataremos los elementos más básicos de HTML
siguiendo las siguientes normas:
Nos centraremos en la versión 4.01, tratando de respetar la norma XHTML
1.0 más estricta (aunque siempre hablaremos de html por simplificar) y
acercándonos cuanto podamos a cumplir con lo que establecerá HTML5
para facilitar una futura trancisión.
Veremos en algunos casos algunas de las etiquetas y/o argumentos de uso
desaconsejado indicándolo siempre a continuación. Puesto que en nuestro
desempeño no sólo haremos páginas web sino que tendremos que
modificar las que otros han creado necesitamos saber para quer sirven.
Trataremos, también, de proporcionar siempre que podamos un contenido
semántico a nuestras etiquetas
Separaremos la parte de diseño (que en un futuro aprenderemos a aplicar
mediante CSS) del contenido del documento. No te preocupes si, por el
momento, tus páginas resultan demasiado simples.
2.1. ESQUELETO BÁSICO
El DOCTYPE
Todas las páginas HTML deberían de comenzar por un DOCTYPE o Declaración de
tipo de documento que es la que asocia dicha página con un DTD (Document
Type Definition) o Definición de Tipo de Documento e indica esto al navegador.
En realidad, y para no hacerlo más complicado de lo que necesitamos saber, se
trata meramente de una línea formal en la que indicamos al navegador la norma
que sigue el lenguaje de marcas que debe de interpretar.
En la Wikipedia tenemos diferentes tipos de DOCTYPE:
http://es.wikipedia.org/wiki/Declaraci%C3%B3n_de_tipo_de_documento
La definición de HTML 4.01 Trancisional, la más habitual, es esta:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
El DOCTYPE debe de ocupar siempre la primera línea del documento html sin que
exista ni un sólo espacio antes de ella o no tendremos garantías de que todos los
navegadores la reconozcan.
Los elementos Básicos
Los elementos básicos en una página HTML son html, head y body. La expresión
mínima formal de un documento HTML sería este:
El contenido del elemento html es toda nuestra página web (salvo el DOCTYPE).
Lleva un atributo denominado lang que indica el idioma con que está hecha la
web.
El contenido del elemento head está formado, a su vez, por una serie de
elementos que no se visualizan directamente (salvo el título o title que aparecerá
en la barra del navegador). El elemento meta puede aparecer con diferentes
indicaciones dentro de esta sección de cabecera. La más importante es, tal vez,
el juego de caractéres con que hemos escrito el documento HTML. Si nos
equivocamos puede que algunos caracteres especiales (vocales acentuadas,
signos de puntuación, etc.) no aparezcan correctamente. En Linux se suele usar
UTF8 mientras que si usas windows suele ser el ISO88591.
Por último, el elemento body contendrá toda la parte visible de la web. En este
caso se trata de un único párrafo (etiqueta p) con un mensaje típico de
bienvenida.
2.2. ELEMENTOS DE BLOQUE Y ELEMENTOS DE LÍNEA
Las páginas web están hechas siempre de elementos rectangulares que se
colocan uno debajo de otro, uno junto a otro o uno encima de otro. No hay nada
más. Cualquier cosa que nos parezca diferente se trata de un truco de diseño.
Dentro de esto, tenemos que distinguir entre los elementos de bloque y los de
línea. Los de bloque podríamos asemejarlos con los párrafos de un texto: ocupan
todo el ancho de la superficie útil del documento (o del área del documento al
que han sido restringidos) y pueden tener otros elementos, iguales o diferentes,
arriba, abajo o, en algunas ocasiones, en su interior (aunque esto último no
siempre es correcto). Un párrafo, por ejemplo, no debería de contener a otro
párrafo en su interior. También pueden contener elementos de línea.
Los elementos de línea se sitúan uno debajo de otro, uno al lado de otro (como,
por ejemplo, un texto en negrita que puede ir seguido de otro en cursiva) o,
incluso, uno dentro de otro (una cita puede tene una palabra en negrita en su
interior). Los elementos de línea no pueden tener en su interior un elemento de
bloque.
Otra característica importante de HTML es que por defecto los saltos de línea
consecutivas que hagamos manualmente en nuestro documento no se respetan.
Por ejemplo, si yo escribiera lo siguiente:
<p>Hola a todos
los compañeros
En el navegador se mostraría lo siguiente:
Cuando aparecen múltiples espacios en blanco sólo se respeta el primero. Por
ejemplo:
<p>Hola a todos los compañeros del curso de HTML</p>
Se vería en el navegador así:
2.3. LAS ETIQUETAS MÁS COMUNES
<p></p> Define un párrafo
<br /> Salto de línea
<b></b> Negritas
<strong></strong> Negritas
<i></i> Cursivas
<em></em> Cursivas
<sup></sup> Superíndice
<sub></sub> Subíndice
<del></del> Texto tachado
<pre></pre> Preformateado
<h1></h1> Encabezado de nivel 1
<h2></h2> Encabezado de nivel 2
...
<h6></h6> Encabezado de nivel 6
<cite></cite> Cita corta
<q></q> Cita corta
<blockquote></blockquote> Cita larga
<hr /> Línea horizontal
Todas las etiquetas llevan asociada una información de estilo por defecto, pero
esta puede variar entre cada navegador. Más adelante, cuando veamos CSS,
veremos como modificar dicho estilo y tratar de que sea lo más independiente
posible del navegador que usemos para verlas.
En las etiquetas en las que podemos elegir, preferiremos siempre las que
conllevan información semántica (strong, em, cite)frente a las que sólo nos dan
información de estilo (b, i, q).
La etiqueta pre de texto “preformateado” define un área en el que se respeta de
forma íntegra los saltos de línea y espacios en blanco que hayamos realizado al
escribir el texto.
Las etiquetas h1, h2, h3, h4, h5, h6, p, blockquote, y pre son etiquetas que
defienen elementos de bloque, mientras que strong, b, em, i, sup, sub, del, bdo,
cite o q son etiquetas de elementos de línea.
Listas
Las listas se definen mediante las etiquetas ul, li y ol.
Por ejemplo:
<ol>
<li>Lunes</li>
<li>Martes</li>
<li>Miércoles</li>
<li>Jueves</li>
</ol>
Las listas se pueden anidar, pero teniendo en cuenta que la nueva lista tiene que
abrirse antes de cerrar el item anterior. Por ejemplo:
<ul>
<li>Punto 1</li>
<li>Punto 2
<ul>
<li>Apartado A del punto 2</li>
<li>Apartado B del punto 2</li>
</ul>
</li>
<li>Punto 3</li>
</ul>
La etiqueta li se puede usar fuera de un bloque ol o ul y puede llevar un atributo
denominado type con cualquiera de las opciones válidas en ol o ul (también está
desaconsejado su uso).
Las imágenes
Para insertar imágenes se utiliza la etiqueta img Es una etiqueta única (sin
contenido) por lo que tenemos que usar el método de autocerrado para cumplir
las normas de XHTML. La sintaxis básica es esta:
El atributo src es obligatorio e indica el lugar donde está la imagen. Se puede usar
una ruta relativa, absoluta o indicar una URL web.:
<img src=”pics/2012/imagen.jpg” alt=”Texto alternativo” />
<img src=”http://www.example.com/imagen.jpg” alt=”Texto alternativo” />
El atributo border muy útil para indicar que queremos una imagen con borde (sin
él cuando lleva incorporado un hiperenlace) está desaconsejado en HTML4 y no
existe en HTML5. Indica el número de píxeles que tendrá el borde de la imagen.
Por defecto las imágenes se muestran sin borde salvo que pertenezcan a un
hiperenlace (ver el punto siguiente)
La etiqueta img es una etiqueta de línea.
Los hiperenlaces
Los enlaces a otras páginas se realizan mediante la etiqueta a
<a href=”http://www.google.es” />Google</a>
Otros atributos son title y target:
Para hacer un enlace a un punto dentro de la misma página usamos la siguiente
sintaxis:
<a href="#C4">Ver el capítulo 4</a>
...
<a id="C4">CAPÍTULO 4</a>
Para ir a un punto dentro de otra página usamos un formato similar:
<a href="otrapagina.html#C4">Ver el capítulo 4 de otrapagina.html</a>
<ul id=”lista_1”>
<li>Procesador ARM</li>
<li>128 Mbytes RAM</li>
<li>16 Gbytes HDD Compact Flash</li>
</ul>
El valor del atributo id debe de ser único y no debe repetirse nunca en la misma
página web.
Un ejemplo más completo para un enlace a email en el que rellenamos no solo la
dirección de destino, sino también el asunto y el campo cc:
NOTA IMPORTANTE: Para que valide correctamente como XHTML estricto
debemos de sustituir el signo & por el código & No se ha hecho por
claridad, pero lo veremos más adelante.
La etiqueta a es una etiqueta de línea.
Comentarios
Los comentarios en HTML se escriben entre los símbolos <! y >
Una nota respecto a los comentarios y, en general, sobre cualquier otra cosa
que hagamos en las páginas web realizadas con HTML y CSS: Todo,
absolutamente todo lo que escribamos en ellas llegará al navegador del usuario
tal y como las hayamos escritos y será interpretado por este. Los comentarios y
algún otro argumento puede que no resulten visibles, pero si el usuario quiere (y
sabe hacerlo) siempre podrá verlos, por lo general con la combinación de teclas
Ctrl+U o eligiendo la opción adecuada en el menú del navegador. Por tanto,
tenemos que tener mucho cuidado con lo que hacemos en estos campos
aparentemente ocultos. Como norma general lo que no queramos que vea
ningún usuario no debería de escribirse.
Dirección del texto
Para indicar si el texto va de izquierda a derecha o de derecha a izquierda se usa
la etiqueta bdo con el atributo dir:
ltr indica que el texto va de izquierda a derecha (left to right) y rtl de derecha a
izquierda. El valor por defecto es ltr.
Acrónimos y abreviaturas
Usamos las etiquetas acronym y abbr, respectivamente, con el atributo title que
mostrará una nota explicativa o “tooltip” al pasar el ratón por encima.
NOTA IMPORTANTE: acroym desaparece en HTML5, así que no conviene usarlo.
Caracteres especiales
Los caracteres especiales que se usan para las etiquetas no pueden escribirse tal
cual en un documento HTML, así que hay que usar una codificación especial.
< <
> >
" “
& &
Existen también un caracter especial que pueden sernos úti:
Si necesitamos algún otro caracter que no aparece en nuestro teclado (símbolos
tipográficos, etc.) podemos recurrir a la siguiente tabla:
http://www.ascii.cl/es/codigoshtml.htm
2.4. TABLAS
Las tablas se han usado durante mucho tiempo en HTML como el sustituto de
otras alternativas de diseño. Nosotros no deberíamos de hacer esto jamás. Una
tabla debe de usarse para lo que es: para presentar datos en un formato
tabulado y no, por ejemplo, para presentar información en cuatro columnas
separadas. Para esto ya veremos la forma correcta de hacerlo.
La sintaxis que muestra una tabla sencilla quedaría con dos filas y tres columnas
sería así:
<table>
<tr>
<td>1</td><td>2</td><td>3</td>
</tr>
<tr>
<td>4</td><td>5</td><td>6</td>
</tr>
</table>
La etiqueta <table></table> es la que define y contiene al elemento tabla. Cada
fila va encerrada como contenido de la etiqueta <tr></tr>. Cada celda va
delimitada por la etiqueta <td></td>. El número de celdas que hay en una fila
determina el número de columnas de la tabla.
http://www.w3schools.com/tags/tag_table.asp
http://www.w3schools.com/tags/tag_tr.asp
http://www.w3schools.com/tags/tag_td.asp
La etiqueta td continúa disponiendo de los atributos colspan y rowspan que sirven
para fusionar celdas horizontal o verticalmente.
<table border=”1”>
<tr>
<td colspan=”3”>1, 2 y 3</td>
</tr>
<tr>
<td>4</td><td>5</td><td>6</td>
</tr>
</table>
<table border=”1”>
<tr>
<td rowspan=”2”>1 y 4</td><td>2</td><td>3</td>
</tr>
<tr>
<td>5</td><td>6</td>
</tr>
</table>
<th>E</th><td>4</td><td>5</td><td>6</td>
</tr>
</table>
La etiqueta caption se usa para dar título a la tabla. Debe de aparecer una sóla
vez e inmediatamente despueś de la apertura de la etiqueta table:
<table border="1">
<caption>Título de la tabla</caption>
<tr>
...
</table>
Las etiquetas thead, tbody y tfoot nos permiten estructurar de forma lógica la
información de la tabla, pudiendo incluso variar el orden de los mismos
(definiendo el cuerpo por delante de la cabecera, por ejemplo) si así nos
conviniera:
<table border="1">
<thead>
<tr>
<th>Mes</th>
<th>Ingresos</th>
</tr>
</thead>
<tfoot>
<tr>
<td>Total</td>
<td>2800,00 €</td>
</tr>
</tfoot>
<tbody>
<tr>
<td>Enero</td>
<td>1200,00 €</td>
</tr>
<tr>
<td>Febrero</td>
<td>1600,00 €</td>
</tr>
</tbody>
</table>
NOTA importante: Como hemos dicho en varias ocasiones, HTML5 está aún en
fase de borrador. Los atributos que aquí aparecen como válidos o
desaconsejados pueden variar de las especificaciones finales de la norma. Por
ejemplo, aún hay discrepancias acerca de que pasará finalmente con los
atributos border y summary de la etiqueta table.
2.5. ALGUNAS ETIQUETAS Y ATRIBUTOS DESACONSEJADOS MÁS
font y basefont están desaconsejadas en HTML 4.01 y desaparecen en HTML5.
Para cambiar las caracterísitcas del texto hay que usar hojas de estilo. Un ejemplo
de uso:
s y strike se desaconsejan, pero la etiqueta del que hace exactamente lo mismo
sigue siendo válida.
Si queremos mostrar texto tachado deberíamos de <del>hacerlo así</del> y
nunca <s>así</s> o <strike>así</strike>.
La etiqueta u para subrayar texto también deja de estar soportada.
big y small también desaparecen en HTML5
<html>
<frameset cols="25%,*,25%">
<frame name=”zona1” src="frame_1.htm" />
<frame name=”zona2” src="frame_2.htm" />
<frame name=”zona3” src="frame_3.htm" />
<noframes>Tu navegador no soporta frames</noframes>
</frameset>
</html>
3. CSS. SELECTORES BÁSICOS
Las hojas de estilo sirven para separar completamente el contenido del diseño de
una página web, de tal forma que, si lo estructuramos correctamente, es posible
cambiar totalmente el aspecto de nuestra web haciendo modificaciones en las
hojas de estilo (css) sin tocar ni una sóla línea de su contenido (html). Para
empezar, podemos hacer una pequeña demostración con la página de ejemplo
que hemos creado en la anterior unidad. Si añadimos la siguiente línea en la
sección de cabecera (head), el navegador dejará de usar la hoja de estilos por
defecto y tomará una de las que pone a nuestra disposición la W3C como
demostración:
<link href="http://www.w3.org/StyleSheets/Core/Traditional"
rel="stylesheet" type="text/css" />
3.1. INTEGRACIÓN DE HTML CON CSS
Existen tres formas diferentes de integrar las hojas de estilo con HTML. La más
rudimentaria consiste en usar el atributo style junto con cualquier etiqueta HTML.
Por ejemplo:
<h1 style="color: red; font-family: Verdana, Arial;" >Título</h1>
Dentro del archivo estilos.css escribiremos nuestros estilos con una sintaxis idéntica
a la vista en el caso anterior:
Un documento HTML puede utilizar una de las tres formas anteriores, dos de ellas o
las tres, incluso, a la hora de aplicar estilos. El navegador, en caso de conflicto,
tomará siempre como bueno el estilo más cercano al contenido del documento.
En caso de conflicto usando la misma forma de aplicar estilos el navegador
tendrá en cuenta lo definido en la última ocurrencia aparecida.
Comentarios en hojas de estilo CSS
Los comentarios en las hojas de estilo (cuando estas se guardan en ficheros
independientes) no se hacen de la misma forma que en HTML, sino que usamos
los símbolos /* para abiri el comentario y */ para cerrarlo. Un comentario puede
ocupar más de una línea. Un ejemplo:
/* Esto es un comentario
y puede ocupar tantas líneas como deseemos
hasta encontrar el símbolo de cierre de comentario */
3.2. SELECTORES BÁSICOS
Toda regla de formato en CSS está formadas por dos partes: selector y
declaración. La declaración indica que formato hay que aplicar y el selector
indica donde hay que aplicarlo. La declaración de la regla CSS va encerrada
entre llaves y está formada por parejas propiedad: valor; terminadas siempre en
punto y coma. Si observamos alguno de los ejemplos anteriores es fácil identificar
cada uno de estos componentes y comprobar lo sencillo de la sintaxis.
Así como en HTML la palabra clave es la etiqueta, el corazón de CSS lo
componen los selectores. La versión 2.1 de CSS tiene una docena de selectores
diferentes pero es posible diseñar casi cualquier web con los cinco tipos básicos
que veremos a continuación. Veremos los avanzados más adelante.
Selectores de tipo o de etiqueta
El selector de tipo o de etiqueta sirve para definir las propiedades de formato de
todos los elementos de la página cuya etiqueta HTML coincida con el valor del
selector. Los dos ejemplos que hemos visto en el punto 2 en los que se definía el
formato para h1 y p son ejemplos de selectores de este tipo. Podemos definir
selectores de etiqueta para cualquier elemento HTML que esté dentro del cuerpo
(body) de nuestra página HTML e, incluso, para el propio body:
Podemos aplicar estilos simultáneamente a más de una etiqueta separando los
selectores con comas:
h1, h2, h3, h4, h5, h6 {color: blue; }
Observa que si cometes un error en la sintaxis, el navegador sencillamente no
tendrá en cuenta la declaración de ese selector.
Selector universal
Existe un selector denominado universal que se simboliza con un asterisco. Se trata
de una especie de comodín que permite seleccionar a cualquer elemento:
Cuidado: así aplicado sería similar, pero no igual, a aplicar la misma declaración
sobre la etiqueta body, como hemos visto antes. Lo mejor para que aprecies las
diferencias es que practiques sobre algunos ejemplos.
Colores y propiedades básicas del texto
Los colores en la declaración de cualquier selector de CSS se definen con dos
propiedades: color (del texto o del elemento en si) y backgroundcolor (del
fondo). Por ejemplo:
Los valores por defecto son black para el color del elemento y transparent para el
fondo. Podemos aplicar estas propiedades en la declaración de cualquier
selector de los ya vistos y los que veremos en adelante:
hr {color: red;}
¿Qué colores son válidos? Por un lado tenemos la posibilidad de usar una paleta
de 17 colores básicos usando su nombre predefinido de entre los que aparecen
en el siguiente mapa de colores:
Una segunda opción es indicar el color exacto que queremos mediante su valor
RGB, ya sea en hexadecimal, decimal o porcentual:
h1 { color: rgb(255, 20, 147); }
h2 { color: rgb(100%, 8%, 58%); }
h3 { color: #FF1493; }
Ciertos colores expresados en RGB hexadecimal se pueden presentar mediante
una forma abreviada. Son aquellos en los que los tres componentes de color
tienen sus cifras iguales, por ejemplo #660099 puede expresarse también como
#609. Un subconjunto formado por 216 de estos colores constituyen lo que se
conoce como paleta de colores Web Safe y se usan cuando queremos garantizar
que los colores que escojamos se verán exactamente igual en todos los
dispositivos, incluidos aquellos que sólo pueden visualizar 256 colores (muchos
ordenadores y, sobre todo, dispositivos móviles antiguos). Puedes consultar esta
paleta en este enlace:
http://en.wikipedia.org/wiki/Web_colors#Websafe_colors
Si el tipo de letra consta de más de una palabra tenemos que indicarlo entre
comillas dobles:
em {font-family: “Times New Roman”;}
El tipo de letra así indicado de cualquiera de estas formas debe de estar instalado
en el ordenador o ser accesible a través de Internet (y, en ese caso, indicar
donde) para que se muestre correctamente, por eso es más seguro indicar una
familia tipográfica o, mejor aún, una lista de preferencias que siempre acaba en
una familia tipográfica. Por ejemplo:
h1 {font-family: Verdana, Helvetica, Arial sans-serif; }
p { font-family: Georgia, "Times New Roman", Times, serif; }
pre {font-family: "Courier New", Courier, monospace; }
Otra posibilidad es escoger una fuente disponible en Internet e indicar el lugar
donde está disponible para que el navegador se la descargue y la use. El
directorio más popular de fuentes es el que Google pone a nuestra disposición:
http://www.google.com/webfonts
El funcionamiento es sencillo: elegimos las fuentes que vamos a usar y Google nos
proporciona la línea que tenemos que incluir en el head de nuestro HTML y la
pareja propiedad:valor que debemos de usar en nuestras reglas CSS. Por ejemplo,
para usar la fuente Gochi Hand debemos incluir esto en la sección head de
nuestro HTML:
<link href="http://fonts.googleapis.com/css?family=Gochi+Hand"
rel="stylesheet" type="text/css">
Y nuestra regla CSS sería así:
h1 {font-family: "Gochi Hand", cursive;}
fontvariant (desaparece en CSS3 y, por tanto, no es aconsejable su uso) es una
propiedad que nos permite dos únicas opciones: normal o smallcaps (lo que en
español conocemos como versales o versalitas).
p {font-weight: bold; font-style: italic; font-variant: small-caps; }
Esta propiedad no sólo alinea el texto, sino que hace lo mismo con las imágenes
que estén contenidas en un texto cuyo párrafo la tenga aplicada. Por ejemplo, si
queremos una imagen alineada no podemos aplicarla sobre la etiqueta img,
pero si sobre la etiqueta p del párrafo que contiene a esa imagen:
p {text-align: center; }
Y luego, meter la imagen dentro de un párrafo:
<p><img src="logotipo.jpg" alt="Logo de mi empresa" /></p>
Selectores descendientes
Es una forma de seleccionar elementos que se encuentran dentro de otros
elementos para aplicarles un estilo personalizado. Imaginemos, por ejemplo, que
quiero aplicar un estilo particular a la etiqueta de cursivas (em) pero sólo cuando
esta se aplica a un titular. Necesito usar un selector descendiente:
h1 em {color: red; }
El estilo se aplicará a todas las etiquetas em dentro de un elemento h1 sin
importar el nivel de profundidad. Es decir, en el siguiente fragmento HTML también
se aplicarían:
<h1><a id="INICIO">Titular de la <em>pagina</em></a></h1>
El selector descendiente debe de estar formado por, al menos, dos selectores
pero podría tener más si así lo precisamos:
p strong em {font-variant: small-caps; }
El estilo anterior se aplicaría a las cursivas (em), dentro de una etiqueta de negrita
(strong) y, a su vez, dentro de un párrafo (p).
Podemos combinar este tipo de selectores con el selector universal para realizar
restricciones. Por ejemplo, tengamos en cuenta las siguientes dos variantes de
selectores y los dos fragmentos de código HTML a continuación:
p a { color: green; }
p * a { color: green; }
<p><a id="INICIO">Enlace</a></p>
<p><strong><a href="#">Enlace</a></strong></p>
Si usamos la primera regla CSS se colorearán en verde las dos líneas, mientras que
si usamos la segunda regla, sólo se coloreará la segunda.
Selectores de clase
Los selectores que hemos visto hasta ahora fallan en una cosa: no son flexibles
cuando queremos aplicar un estilo diferenciado a algunos párrafos, pero no a
todos ellos. Una de las soluciones para esto es usar los selectores de clase. Para
aplicarlos, lo primero que tenemos que hacer es usar el atributo class en las
etiquetas HTML correspondientes a los párrafos cuyos estilos queremos diferenciar:
La regla CSS se especifica anteponiendo un punto al valor indicado en el atributo
class:
.verde {color: green; }
La regla CSS se aplicará a cualquier etiqueta HTML que incluya un atributo class
cuyo valor sea verde, y no sólo a las etiquetas p. Es decir, sería perfectamente
válido que, además de los párrafos anteriores, tuvieramos algo así en nuestro
HTML:
<p> Si aplicamos el atributo class con valor verde a <strong
class="verde">estas negritas</strong> o a <em class="verde">estas
cursivas</em> también aparecen en verde.</p>
Si quisiéramos restringir el uso del selector de clase para que sólo sea válido en
combinación de una determinada etiqueta, podemos combinarlo con el selector
de tipo o etiqueta:
p.verde {color: green; }
Ojo, no debemos de confundir las tres diferentes formas de combinación de
selectores que hemos visto hasta ahora:
p, .verde {color: green; }
p .verde {color: green; }
p.verde {color: green; }
En el primer caso la regla se aplica a cualquier etiqueta p o a cualquier etiqueta
que tenga un atributo class con valor verde. En el segundo caso se aplica a
cualquier etiqueta con un atributo class con valor verde que se encuentre dentro
de un elemento de tipo p. En el último caso, sólo se aplica en las etiquetas de tipo
p que tengan un atributo de tipo class con valor igual a verde.
Podemos aplicar también el formato de más de un selector de clase al mismo
elemento HTML. Imaginemos las siguientes reglas CSS:
.codigo {font-family: monoespace; color: rojo; }
.versalita {font-variant: small-caps;}
Y en nuestra página HTML:
<p class="codigo versalita">Párrafo en rojo con fuentes monoespaciadas y
usando versalitas</p>
Por último, podemos usar también los selectores de clase múltiple. La regla CSS se
expresa así:
.codigo.versalita {font-family: monoespace; color: blue; font-variant:
small-caps;}
Si incluimos esta regla en nuestro ejemplo anterior, tendrá preferencia sobre las
reglas individuales y nuestro párrafo aparecerá en azul en lugar de en rojo.
Selectores de ID
El selector de id es muy similar al de clase. La principal diferencia es que se
debería de usar sólo cuando es preciso aplicar estilos a un elemento único en la
página. En ese caso usaremos el atributo id en lugar de class en la etiqueta HTML
y el simbolo almohadilla (#) en lugar del punto en la definición de la regla CSS.
Casi todo lo demás dicho en referencia a los selectores de clase (la forma de
restringir su uso, de combinarlo con otros selectores, etc) es aplicable a los
selectores de id con una salvedad: no existen selectores de id múltiple y no
podemos poner dos id diferentes a una misma etiqueta HTML al igual que
hacíamos con el selector de clase.
3.3. COMBINANDO SELECTORES
Todos los selectores aquí vistos pueden combinarse entre si. Algunos ejemplos ya
los hemos visto en este documento. Pero podemos complicarlo cuanto queramos
o necesitemos. Veamos algunos ejemplos:
El anterior selector hace referencia al enlace con un atributo id=”inicio” que se
encuentra dentro de un elemento de tipo <li> con un atributo
class=”destacado”, que forma parte de una lista <ul> con un atributo
id=”menu”. De nuevo selectores descendientes pero en esta ocasión con tres
niveles y en cada uno de ellos tenemos un selector de clase o de ID con uso
restringido.
4. UNIDADES DE MEDIDA Y OTRAS PROPIEDADES
En este capítulo veremos algunos de los elementos básicos de CSS que aún nos
restan. Estudiaremos las diferentes unidades de medida que podemos utilizar,
algunas propiedades más relativas al texto, introduciremos las dos etiquetas div y
span y veremos los conceptos de herencia y especificidad.
Unidades de medida
CSS tiene un amplio y flexible conjunto de formas de expresar tamaños y medidas.
Manejarlas correctamente es necesario para expresar el tamaño de las fuentes
que usamos y para otras características esenciales en un buen diseño:
interlineado, márgenes, separaciones, etc.
Para experimentar con ellas presentaremos una nueva propiedad: fontsize que
nos permite definir el tamaño de la tipografía que estamos usando. Algunas de las
formas de especificar medidas que veremos aquí son sólo válidas para los tipos
de letras mientras que otras son más generales y nos servirán para cualquier otra
cosa.
Unidades de medida específicas de las tipografías
La forma más sencilla es expresar esta medida como una palabra clave que
exprese un valor fijo absoluto. Los valores permitidos son xxsmall, xsmall, small,
medium, large, xlarge y xxlarge.
h1 {font-size: xx-large;}
p#piedepagina {font-size: x-small;}
La segunda forma de expresar el tamaño de la tipografía sería mediante una
palabra clave que expresa un tamaño relativo. Dos son las palabras claves
permitidas en este caso: larger y smaller. El primer valor elevará la fuente sobre lo
que le correspondería por defecto mientras que el segundo lo reducirá.
p {font-size: medium;}
p.grande {font-size: larger;}
Unidades absolutas
Podemos expresar medidas absolutas en pulgadas (in), centímetros (cm),
milímetros (mm), puntos (pt) o picas (pc). Estas dos últimas son medidas
específicas de las imprentas y medios gráficos. Un punto equivale a 1/72 pulgadas
(aproximadamente 0,35 milímetros) y una pica equivale a 12 puntos (alrededor
de 4,23 milímetros). El punto también es conocido porque es la medida que suele
usarse en los editores de texto para elegir el tamaño de una fuente.
Cuatro notas a tener en cuenta en todas ellas:
Para separar las cifras decimales usaremos el punto que es la norma en las
medidas anglosajonas.
Si la parte entera de una medida es cero se puede suprimir.
Si la medida es cero no se tiene que poner unidad de medida. Un cero es 0
y basta.
Entre la magnitud y la unidad de medida no debe de haber nunca
espacios en blanco.
Las siguientes reglas serían correctas:
h1 {font-size: .5in;}
p {width: 25cm; font-size: 8.5pt;}
p.destacado {width: 100mm; }
td {width: 10pc; }
Unidades relativas
Las unidades relativas son mucho más flexibles que las absolutas. Además, es
altamente recomendable usarlas siempre que se pueda porque ante la gran
diversidad de dispositivos que se pueden usar a la hora de ver una página web
(portátiles, grandes televisores de plasma, tablets, teléfonos móviles...), estas son
las que mejor se adaptan a cualquier situación.
Los píxeles son la medida relativa más conocida. Se trata de una medida relativa
a las dimensiones del dispositivo donde estamos viendo la página web. Un
ejemplo:
hr {width: 500px;}
em (ojo: no confundirlo con la etiqueta em de HTML) y ex son medidas relativas a
las dimensiones de la tipografía que estamos usando. Son medidas muy
conocidas por los profesionales de la tipografía. 1em representa,
aproximadamente, el ancho de la letra M mayúscula que estamos usando
teniendo en cuenta tanto la tipografía como el tamaño de la misma: no es lo
mismo una m si estamos usando una Arial Narrow que si estamos usando una
Courier New. Igualmente, para cualquiera de ambas el tamaño varía si estamos
usando una fuente a 12 puntos o a 18. 1ex equivale a la altura de una letra x
minúscula. Aunque no se trata de una regla exacta, 1em suele aproximarse como
el tamaño de la fuente que estamos usando (es decir, si estamos usando una
fuente a 12 puntos, 1em equivale a 12 puntos).
body {font-size: .9em;}
Si consideramos cierta la aproximación que hemos dicho antes, podemos decir
que una fuente con un tamaño de .9em es, aproximadamente, el 90% de la
fuente normal que debería de tener esa etiqueta. Una con 1.5em sería del 150%
p {font-size: 1.5ex;}
También se suele aproximar, aunque esto es bastante más irregular, que 1ex
equivale aproximadamente a 0.5 em
Aunque a primera vista son medidas que parece que sólo tienen sentido
aplicadas a tipos de letra, podemos usarlas sobre cualquier elemento de nuestra
web:
hr {width: 1em;}
Y una nota importante: la “referencia” sobre la que se calcula el tamaño relativo
de un elemento cuando usamos estas medidas es siempre es el tamaño de letra
de su elemento “padre”, es decir, del elemento en el que se encuentra. Si el
elemento no se encuentra dentro de ningún otro elemento, la referencia es el
tamaño de letra del elemento body. Si no se indica de forma explícita un valor
para el tamaño de letra del elemento body, la referencia es el tamaño de letra
por defecto del navegador. Lo podemos ver con este ejemplo:
body { font-size: 10px; }
h1 { font-size: 1em; font-weight: normal;}
Al aplicar esto a nuestra web, definimos el tipo de letra base a 10 píxeles y el
tamaño de los titulares de primer orden a 1em que, como hemos dicho, equivale
aproximadamente al tamaño de la letra base, es decir, que no habría diferencia
entre los titulares de primer orden y el texto normal. Otro ejemplo:
body { font-size: 12px; }
strong { font-size: 1.2em;}
Con esto, todas las negritas serían, aproximadamente, un 20% más grandes sobre
el tamaño del texto en el que se colocan.
Porcentajes
El porcentaje es otra forma de expresar una medida usada ampliamente en CSS
que, además, también se considera una unidad relativa. Se pueden usar para
expresar el tamaño de una fuente:
p {font-size: medium;}
p.grande {font-size: 200%;}
Cuando aplicamos un porcentaje como una unidad de medida general, este se
refiere al espacio que el objeto debería de ocupar. Por ejemplo, una linea
horizontal ocupa normalmente el ancho de la pantalla completa. Si aplicamos la
siguiente regla CSS ocupará solamente la mitad:
hr {width: 50%;}
La W3C recomienda encarecidamente usar píxeles y porcentajes como unidades
de medida para especificar el tamaño de los diferentes objetos y em como
unidad para especificar el tamaño de las fuentes. Cuando se prepara un
documento HTML cuya finalidad es tener salida impresa en papel y no en un
dispositivo óptico, es mejor el uso de puntos y picas.
4.1. MÁS PROPIEDADES PARA EL TEXTO
Veremos a continuación algunas propiedades aplicables al texto de nuestros
documentos que aún no conocemos.
La propiedad lineheight ajusta el interlineado del texto. El valor normal es el que
debería de tener por defecto. Podemos variar este poniendo un porcentaje, un
número o una medida en valor absoluto o relativo. Las siguientes reglas CSS serían
prácticamente equivalentes:
p { line-height: 1.5;}
p { line-height: 1.5em;}
p { line-height: 150%;}
Como observamos, texto e imagen se alinean por la base que es el valor por
defecto. Sería equivalente a usar el valor baseline para esta propiedad. Creemos
ahora la siguientes reglas CSS:
img {border:1px solid; vertical-align: text-bottom;}
La diferencia entre el valor textbottom y baseline es prácticamente inapreciable:
apenas veremos que la línea de texto asciende un poco. El primero alinea la
parte inferior de la imagen con la parte más baja de las letras, mientras que
baseline realiza la alineación con la línea base de escritura de estas. middle es
uno de los valores más corrientes y alinea el centro de la imagen con el centro de
la línea de texto, mientras que texttop alinearía la parte superior de ambos
elementos. top y bottom son dos atributos similares a, respectivamente, texttop y
textbottom pero más orientados a cuando queremos alinear diversas imágenes
de diferentes alturas. sub y super son dos valores raramente usados. Alínearian la
base de la imagen con la línea base de los subíndices o de los superíndices del
texto, respectivamente. Por último, podemos poner una medida o un porcentaje.
La medida puede ser positiva o negativa y representa la distancia desde la base
de la imagen con la base de la línea de texto (medidas negativas harían
descender la línea de texto). El porcentaje tiene el mismo efecto
correspondiendo el 100% con el alto de la línea de texto . Con una tipografía de
12 puntos, un desplazamiento de 100% o de 12pt debería de ser prácticamente
equivalente.
La propiedad textdecoration permite los valores none (por defecto), underline,
overline, line-through o blink.
La propiedad texttransform admite los valores none (por defecto), capitalize,
uppercase y lowercase.
4.2. APLICAR ESTILOS A LAS LISTAS
Los estilos se aplican a las listas mediante tres propiedades: liststyletype, list
styleimage y liststyleposition.
liststyletype define el tipo de “encabezado” de cada uno de los items de la lista.
circle, disc, square o none son algunos de los más usados, pero también existen
otros muchos que puedes consultar aquí:
http://www.w3schools.com/cssref/pr_liststyletype.asp
liststyleimage nos permite usar una imagen de nuestra elección como
encabezado de cada item en lugar de uno de los predefinidos con la propiedad
anterior. Como siempre en estos casos hay que especificar la URL de acceso a la
imagen. Si se especifica junto con liststyletype, esta segunda sólo se tendrá en
cuenta si la imagen que especificamos no es accesible.
liststyleposition es una de esas propiedades de “ajuste fino” del formato y se usa
para especificiar si el marcador de principio del item debería de aparecer dentro
(inside) o fuera a la izquierda (outside) de la caja en la que debería de aparecer
cada item de la lista. El valor por defecto es outside.
Existe una propiedad abreviada llamada liststyle que permite definir a las tres
anteriores en una sóla regla. Las siguientes declaraciones, por tanto, serían
equivalentes:
Existen muchas otras propiedades CSS que admiten reglas abreviadas que
engloban a varias otras relacionadas. Algunas las iremos viendo más adelante y
otras son fáciles de identificar en los ejemplos.
4.3. DOS NUEVAS ETIQUETAS HTML: div y span
div y span son dos nuevas etiquetas HTML cuyo objetivo es no hacer nada por
defecto. Puedes hacer la prueba de colocarlas en un documento HTML y podrás
comprobarlo por ti mismo. El objeto de ambas es dar estructura a nuestro
documento. Se usan conjuntamente con las hojas de estilo y, particularmente,
con los selectores de clase e ID.
div es una etiqueta de bloque ideada para estructurar de forma lógica nuestra
página. Sería similar a un párrafo pero, mucho más flexible y, además, por
defecto no conlleva la aplicación de ningún estilo.
La etiqueta span es muy similar pero se trata de una etiqueta de línea y se usa
para agrupar elementos a los que aplicar estilos diferenciados.
Veamos el body del siguiente HTML:
<body>
<div class="verde">
<h1><a id="INICIO">Titular de la <strong>pagina</strong></a></h1>
<p>Si meliora dies... bra, bra...</p>
<hr />
<p>Otro párrafo... bra, bra, bra...</p>
</div>
<p>Este bloque ya está fuera del efecto del anterior bloque div y, por
tanto, su fondo será blanco.</p>
</body>
Y lo acompañamos de esta regla CSS:
.verde { background-color: green;}
tamaño, la primera letra del primer párrafo de un libro de cuentos que queremos
publicar en la web. Usaremos para ello una fuente de Google Fonts, así que
incluimos esto en el head de nuestro HTML:
<link href='http://fonts.googleapis.com/css?family=Rock+Salt'
rel='stylesheet' type='text/css'>
Luego, en nuestras hojas de estilo, definimos lo siguiente:
.primeraletra {font-family: 'Rock Salt', cursive; font-size: 500%; font-
weight: bolder; }
Y los párrafos de nuestra web irían así:
<p><span class="primeraletra">S</span>i meliora dies, ut vina</p>
<p><span class="primeraletra">V</span>Veteresne poetas, an quos et
praesens et postera respuat aetas?</p>
(NOTA: Más adelante veremos que existe otra forma más profesional de hacer
esto mismo mediante los pseudoelementos).
4.4. HERENCIA
Podemos expresar cualquier documento HTML mediante una estructura en forma
de árbol. Por ejemplo, tengamos el siguiente HTML sencillo (en el que,
intencionadamente, hemos suprimido algunas de las etiquetas y atributos para
simplificarlo):
<html>
<head>
<title>Mi web</title>
</head>
<body>
<h1>La web del profe de Lenguaje de Marcas</h1>
<p>José María Morales es el <strong>profesor</strong> de este año
de la asignatura y, entre otras cosas, vamos a ver con él:</p>
<ul>
<li>HTML y <em>XHTML</em></li>
<li>CSS</li>
<li>XML</li>
</ul>
</body>
</html>
Podríamos ver la estructura de nuestro documento HTML esquematizada como el
siguiente árbol:
Pues bien, la herencia de CSS hace que las propiedades de los diferentes
elementos se traslade siempre hacia abajo a través del árbol salvo que dichas
propiedades sean reescritas, bien por los estilos por defecto, bien por una regla
apropiada que hayamos introducido nosotros.
Por ejemplo, el elemento con la etiqueta strong aparecerá en negrita, no porque
nosotros lo hayamos especificado así, sino porque así está definido por defecto y
aunque definamos la propiedad fontweight: normal para el selector body
seguirán siendo negritas.
Sin embargo, si definimos la propiedad color: orange; y backgroundcolor: black
en el selector body, todo aparecerá con fondo negro y letras naranjas.
Si nuestra página web sencilla llevara un enlace (etiqueta a) el fondo si
aparecería negro, pero el color sería azul porque esa etiqueta si tiene la
propiedad color sobreescrita.
En definitiva: las propiedades de estilo se heredan siempre hacía abajo en el árbol
salvo que dicha propiedad sea rescrita, bien esplicitamente, bien con una regla
por defecto.
4.5. ESPECIFICIDAD
A nadie se le escapa a estas alturas que a medida que vayamos haciendo más
complejas nuestras hojas de estilo, más dificil será saber en algunas ocasiones que
regla prevalecerá sobre otra. Ya hemos dicho que, en igualdad de condiciones
(por ejemplo, dos reglas que hacen referencia a estilos contradictorios para la
etiqueta p), se le dará preferencia a la que está más cercana al contenido si las
reglas se encuentran en diferentes sitios (las más prioritarias serían las consignadas
a través del atributo style en el propio HTML, las siguientes las que escribimos
directamente en la sección head del mismo y, por último, aquellas que van en un
fichero externo). Ante dos reglas que estén en el mismo sitio (por ejemplo, ambas
en dos líneas diferentes de un mismo archivo externo CSS) se le dará preferencia
a la que esté escrita en último lugar.
Estas reglas nos ayudan a solucionar los casos más simples de conflicto pero, ¿que
ocurre cuando el problema lo plantean dos reglas totalmente diferentes que se
deberían de aplicar al mismo elemento? Para eso surge lo que llamamos
especificidad.
Imaginemos que nuestro CSS tiene las siguientes reglas:
ul ol li.alerta {color: red; }
.alerta{color: blue;}
li.alerta{color: yellow; background-color: yellow;}
ul .alerta{color: green;}
Y en nuestro HTML aparece algo como esto:
<ul>
<li>Uno
<ol>
<li>Dos</li>
<li class=”alerta”>TRES</li>
</ol>
</li>
<li>Cuatro</li>
</ul>
prevalece la regla escrita en última posición.
EJEMPLOS: entre una regla con valor 0,0,1,0 y otra con valor 0,0,0,13 prevalece la
primera y entre una regla con valor 0,1,3,1 y otra con valor 0,1,3,2 prevalecería la
segunda.
¿Cómo se calculan estos números? El primero es fácil y se usa cuando el estilo se
aplica en el propio HTML mediante el atributo style. Este número sólo puede valer
0 o 1 (puesto que no podemos duplicar atributos en una misma etiqueta) y tiene
siempre la máxima prioridad. Los otros tres se calculan sumando 1 según los tipos
de selectores que aparezcan en la regla:
El segundo número se calcula sumando uno por cada selector de id que
aparezca en la regla
El tercer número se calcula sumando 1 por cada selector de clase, selector
de atributo o pseudoclase que aparezca en la regla (los dos últimos los
veremos en el capítulo sobre CSS avanzado)
El cuarto número, el de menor prevalencia, se calcula sumando 1 por cada
selector de etiqueta o pseudoelemento (este último lo veremos también en
CSS avanzado) que aparezca en la regla.
Así, si calculamos la especificidad de las cuatro reglas anteriores:
ul ol li#alerta {color: red; } /* 0,1,0,3 */
.alerta{color: blue;} /* 0,0,1,0 */
li.alerta{color: yellow; background-color: yellow;} /* 0,0,1,1 */
ul .alerta{color: green;} /* 0,0,1,1 */
Lo que nos confirma que, efectivamente, el color del texto debería de salir rojo
independientemente del orden en que se situen las reglas. Si eliminamos esa
regla, el texto saldrá en verde, pero puesto que hay un empate entre esta regla y
la que dicta que debería de salir amarillo y prevalece la escrita en último lugar.
Los selectores de hijos y hermanos (también los veremos más adelante) no
aportan una mayor especificidad a las reglas.
La clausula !important
La clausula !important se puede aplicar a cualquier regla aumentando así su nivel
de prioridad de forma que prevalezca sobre definiciones posteriores del mismo
selector e, incluso, sobre las valoraciones de especificidad. Ante las siguientes
reglas, un texto etiquetado como strong, dentro de un párrafo (selector
descendiente) y con el id minegrilla aparecería con color rojo:
strong {color: red !important;}
p strong#minegrilla {color: blue; }
5. EL MODELO DE CAJAS
El modelo de cajas se trata, posiblemente, del concepto más importante
relacionado con las hojas de estilo CSS. Como ya hemos dicho antes, todo en
HTML está formado por cajas rectangulares que contienen a los diferentes
elementos. Mediante las reglas que veremos a continuación podremos cambiar
el aspecto y comportamiento de las mismas.
5.1. EL CONCEPTO DE CAJA
HTML y CSS definen una caja como una zona rectangular constituida por los
siguientes elementos:
Y aquí, una nota por si alguien aún no se ha dado cuenta de la importancia del
DOCTYPE: El internet explorer ha considerado durante mucho tiempo que el
borde interior y los márgenes forman parte del contenido pese a que la
especificiación de la W3C jamás ha dicho esto. Aún con Explorer 9, si nuestro
HTML no especifica un DOCTYPE, nos visualizará la página en modo de
compatibilidad (quirk mode) y nos dibujará una caja con un tamaño de 250
píxeles, de forma que el contenido útil será de sólo 150 píxeles.
div es la caja más versatil
Aunque muchos elementos de bloque de HTML son susceptibles de ser usados
como cajas, la que por regla general usaremos como tal es la etiqueta div. Es la
más versatil ya que no tiene estilos propios salvo los que definamos nosotros.
5.2. PROPIEDADES DE LA CAJA
Las dimensiones del contenido
Las dimensiones del contenido de la caja se delimitan con las propiedades width
y height. Ambas puede tener por valor un porcentaje, una medida o la palabra
auto que haría que su tamaño se ajustara lo mejor posible al contenido real de la
misma. Los valores por defecto de estas dos propiedades son width: 100% y
height: auto;
Cuando llevan un porcentaje, este se aplica sobre el tamaño de la caja dentro
de la que, a su vez, se encuentran (su elemento padre o contenedor). Por
ejemplo, si una caja tiene por ancho el 50% y no está dentro de ninguna otra, esto
se aplica sobre el tamaño total de la superficie útil del navegador. Si dentro de
esta metemos otra también con un ancho del 50%, tendrá un ancho de la mitad
de la caja donde se encuentra, es decir, un 25% de la superficie útil del
navegador. Cambiemos el ancho de la regla .ejemplo vista antes por 50% y
pongamos esto en nuestro HTML:
<div class="ejemplo">Hola caja 1
<p class="ejemplo">Hola caja 2</div>
</div>
Márgenes interior y exterior
Alternativamente tenemos las propiedades maxheight, minheight, maxwidth y
minwidth para fijar las dimensiones máximas y mínimas. En este caso no podemos
usar la palabra auto sino sólo porcentajes o medidas concretas.
Los márgenes interiores y exteriores se controlan con las propiedades padding y
marging respectivamente y tenemos varias posibilidades. Podemos poner auto
(para dejarlo al arbitrio de lo predefinido por el navegador), un valor exacto o un
porcentaje que estaría referido al tamaño del elemento padre. Además, también
podemos especificar un margen igual para cada una de las cuatro dimensiones
de la caja o especificar que valor concreto queremos para ellas. Las propiedades
/* los cuatro en el sentido de las agujas del reloj: 20px superior, 10px
derecho, 30px inferior y 10px izquierdo */
margin: 20px 10px 30px 10px;
Un truco habitual para mostrar una caja centrada con respecto al elemento
donde está contenida es hacer que los márgenes a izquierda y derecha sean
iguales y calcular el tamaño exacto que deben tener. Esto es relativamente fácil
cuando trabajamos únicamente con porcentajes, pero no siempre es posible. El
navegador lo hará solo estableciendo los márgenes laterales a auto.
Existe una peculiaridad con respecto a los márgenes exteriores de las cajas. Así
como los márgenes derecho e izquierdo de cajas contiguas se suman, los superior
e inferior de cajas adyacentes se solapan. Imaginemos, por ejemplo, dos cajas
con margen exterior de 20 píxeles en cada una de sus cuatro dimensiones. Si las
situamos una junto a otra tendremos 40 píxeles de separación pero si ponemos
una encima de la otra sólo estarán separadas por 20 píxeles.
Para la propiedad padding la sintaxis es similar. Además, el margen exterior
permite valores negativos (¡experimenta con los resultados!) mientras que el
interior traducirá un valor negativo por cero.
Y un último detalle: el body de un documento HTML es también una caja y puede
tener predefinidos valores para el margin y el padding de forma que nos quede
un pequeño borde sin usar en la superficie del navegador. Si no queremos que
esto sea así podemos usar esta regla:
body {margin: 0px; padding: 0px; }
El borde de la caja
El borde de la caja se define mediante tres propiedades: color, grosor y estilo:
bordercolor, borderwidth y borderstyle, aunque luego veremos que tenemos
más posibilidades tanto para simplificar la definición como para particularizarla
con mucho más detalle como hemos hecho con los márgenes.
La forma abreviada de especificar las características del borde de la caja es esta:
border: red double 5px;
Donde el primer parámetro es el color (de cualquiera de las formas que hemos
aprendido a definirlo), el segundo el estilo (siendo válidos los valores solid, dashed,
dotted, double, groove, ridge, inset, outset, hidden o none) y el tercero es el
ancho del borde que puede ser un valor de longitud (nunca un porcentaje) o las
palabras clave thin, medium o thick.
Este formato abreviado sólo es válido cuando las cuatro dimensiones del borde
son iguales. Los parámetros pueden ir en cualquier orden pero deberían de ir los
tres (aunque la mayoría de los navegadores nos admitirían uno o dos solamente).
Los valores por defecto si prescindimos de alguno son black para el color,
medium para el grosor y none para el estilo.
La diferencia entre none y hidden es que aunque en ninguno de los casos el
borde es visible, en el segundo influye respecto al lugar donde se dibujaría un
elemento adyacente mientras que el primero se considera con un ancho de 0px.
Podemos especificar cada una de estas tres propiedades por separado con los
atributos bordercolor, borderstyle y borderwidth. Asimismo, podemos cambiar
los valores de cada una de las cuatro dimensiones en cada uno de ellos usando
atributos específicos (bordertopcolor, borderbottomcolor, borderleftcolor y
borderrightcolor, por ejemplo) o con una lista de dos, tres o cuatro valores sobre
el atributo principal igual que hemos hecho con los márgenes:
/* 5px para superior e inferior y 50px para derecho e izquierdo */
border-width: 5px 50px;
/* los cuatro en el sentido de las agujas del reloj: red superior, blue
derecho, gree inferior y purple izquierdo */
border-color: red blue green purple;
UNA NOTA MUY IMPORTANTE: todos estos elementos son válidos para cualquier
selector que apliquemos tanto a un elemento de línea como de bloque aunque,
tienen mucho más sentido (sobre todo algunos de ellos) sobre uno de bloque.
Existe otra propiedad llamada outline mucho menos flexible para aplicar bordes a
las cajas.
outline: 3px solid black;
outline no “roba” espacio a las dimensiones de la caja y, por tanto, no afecta a
las dimensiones de esta. Es, por decirlo de alguna forma, como si usáramos un
borde exterior al borde de la caja. Por contra es mucho menos flexible que border
y, por ejemplo, no podemos especificar propiedades diferentes a sus diferentes
segmentos.
Imágenes de fondo en las cajas y sus propiedades
Nuestras cajas no sólo pueden tener un color de fondo: también pueden tener
una imagen. La sintaxis de la propiedad es la siguiente:
background-image: url(http://cort.as/1KYH);
Si la imagen está en el propio directorio donde se encuentra la imagen y, por
ejemplo, se llama burbujas.jpg sería así: url(burbujas.jpg). Al igual que ocurría con
el valor del atributo src de la etiqueta img, si la imagen se encuentra en el propio
servidor pero en otro directorio diferente podríamos especificar una ruta absoluta,
relativa, etc.
Por defecto la imagen se coloca en formato de mosaico. Podemos controlar este
valor mediante la propiedad backgroundrepeat cuyos posibles valores son
repeat, repeatx, repeaty o norepeat. El valor por defecto es repeat.
Mediante la propiedad backgroundposition podemos dar posición a nuestra
imagen de fondo, tanto si estamos usando norepeat, como si lo estamos
haciendo (en cuyo caso posicionaría una de las imagenes y crearía el mosaico a
partir de esta.) Tenemos tres posibilidades:
/* Posiciona la esquina superior izquierda de la imagen en la caja. Está
permitido el uso de valores negativos */
background-position: 50px 100px;
Podríamos sustituirlas por esta otra:
background: url(gotas.gif) blue repeat-x top center fixed;
El orden de los valores es indiferente y si omitimos alguno de ellos el navegador lo
completará con la opción que tenga definida por defecto.
Cajas y jerarquía de elementos
Observa la forma en que aparece este código HTML en tu navegador usando la
regla CSS correspondiente a la clase .ejemplo vista anteriormente:
<h1 class="ejemplo">Hola Mundo</h1>
<div class="ejemplo">Soy la caja número 1
<div class="ejemplo">Soy la caja número 2</div>
</div>
<p>Hola <strong>mundo</strong> de las cajas. Esto es una prueba.</p>
5.3. POSICIONANDO LAS CAJAS (Y OTROS ELEMENTOS)
Hasta ahora no nos hemos preocupado de controlar la posición de los elementos
que colocamos en nuestro HTML y dejamos que estos se vayan situando uno
debajo o al lado del anterior y que sea el navegador el que lo disponga. Esto se
debe a que, por defecto, usamos un modo de posicionamiento que se denomina
estático (static). La propiedad CSS que lo controla se llama position.
Aparte de static, esta propiedad dispone de tres posibles valores más: relative,
absolute y fixed.
Si usamos el valor relative, la posición se indica respecto a la que debería de
tener de forma normal dicho elemento. Se hace mediante las propiedades top,
bottom, left y rigth. left y top, las más usadas, aplican un desplazamiento medido
desde la esquina superior izquierda del elemento pudiendo ser este negativo si se
expresa mediante un valor mientras que bottom y right miden ese desplazamiento
desde la esquina inferior derecha del elemento. Lógicamente, no tiene mucho
sentido usar conjuntamente top y bottom o left y right. Se pueden usar porcentajes
siendo estos relativos al tamaño del elemento padre al que pertenecen.
div.caja1 {position: relative; left: 10%; top -20px;}
div.caja2 {position: relative;right: -40px; bottom: 40px;}
div#top{width: 100%;
background-color: green;
text-align: center;
color: white;
font-weight: bold;
font-size: 3em;
font-family: Verdana, Helvetica, Arial, Sans; }
div#izquierda{width: 80%;
height: 50%;
background-color: aqua;
float: left;}
div.caja{width:90%;
margin-left:5%;
margin-top:10px;
background-color: red;}
div#derecha{width: 20%;
height: 50%;
background-color: teal;
float: right; }
div#pie{width: 100%;
background-color: orange;
font-size: .8em;
text-align: right;
font-family: Courier, Monoespace;}
Y ahora pondremos esto en el body de nuestro HTML:
<div id="contenedor">
<div id="top">Cabecera de la página</div>
<div id="izquierda">
<div class="caja">Caja 1<br/> En un lugar de la mancha de
cuyo
nombre no quiero acordarme no hace mucho que vivía un
hidalgo... </div>
<div class="caja">Caja 2</div>
<div class="caja">Caja 3</div>
</div>
<div id="derecha">Esto está en la columna de la derecha</div>
<div id="pie">Todos los derechos reservados</div>
</div>
Observamos que las cajas que usan el selector de id derecha e izquierda se
posicionan, respectivamente, a derecha e izquierda de la superficie útil de su
elemento padre, que aquí marcamos como contenedor. El resultado ya empieza
a parecerse a una web actual, pero aún nos queda mucho trabajo para que
pueda considerase aceptable desde el punto de vista estético. Observa también
que puesto que hemos usado porcentajes en las dimensiones clave de las reglas,
la página se redimensiona cuando cambiamos la superficie útil de nuestro
navegador. Y una última cosa: para que te des cuenta de lo importante de las
medidas en CSS, trata de modificar con una cantidad irrisoria el ancho de la caja
izquierda (pon, por ejemplo, 80.005%) o introduce un pequeño padding en las
reglas correspondientes al estilo del selector id izquierda y verás como se
descuadra todo el conjunto.
float es un parámetro que se usa no sólo para posicionar cajas sino, por ejemplo,
para posicionar una imagen dentro de un párrafo. La regla CSS:
.aderecha {float: right; }
Y el HTML:
<img class="aderecha" src="cup.png" alt="copa" />
<p> Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed non
risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec,
ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa,
varius a, semper congue, euismod non, mi.</p>
Por lógica, se trata de un atributo que no tiene ningún efecto cuando estamos
usando posicionamiento absolute o fixed.
La propiedad clear nos permite anular los efectos de la propiedad float. Tiene
cuatro valores posibles: none (por defecto), right, left o both. Los dos primeros
anularían un float right o left, respectivamente. El valor both los anularía a ambos.
Para ver el efecto, añadamos la siguiente regla a nuestro CSS anterior:
.sinfloat {clear: right;}
Y ahora añadamos al final del HTML este nuevo párrafo:
<p class="sinfloat"> Lorem ipsum dolor sit amet, consectetuer adipiscing
elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet,
adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam.
Maecenas ligula massa, varius a, semper congue, euismod non, mi.</p>
Como podemos ver, el nuevo párrafo salta a la parte inferior de la imagen como
se habría comportado si esta no tuviera el atributo float mientras que el párrafo
anterior sigue ateniéndose a su existencia.
Introduciendo la tercera dimensión en el documento
La propiedad zindex nos permitirá estructurar en tres dimensiones los elementos
de nuestro documento HTML. Por defecto los elementos aparecen estratificados
según su aparición en el documento, de forma que un elemento aparece
siempre sobre todos los anteriores a él. La propiedad zindex nos permite alterar
este orden indicando un número entero, positivo o negativo, que indica el nivel o
la capa en la que situamos el elemento. Un ejemplo. Primero veamos las reglas
CSS:
.caja1 { position: relative;
background-color: yellow;
border: 5px solid blue;
z-index: 2; }
Y luego este fragmento de HTML:
<p class="caja1">Hola caja 1!</p>
<p class="caja2">Hola caja 2</p>
<p class="caja3">Hola caja 3</p>
Si prescindimos de la propiedad zindex, la caja 3 solapará a la 2 y esta a la 1.
Con la propiedad zindex la caja 3 será la que vaya al fondo mientras que la 1 se
encontrará en primer plano. Por defecto el valor de zindex es auto y el índice de
capa base se asigna al 0. Por convención se suele usar el 1 como la capa de
fondo y el 999 como la capa que queremos en primer plano, pero en realidad
como hemos dicho, la propiedad admite cualquier valor entero negativo o
positivo. Entenderás, además, que esta propiedad no tiene ningún efecto ante
elementos que no se solapan.
Por último, como ves en la caja 1 se ha establecido la propiedad position como
relative aunque no se efectua ningún desplazamiento sobre su posición normal.
Esto es porque la propiedad zindex sólo tiene efecto sobre elementos en los que
se han modificado las propiedades position o float.
Visibilidad, desbordamientos y recortes
La propiedad visibility, como su nombre indica, permite ocultar un elemento sin
que este deje de ocupar su espacio en la página. Tiene dos posibles valores:
visible o hidden y son autoexplicativos. Insisto: el elemento no se ve pero está ahí
y si entramos en la opción de ver código del navegador (habitualmente Ctrl+U)
podremos verlo, ¡así que cuidado con donde y para qué lo usamos!
La propiedad overflow le dice al navegador lo que tiene que hacer cuando un
elemento no cabe completamente dentro de la caja o elemento que lo
contiene. Su valor por defecto es auto y deja esta gestión al navegador. Otras
posibilidades son hidden (corta y oculta lo que no cabe), scroll (coloca unas
barras de desplazamiento para poder ver lo que no cabe) o visible (lo que no
cabe desborda a su contenedor y se muestra en la página). Un pequeño código
CSS para verlo:
.caja { width: 200px;
padding: 5px;
height: 100px;
border: 1px dashed black;
overflow: hidden;}
Y este sería el HTML de prueba:
<div class="caja">
<p> Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed
non risus. Suspendisse lectus tortor, dignissim sit amet,
adipiscing nec, ultricies sed, dolor.</p>
</div>
Esto dejaría visible un rectángulo que, respecto al elemento en el que se aplique,
empieza a 0px de la parte superior, llega hasta los 200px hacía la derecha, 100px
hacia abajo y 0px desde la izquierda (o sea, cuatro coordenadas en el sentido de
las agujas del reloj empezando desde arriba, como siempre)
Puedes ver un ejemplo completo con esta regla CSS:
.caja { width: 25%;
padding: 5px;
position: absolute;
border: 1px dashed black;
clip: rect(0 200px 100px 0);}
Y este código HTML que la usa:
<div class="caja">
<p> Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed
non risus. Suspendisse lectus tortor, dignissim sit amet,
adipiscing nec, ultricies sed, dolor.</p>
</div>
Y la misma advertencia de siempre: recuerda que la parte que no es visible se
puede ver con la opción de Ver código del navegador!
5.4. OTRAS PROPIEDADES
Cambiar el aspecto del puntero del ratón
Podemos cambiar el aspecto del cursor cuando pasamos sobre un elemento con
la propiedad cursor. Los valores posibles y su apariencia son:
• auto. El navegador determina por sí mismo el cursor según el contexto.
• crosshair. El cursor muestra una cruz.
• default. El cursor por defecto del sistema operativo, a menudo una flecha.
• eresize. Cursor apuntando hacia el este.
• neresize. Cursor apuntando hacia el noreste.
• nwresize. Cursor apuntando hacia el noroeste.
• nresize. Cursor apuntando hacia el norte.
• seresize. Cursor apuntando hacia el sureste.
• swresize. Cursor apuntando hacia el suroeste.
• sresize. Cursor apuntando hacia el sur.
• wresize. Cursor apuntando hacia el oeste.
• help. El cursor indica una ayuda. A menudo se muestra un signo de
interrogación.
• move. El cursor indica un objeto que se puede desplazar.
• pointer. El cursor presenta un dedo que indica un enlace.
• progress. El cursor muestra una flecha con un reloj de arena.
• text. El cursor indica que es posible seleccionar el texto.
• wait. El cursor indica una progresión. A menudo se muestra un reloj de
arena.
• url. Especifica un archivo donde se encuentra la imagen que se desea usar
como cursor. El archivo de imagen especificado en la URL debe tener el
formato cur (cursor) o ani (cursor animado).
Un ejemplo:
.caja { width: 50%;
padding: 5px;
border: 1px dashed black;
cursor: crosshair;}
Alterando si un elemento es de bloque o de línea
La propiedad display nos permite redefinir el caracter de un elemento como de
bloque o de línea. block, inline o none. son los valores más usados. Los dos
primeros son autoexplicativos. El tercero hace que el elemento no se muestre
pero, al contrario de lo que ocurría con la propiedad visibility y el valor hidden,
ahora el espacio que ocuparía el elemento no se reserva. Este, sin embargo, sigue
visible al dar a la opción de ver código.
Una utilidad habitual de esta propiedad es mostrar uno al lado del otro los
elementos de una lista para, por ejemplo, construir un menú (ampliaremos este
uso en un capítulo posterior):
li{ display: inline;
list-style-type: none; }
En realidad la propiedad display es mucho más compleja y tiene otras opciones
disponibles, pero no vamos a detenernos a verla. Existe una buena referencia
acerca de ella aquí:
http://www.librosweb.es/referencia/css/display.html
Modificando el aspecto de los bordes de las celdas de una tabla
Las propiedades bordercollapse y borderspacing controlan la forma en que
vemos los bordes de una tabla. La primera tiene dos posibles valores: collapse y
separate. En el primer caso los bordes adyacentes se unirán en uno sólo siempre
que sea posible mientras que con el segundo valor la separación entre bordes se
controlará mediante la propiedad borderspacing. El valor por defecto es
separate.
borderspacing indica el espacio que habrá entre los bordes de celdas
adyacentes, por ejemplo:
border-spacing: 2px 0;
Si se indican dos valores el primero hace referencia a la separación horizontal y el
segundo a la vertical. En el caso de indicar un sólo valor se aplica a ambas
distancias
Por último, la propiedad emptycells tiene dos posibles valores (show o hide)
controla que se vean o no los bordes y fondo de las celdas vacías de una tabla. El
valor por defecto es show.
6. SELECTORES AVANZADOS
Aunque hemos dicho que prácticamente cualquier página web puede hacerse
con los cinco selectores básicos que ya conocemos, existen algunos que se
llaman avanzados que nos van a permitir, bien simplificar algunas tareas de
aplicación de estilos o bien permitirnos algunos efectos imposibles de conseguir
de ninguna otra forma como es el caso de la utilidad proporcionada por alguna
de las pseudoclases. Los presentaremos en las siguientes páginas.
Selector de hijos
El selector de hijos es muy similar al selector descendiente pero es mucho más
específico. Cuando uso un selector descendiente, por ejemplo p .destacado sólo
me importa que el elemento perteneciente a la clase destacado se encuentre
dentro del elemento p, sin importarme cuan “profundo” se encuentre dentro del
árbol jerárquico de etiquetas del documento. Si uso el selector de hijo es porque
quiero que el elemento con la clase destacado sea hijo directo del elemento p y
no un descendiente cualquiera. Y se simboliza así:
p > .destacado {color: purple; }
Selector de hermanos adyacentes (o adyacente, sin más)
El selector de hermanos es aquel que nos permite seleccionar elementos que
comparten el mismo padre y están adyacentes uno al otro. En el siguiente grafico
podemos ver destacados los hermanos de un HTML sencillo ya visto en otros
ejemplos:
Para aplicar un determinado estilo al primer párrafo después de un titular de nivel
1, usaríamos la siguiente sintaxis:
h1 + p {text-indent: 2.5em; }
El selector de hermanos es una forma muy útil de crear estilos para ciertas
combinaciones de elementos muy utilizados: el primer párrafo de un capítulo, el
primer párrafo posterior a una tabla, etc. También es útil para seleccionar todos
los elementos menos el primero en una secuencia determinada. Por ejemplo:
p + p { text-indent: 1.5em; }
Selector de atributos
Los selectores de atributos nos permiten aplicar estilos a determinados elementos
en función de los atributos que acompañen a la etiqueta HTML o de los valores
que tengan dichos atributos. Si nos paramos a pensar, en realidad los selectores
de clase o de ID son una especie de selectores de atributo porque aplican estilos
en función del valor de un atributo (class o ID, respectivamente), así que no
vamos a ver nada demasiado nuevo en este apartado.
Existen cuatro tipos diferentes de selectores de atributo. Los primeros seleccionan
los elementos en función de un determinado atributo independientemente de su
valor:
td[rowspan] {background-color: black; color: white; }
Los segundos seleccionan un elemento en función de un atributo con un valor
determinado:
a[href="http://www.google.es/"] {color: red; text-weight: bold; }
La tercera clase de selectores de atributos realiza su selección en función del
atributo y de la existencia de un determinado valor pero que no tiene porqué ser
unico, sino simplemente aparecer en una lista separada por espacios:
div[class~=”alerta”] {color: red;}
Podemos correr el riesgo de pensar que simplemente es una forma de hacer más
complicado lo que ya sabemos hacer con otros selectores más simples. Por
ejemplo, estas definiciones son casi idénticas:
div.alerta {color: red;}
div[class=”alerta”] {color: red;}
div[class~=”alerta”] {color: red;}
Pero también podemos pensar en otras posibilidades más interesantes:
img[alt~=”ilustración”] {border: 2px solid;}
table[summary~=”2010”] {background-color: green;}
*[title~=”importante”] {color: red; cursor: crosshair; }
El cuarto tipo de selector de atributo apenas tiene utilidad. Permite seleccionar
elementos con cierto atributo y que incluyen un determinado valor como el
primer elemento de una lista separada por guiones.
*[lang|="es"] { color: blue; }
El anterior ejemplo seleccionaría a todos los elementos con un atributo lang que
empiece por es (por ejemplo esES, esMX, esAR, etc.) De hecho esta es su
principal (y casi única) utilidad: la selección de elementos según los códigos
estándares de idiomas.
6.1. PSEUDOCLASES Y PSEUDOELEMENTOS.
Existen ciertos estados o características de nuestro documento HTML a los que es
útil y apropiado aplicarle un estilo diferenciado: un enlace ya visitado, la primera
letra de un párrafo, etc. Esto se consigue mediante las pseudoclases. Para
identificar que hablamos de una pseudoclase en una regla CSS usamos los dos
puntos como signo diferenciador y estas pueden aplicarse sobre selectores de
tipo, de clase, etc. Veremos ejemplos enseguida.
Y una nota: en algunos textos se hace una separación entre pseudoclases y
pseudoelementos mientras que en otras se engloban todas bajo la misma
categoría. Aquí haremos la diferenciación clásica porque, si bien no existen
grandes diferencias, si que es necesario hacer la distinción a la hora de calcular la
especificidad de las reglas CSS.
Pseudoclases
Las pseudoclases son aquellas que se aplican fundamentalmente sobre los
selectores de enlace (aunque alguna de ellas pude aplicarse también sobre otros
elementos). Se trata de :link, :visited, :hover, :active y :focus.
La pseudoclase :link hace referencia a un enlace que aún no ha sido visitado,
mientras que :visited hace referencia a lo opuesto, es decir, los enlaces que ya
han sido visitados por el usuario. Dos ejemplos:
a:link {color: green; background-color: yellow;}
a:visited {color: yellow; background-color: green; }
La pseudoclase :hover nos dicta los estilos a aplicar al pasar el ratón por encima
del elemento al que el selector hace referencia. Se suele usar fundamentalmente
con enlaces pero es aplicable a cualquier otro elemento:
a:hover, p.destacado:hover{font-weight: bold; }
em:hover {color: blue;}
Por último, :focus es una regla que se aplica cuando el elemento tiene el “foco”,
es decir, cuando se activaría si pulsamos la tecla Intro. Para poder usarla
debemos de definir que elementos tienen el foco en nuestra página y el orden en
el que lo reciben (cada vez que pulsamos secuencialmente el tabulador). Esto se
hace mediante el atributo tabindex que podemos usar en las etiquetas a
(enlaces) de nuestra web posibilitando así la navegación sin necesidad de ratón.
Por ejemplo:
<p>Un enlace a <a href="http://www.google.es/" alt="Google"
tabindex="1">Google</a>, otro a <a href="http://www.bing.es" alt="Bing"
tabindex="2">Bing</a> y un tercero a <a href="http://www.yahoo.es"
alt="Yahoo" tabindex="3">Yahoo</a>.</p>
Y ahora ya si podemos ver los efectos de la pseudoclase :focus
a:focus {background-color: black; color: white; font-size: 1.8em;}
La primera selecciona y aplica estilo a un párrafo siempre y cuando sea el primer
hijo de su padre, mientras que la segunda hace lo mismo sobre las cursivas de ese
mismo tipo de párrafos.
Existe una última pseudoclase de aplicación muy limitada llamada :lang que nos
permite aplicar estilos diferenciados en función del idioma en que esté escrito el
elemento. Por ejemplo así:
p:lang(es) {color: red; }
Aunque tienen un uso muy similar al visto en uno de los selectores de atributo,
existe una ligera diferencia. El selector de atributo es aplicable sólo a los
contenidos que usen el atributo lang, mientras que esta pseudoclase sería
aplicable también en otras circunstancias, como por ejemplo si el propio
navegador fuese capaz de analizar el contenido y detectar elementos escritos en
diferentes idiomas (cosa que, por el momento, no hacen demasiado bien...).
Pseudoelementos
Los dos primeros pseudoelementos que veremos son aplicables a la decoración
Existen otros dos pseudoelementos llamados :before y :after que usados junto con
la propiedad content nos permiten insertar contenido (texto, imágenes, etc.)
antes o despues de un elemento.
p#insert1:after{ content: " (TM – Marca Registrada) ";}
p.insert2:before{ content: url(icon_new.gif);}
En los anteriores ejemplos, el primero inserta el texto que aparece entre comillas al
final de cada párrafo identificado con el selector de ID insert1, mientras que el
segundo inserta el gif animado icon_new.gif delante de cada párrafo
identificado como perteneciente a la clase insert2.
7. ALGUNOS DISEÑOS Y EFECTOS ÚTILES
Con HTML sólo pueden dibujarse cajas. Cajas y rectángulos absolutamente
cuadrados. Esto es verdad al 99.00% (sobre todo hasta la aparición de HTML5)
pero, sin embargo, no es eso lo que vemos en la web. Existen numerosos trucos y
efectos de diseño para “engañar” al espectador y darle la sensación de que está
viendo algo con un contenido mucho más elaborado de lo que en realidad tiene
delante. En este capítulo aprenderemos a dibujar cajas mucho mejores de las
que ya conocemos, pero también a decorarlas de forma que parezcan otras
muchas cosas. Nos apoyaremos para ello en la amplia colección de ejemplos
que acompañan al capítulo (y que, si aún no lo has hecho, puedes descargarte
desde http://blog.unlugarenelmundo.es/hechoencasa/) y desde aquí los iremos
analizando uno a uno e indicaremos cuales son las claves de diseño que usamos
en los mismos.
7.1. DISEÑOS DE ANCHO FIJO, LÍQUIDOS (O FLUIDOS) Y ELÁSTICOS
Las tres estrategias “puras” de afrontar un diseño web son: diseños de ancho fijo,
de ancho líquido (o fluido) o de ancho elástico.
Los diseños de ancho fijo configuran sus medidas mediante píxeles. Son fáciles de
realizar y no tenemos que hacer demasiadas pruebas ni ajustes para asegurarnos
que se verán bien. Puesto que ya casi no existen monitores con resolución inferior
a 800 píxeles de ancho se suele tomar como estándar un ancho de 760 o 780
píxeles para el contenido.
Los diseños de ancho líquido son aquellos que trabajan mediante porcentajes.
Aprovechan mucho mejor la superficie en las pantallas grandes pero nos exigen
más pruebas para asegurarnos de que todo se ve correctamente en resoluciones
bajas.
Los diseños elásticos son los más difíciles de implementar. Basan sus medidas en la
unidad em, de forma que si incrementamos el tamaño del texto, también
aumentamos proporcionalmente las dimensiones de nuestro diseño.
Nos encontraremos por ahí muchos modelos híbridos pero estos son los
fundamentales. Por ejemplo, se habla de un diseño híbrido líquidofijo cuando lo
fundamental del diseño es líquido pero existe en él algún elemento de ancho fijo.
Por ejemplo, podemos pensar en un diseño a dos columnas donde una de ellas es
de ancho fijo (para emplazar menús, publicidad, etc.) mientras que la otra,
destinada a los contenidos, tiene un diseño líquido.
Ejemplo 1 – Cajas
En el ejemplo número 1 nos encontramos cuatro diseños de cajas básicos donde
aprendemos a solventar diferentes problemas. Hasta ahora las cajas con las que
habíamos trabajado (en el capítulo 5 ) tenían el ancho, o bien fijo, o bien líquido y
el alto fijo. En el mundo real necesitamos diseñar cajas de alto variable en función
del contenido y partiendo de la premisa de que no conocemos el tamaño de ese
contenido.
Si metemos dos columnas dentro de una caja contenedora, que suele ser la
estrategia habítual, y no definimos alturas fijas las cajas desbordarán al
contenedor descuadrando el diseño. Tenemos varias formas de resolver esto:
Poner un pie al diseño. Este pié debería de llevar definida la propiedad
clear para “romper” el efecto de los float. Si no queremos tener pié o no lo
necesitamos podemos poner uno “invisible”.
#pie{
color: white;
width: 760px;
padding: 10px;
}
Una segunda solución es usar también la propiedad float en el contenedor.
#contenedor2 {
border: 2px dotted black;
margin: 5px auto;
width: 780px;
float: left;
}
Una tercera opción sería definir la propiedad overflow a auto o hidden en
la caja contenedora:
#contenedor {
border: 2px dotted black;
margin: 5px auto;
width: 780px;
overflow: auto;
}
Encontramos otro “problema” cuando queremos colocar tres o más columnas.
Hasta ahora sólo hemos usado dos y colocamos una a la derecha con float: right
y otra a la izquierda con float: left. En realidad, si ajustamos bien el espacio
podríamos haber usado dos veces uno u otro porque los float se “apilarían” en
horizontal llenando todo el espacio disponible. Esto nos da la idea de como
hacerlo con, por ejemplo, tres columnas: podemos “apilar” la central a la
derecha o a la izquierda pero, eso si, calculando siempre bien las dimensiones:
#izquierda2 {
float: left;
width: 31%;
padding: 1%;
}
#centro2{
float: left;
width: 32%;
padding: 1%;
}
#derecha2 {
float: right
width: 31%;
padding: 1%;
Observemos una cosa en el ejemplo anterior en el que, como vemos, el diseño
del ancho es líquido. El ancho total se ha calculado para llenar completamente
el contenedor ¿lo ves? El padding es el espacio interior entre el contenido de la
caja y el borde de la misma y se deja tanto a derecha como a izquierda, es decir,
un 2% por cada columna. En total hacen el 100% Si las columnas tuvieran bordes
pasaría lo mismo: un borde del .5% ocuparía un 1% por cada columna. Es un error
muy común hacer mal estos cálculos, tanto en diseños líquidos como fijos, y en
ese caso las cajas se desbordarían, quedarían descuadradas, con márgenes
antiestéticos, etc.
En los dos ejemplos anteriores hemos usado, intencionadamente, colores chillones
para cada columna para que quede claro que la columna más alta, sea cual
sea, es la que marca el alto total del diseño. Puedes hacer pruebas de esto
sumando o quitando contenido en unas u otras. El problema que tenemos con
estos diseños es que, o el fondo es blanco para todas, o si queremos usar
imágenes o colores el resultado es bastante poco profesional. Idem si quisiéramos
usar bordes separadores para cada columna. ¿Cómo lo solventamos? En la caja
número tres de este ejemplo tenemos una forma rápida de hacerlo pero sólo
válida para diseños de ancho fijo: usar una imagen de fondo para el contenedor
de nuestras columnas donde van dibujados los fondos y separadores de cada
una de ellas. Tan fácil como esto:
#contenedor3 {
background-image: url(fondo3.jpg);
border: 2px dotted black;
margin: 5px auto;
width: 780px;
overflow: auto
}
La imagen a insertar debaría de ser algo así:
Y nuestra tabla así:
Pero la solución “real” válida para cualquier tipo de situaciones no es esta. La
tienes en el diseño número 4 de este ejemplo 1. El “truco” consiste en usar una
estructura con dos contenedores siguiendo los siguientes puntos:
El primer contenedor tendrá, como siempre, el ancho total del diseño y
llevará como color de fondo el que queramos dar a la columna de la
izquierda.
El segundo contenedor ira dentro del primero con un float: right;, ocupando
el ancho de la columna de la derecha y con el color de fondo que
queramos que lleve esta.
Dentro de este segundo contenedor metermos las dos columnas. La de la
derecha ocupando el ancho de dicho contenedor. La de la izquierda con
la propiedad position: relative; y un margin: left; con valor negativo para
desplazar esa columna a la posición a la izquierda que le corresponde. El
HTML simplificado al máximo quedaría así:
<div id="contenedor4">
<div id="contenedor4-2">
<div id="izquierda4">Lorem ipsum dolor sit amet</div>
<div id="derecha4">Lorem ipsum</div>
</div>
</div>
Y el CSS:
#contenedor4 {
width: 780px;
margin: 5px auto;
color: white;
background-color: purple;
overflow: auto;
outline: 3px solid black;
}
#contenedor4-2 {
width: 500px;
float: right;
background-color: orange;
}
#derecha4 {
width: 480px;
float: right;
padding: 10px;
color: black;
}
#izquierda4 {
width: 260px;
float: left;
padding: 10px;
position: relative;
margin-left: -280px;
}
Ejemplo 2 – Tres columnas
¿Y si necesitamos tres columnas? El sistema sería muy similar al visto en el último
caso con la salvedad de que ahora necesitaríamos un contenedor por cada una
de las columnas (para darle color al fondo de cada una de ellas de forma
diferenciada) y todas las columnas “reales” con contenido irían dentro del último
contenedor, a la derecha, con los desplazamientos a la izquierda que veamos
oportunos. Y así podríamos seguir con cuatro, cinco, etc.
En el ejemplo 2 tienes el diseño típico a tres columnas del mismo ancho al que se
ha añadido algo que ahora está de moda en todos los diseños web: un cintillo fijo
en la parte superior de la página donde habitualmente se sitúan enlaces a
menús, al perfil de usuario, cerrar sesión, etc. Esto se consigue de forma fácil con
una caja en la que hemos definido dos propiedades: position: absolute: y z
index : 99;
#cintillo {
width: 100%;
height: 18px;
padding: 2px 10px;
position: fixed;
top: 0;
left: 0;
z-index: 99;
background-color: gray;
color: white;
font-weight: bolder;
font-family: monospace;
}
Ejemplo 3 – Diseño de alto y ancho fijo
Los diseños de alto y ancho fijos no tienen mayor complejidad y se incluye este
ejemplo sólo para completar la colección de casos posibles.
Ejemplos 4 y 5 – Diseños de ancho líquido
La complejidad del diseño de ancho líquido con múltiples columnas reside en los
cálculos para ajustar estas sin que se desborden o descuadren al modificar el
ancho del navegador. En el ejemplo 4 tienes un caso a tres columnas en el que se
ha tratado de detallar en los comentarios la forma de realizar estos cálculos. El
ejemplo 5 sería exactamente igual pero aquí ya usamos adicionalmente la
estrategia de contenedores anidados que nos permite que todas las columnas
tengan la misma altura independientemente de cual sea la que tenga más
cantidad de contenido. En ambos casos usamos, además, dos columnas
auxiliares para usarlas como separadores entre las columnas principales.
Ejemplo 6 – Diseño fijo, fluido, fijo
En este ejemplo presentamos una estructura en la que las columnas laterales,
derecha e izquierda, son de ancho fijo y es la columna central la que modificará
su ancho de forma fluida (porcentual) en función del ancho del navegador.
Los “trucos” de diseño son los siguientes:
Suponemos que el contenido principal estará en la columna central la cual
siempre tiene que exceder en longitud a las laterales. En caso contrario el
diseño no podría ser tan simple como se presenta aquí.
Las columnas laterales llevan tres propiedades: position: absolute; top: 0; y
luego, según corresponda, rigth:0; para la columna de la derecha y left:0;
para la de la izquierda.
El padding a derecha e izquierda de la columna principal central ha de ser
fijo y suficiente como para “cubrir” el espacio que ocupan las columnas
laterales.
Ejemplo 7 – Separadores entre columnas transparentes
En este ejemplo usamos una variante del método visto para que el separador
entre las columnas sea transparente y deje ver el fondo de la web que, en este
caso, es un degradado de color vertical. Para ello el contenedor principal ocupa
el espacio de la columna de la derecha, el secundario, dentro de este, tiene los
atributos de position: relative; y marginright: 260px; para desplazarlo a la
derecha, dejando un espacio vacío entre ambos que actuará como separador y
dejará ver el fondo de la web y, por último, dentro de este segundo contenedor
alojaremos las dos columnas, una de ellas, la izquierda, de nuevo con position:
relative; y un marginleft: 710; para desplazarla a su posición en la izquierda.
Ejemplo 8 – Sombras y diagonales
El ejemplo 8 está extraido directamente de la web y es un caso sencillo de como
introducir sombras, bordes redondeados y líneas diagonales en nuestro diseño de
forma sencilla. El efecto se consigue mediante tres imágenes: una de cabecera
que introduce unos bordes redondeados y una diagonal que cruza de parte a
parte el diseño, una de pié con los bordes redondeados y la sombra inferior, y otra
que se repite verticalmente a lo largo de todo el cuerpo del diseño para
completar el efecto de sombreado. La elección de introducir la imagen de
cabecera en el html y no en el css es discutible, pero he querido dejar el diseño
tal y como lo encontré en la web con los mínimos cambios para su estudio:
Cabecera del doumento en el HTML:
<div id="header">
<img src="eldiario.png" width="883" height="260" alt="eldiario.es">
</div>
<div class="article">
…
</div>
Repetición de la imagen en el cuerpo del diseño en el CSS:
div.article {
padding: 0px;
width: 883px;
margin-top: 0px;
margin-right: auto;
margin-bottom: 20px;
margin-left: auto;
background-image: url(fondo-eldiario.png);
background-repeat: repeat-y; }
Pié del documento, en el CSS:
#abajo {
background-image: url(fondo-abajo-eldiario.png);
background-repeat: no-repeat;
height: 25px;
margin: 0px;
padding: 0px; }
7.2. DISEÑO DE TABLAS
El ejemplo 9 muestra como dar un aspecto profesional a una tabla con apenas
unas pocas propiedades. El fondo del diseño tiene un degradado de color
vertical conseguido mediante la repetición de una imagen de fondo. Las
propiedades, como puedes ver, no tienen nada especial más que una
adecuada utilización de tipografías, colores y espaciados. Tan solo hay una nota
especial a tener en cuenta.L a tabla usa la propiead borderspacing: 0 1px; que
define el espacio de separación entre celdas adjacentes. El primer valor es el que
tendrá en cuenta para el espaciado horizontal y el segundo para el vertical (si
hubiera sólo un valor aplicaría a ambas magnitudes). Con esto conseguimos
anular el espaciado horizontal por defecto (de un pixel) que dejaría un punto en
blanco entre celda y celda en las líneas horizontales que delimitan las filas. Por lo
demás no existe nada más a reseñar.
7.3 OTROS TRUCOS
Ejemplos 10 y 11 – Transpariencias
Los efectos con imágenes translúcidas y que parecen “fijarse” al fondo de la web
mientras que el contenido se desplaza son muy utilizados y fáciles de
implementar. En estos dos ejemplos podemos comprobarlo. Las bases de este tipo
de diseño son las siguientes:
Debemos de contar con un juego de imágenes especialmente preparadas.
Todas ellas similares pero con algún “efecto diferenciador”
Situaremos cada una de estas imágenes en una caja diferente de forma
que el color de fondo de la caja (backgroundcolor) coincida con el color
de fondo de la imagen
Fijaremos todas las imágenes de la misma forma usando las propiedades
backgroundattachment y backgroundposition
En el siguiente CSS extraido del ejemplo 1 se muestran estas propiedades en
formato comprimido salvo en la caja correspondiente al body del
documento:
body {
background-color: #ded;
background-image: url(world-1.jpg);
background-position: top left;
background-repeat: no-repeat;
background-attachment: fixed;
padding: 1% 5%;
}
div#contenedor {
background: white url(world-2.jpg) top left no-repeat fixed;
width: 800px;
margin: 15px auto;
border: 1px solid black;
padding: 40px;
}
div#contenedor h2 {
background: #cbb196 url(world-3.jpg) top left no-repeat fixed;
color: white;
padding: 20px;
margin: 20px auto;
border: 1px solid black;
}
Ejemplo 12 – Box Punch
El Box Punch es otro ejemplo muy socorrido para disimular el hecho que ya
conocemos de que sólo podemos trabajar con cajas perfectamente
cuadrangulares. Mediante la ilusión de combinar colores de fondo y bordes en
diferentes cajas superpuestas se consigue el efecto de hacer creer que estas
cajas son más irregulares de lo que en realidad lo son.
En el ejemplo 12 tenemos 4 variantes de este efecto aplicados a conseguir una
letra capital destacada en un texto y un quinto caso para crear un texto
destacado, pero con un poco de imaginación se nos pueden ocurrir muchas
otras aplicaciones. Las claves de diseño son las siguientes:
Trabajamos siempre con dos cajas superpuestas y una de fondo. La caja en
primer plano, la que pretende dar el efecto de “arrancar” un bocado a la
que está en segundo plano debe de tener el mismo color que el fondo. En
una de las variantes que vemos no es así: la caja en primer plano tiene el
mismo color que la de segundo y es el borde de la de primer plano la que
tiene el mismo color que el fondo.
Usamos float en la caja de primer plano para situarla y margin y padding
para establecer una separación con el texto principal.
Cuando la caja donde está el texto principal lleva un borde usamos un
margen de valor negativo en la caja de primer plano para superponerla a
este y “borrarlo”. El margen negativo tendrá el mismo tamaño que el
borde.
Ejemplos 13 y 14 – Tooltips
El ejemplo 13 nos muestra como hacer tooltips, ventanas emergentes que nos
muestran información al pasar el ratón por encima de algún punto definido de
nuestra web. En el caso del ejemplo 13 estas ventanas se muestran siempre en el
mismo punto, en el pié de la web.
Las claves de este tipo de diseños son estas:
Tanto el texto que “dispara” el efecto como el texto que se mostrará en el
tooltip aparecerán en el HTML como contenidos de elementos
diferenciados y anidados. En el ejemplo 13 usamos dos span:
Y en el 14 un span dentro de un a:
El texto que aparecerá en la nota se marca como invisible usando la
propiedad display:
span.nota span.tip {
display: none;
font-size: .6em;
font-weight: normal;
color: black;
}
span.nota:hover span.tip{
display: block;
/* La nota irá siempre en la parte inferior de la pantalla */
position: fixed;
width: 96%;
margin: 1%;
padding: 1%;
bottom: 0;
left: 0;
background: #cde;
border: 1px solid gray;
}
En el caso anterior la nota irá siempre en la parte inferior de la pantalla
(ejemplo 13) y por eso usamos la propiedad position: fixed. bottom y left
marcaran el lugar de aparición. En el ejemplo 14 que buscamos una
posición diferente para cada nota usamos position:absolute.
Ejemplos 15 y 16 – Menús
De los tooltips a los menús sólo hay un pequeño paso. De hecho el anterior
ejemplo 14 podría considerarse ya un pequeño menú muy primitivo
El ejemplo 16 tiene además la peculiaridad de que apenenas cambiando unas
líneas en el CSS podemos transformarlo en un menú horizontal o vertical a nuestro
antojo. Se adjuntan las dos CSS necesarias para cambiar entre uno y otro modelo:
Ejemplo 17 – Esquinas redondeadas
Existen muchos trucos para realizar esquinas redondeadas con HTML4 y CSS2. El
más sencillo consiste en usar imágenes emplazadas dentro de una caja mediante
la propiedad position con valor absolute. La caja debería de tener un borde
sólido y la imagen de la esquina debería de estar especialmente preparada para
integrarse con el color del fondo de la página y de la caja y, además, “morder”
el borde de la caja en la que se encuentra para hacer desaparecer
parcialmente las esquinas del borde cuadrado habitual de esta.
Con HTML5 tenemos otros mecanismos más fáciles para hacer bordes
redondeados simples, pero si buscamos efectos más llamativos (como alguno de
los que acompañan a este ejemplo) tendremos que seguir usando este método u
otro similar:
Ejemplo 18 – Sprites
La carga de una página web implica que cada elemento individual que la
compone se recuepera mediante una petición al servidor. En páginas con
muchas imágenes pequeñas en las que queremos una carga excepcionalmente
rápida se suele usar un truco para mejorar el rendimiento que consiste en agrupar
varias de estas imágenes en una sóla y seleccionar en cada momento el trozo de
imagen que queremos ver mediante la propiedad backgroundposition. Se
conoce a esta técnica como de “Sprites” y en el siguiente ejemplo podemos ver
como usarla.
El ejemplo que se acompaña usa dos tipos de Sprites: uno con sólo tres imágenes
y otro, más complejo, con seis en el que el desplazamiento de la propiedad
backgroundposition implica moverse tanto en el eje horizontal como en el
vertical de la imagen.
Ejemplo 19 – Solapas
El efecto de solapas, ampliamente usado en la web actual, es similar en su
construcción inical al de un menú. El truco consiste en mantenemos una caja
diferente por cada contenido y alternar entre su visualización o no, según
corresponda, mediante la propiedad display y los valores de la misma block o
none, respectivamente.
Ejemplos 20 y 21 – Contorneos
El contorneo de imágenes, algo típico de las revistas, es un efecto sencillo pero
laborioso. La forma más sencilla de hacerlo consiste, básicamente, en
“diseccionar” la imagen a contornear en rodajas de más o menos alto (según lo
fino que queramos que sea el efecto) y ancho variable y, simplemente, dejar que
las cajas de nuestro texto se apoyen lateralmente en dichas imágenes, bien a la
izquierda, a la derecha o a ambos lados.
8. FORMULARIOS Y JAVASCRIPT
Javascript es un lenguaje de programación interpretado por el navegador y
creado por Netscape. Su función original era mejorar la funcionalidad de los
formularios en los documentos HTML. Hoy en día es el lenguaja más usado en el
lado del cliente de una aplicación web para aportar a estas dinamismo e
interactividad con el usuario. Continúa muy ligado al funcionamiento de los
formularios pero ya no se limita a eso en exclusiva. Además, la nueva versión del
estándard HTML (HTML5) incluye multiud de nuevas librerías en Javascript que
amplian enormemente la funcionalidad de una página web.
El programa más sencillo escrito en Javascript sería la siguiente versión del ya
clásico “Hola Mundo” donde se ha usado para mayor sencillez el esqueleto que
usan los documentos de HTML5:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" / >
<title>Hola Mundo en Javascript</title>
</head>
<body>
<script type="text/javascript" >
alert("¡Hola Mundo!");
</script>
</body>
</html>
El código javascript es el contenido del elemento con la etiqueta script que
aparece en el ejemplo anterior. Es lo único que aparece en el body, pero si
introduces otros elementos html (títulos, párrafos, o cualquier otra cosa) diferentes
antes y/o después del script verás como la ejecución del mismo interrumpe el
renderizado de la página HTML. Hasta que no pulsemos el botón que aparece en
el diálogo y desaparezca el mensaje, no proseguirá el dibujo de la página.
8.1. FUNCIONES Y EMPLAZAMIENTO DEL CÓDIGO JAVASCRIPT
Al igual que ocurría con los CSS, el código Javascript se puede situar de diferentes
formas dentro del HTML. La forma más directa es la que hemos visto en el ejemplo
anterior: directamente en el punto del cuerpo del documento donde queremos
que se ejecute. Pero si las funciones son más complejas que mostrar un mensaje o
queremos reutilizarlas debemos de crear funciones y emplazarlas en una
ubicación diferente.
8.1.1 Funciones
Una función es una pieza de código que puede invocarse desde distintos puntos
y en diferentes momentos. El código que vimos en el ejemplo anterior sólo se
ejecuta cuando el navegador está dibujando la página y en el momento en que
lee el trozo de código que la contiene. Hagamos algunos cambios:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<title>Hola Mundo en Javascript</title>
<script language="javascript">
function holamundo(){
alert(“¡Hola mundo!”);
}
</script>
</head>
<body>
<p>texto 1</p>
<script type="text/javascript" >
holamundo();
</script>
<p>texto 2</p>
<script type="text/javascript" >
holamundo();
</script>
<p>texto 3</p>
</body>
</html>
Hemos creado una función que hace exactamente lo mismo que antes y la
hemos emplazado en la sección head de nuestro html. Luego la hemos invocado
dos veces en distintos puntos del renderizado de nuestra página. Es evidente que
se trata de un ejemplo en el que la invocación a la función ocupa lo mismo que
la función en si, pero imaginémos que no es así y que se tratan de varias decenas
de líneas de código. Ahora tiene más sentido ¿verdad?
Como puedes observar, en algunos puntos se usa el argumento
language="javascript" y en otros type="text/javascript". El navegador entenderá
cualquiera de ellos (¡la mayoría, incluso, lo entenderá si no pones ninguno!) pero
lo correcto en las últimas versiones de HTML sería usar el argumento type.
Las funciones tienen, además, otra particularidad y es la posibilidad de que cada
ejecución sea diferente gracias a la personalización que permite el paso de
parámetros a las mismas. Hagamos una tercera modificación al código anterior:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<title>Hola Mundo en Javascript</title>
<script language="javascript">
function holamundo(texto){
alert(texto);
}
</script>
</head>
<body>
<p>texto 1</p>
<script type="text/javascript" >
holamundo(“¡Hola Mundo!”);
</script>
<p>texto 2</p>
<script type="text/javascript" >
holamundo(“¿He dicho ya eso de Hola Mundo?”);
</script>
<p>texto 3</p>
</body>
</html>
Cuando un documento HTML necesita de muchas funciones en javascript o estas
son utilizadas desde diferentes páginas html lo más cómodo, al igual que
hacíamos con los css, es sacarlas a un fichero externo de forma que el
documento html sólo queden las llamadas a las mismas. Veamos una última
versión del ejemplo anterior:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<title>Hola Mundo en Javascript</title>
<script type="text/javascript" src="func.js"></script>
</head>
<body>
<p>texto 1</p>
<script type="text/javascript" >
holamundo(“¡Hola Mundo!”);
</script>
<p>texto 2</p>
<script type="text/javascript" >
holamundo(“¿He dicho ya eso de Hola Mundo?”);
</script>
<p>texto 3</p>
</body>
</html>
Y en el interior del fichero func.js tendríamos esto:
function holamundo(texto){
alert(texto);
}
8.2. FORMULARIOS
El elemento que sirve para identificar un formulario lleva la etiqueta form. Dentro
de él tendremos diferentes elementos por cada objeto que queramos mostrar en
el mismo. Veamos el ejemplo el formulario más sencillo:
El elemento form tiene un único argumento imprescindible (action) que indica lo
que hay que hacer para procesar el funcionario. En el ejemplo anterior se le pide
que cargue la página respuesta.html que en realidad no hace nada y sólo
muestra un mensaje. Lo normal sería llamar a un script cgi o una función javascript
que validara los datos, a una página php que los procese en el lado del servidor
o, mucho más rudimentario, enviar los resultados por correo electrónico con un
mailto (por ejemplo action="mailto:[email protected]"). En este último
caso debería de aparecer también el argumento method y su valor debería de
ser post (lo veremos a continuación).
El argumento method indica la forma en que el formulario envía los datos que el
usuario ha escrito o seleccionado en él. Tiene dos valores posibles: get y post. Por
defecto toma el valor get.
El método get envía los datos del formulario concatenados a la URL de la página.
Los limita a 100 caracteres y es un método muy útil cuando, por ejemplo,
queremos guardar el resultado en favoritos o enviárselo a alguien por correo. La
URL que obtendríamos después de escribir Pepe y pulsar el botón de enviar en el
ejemplo anterior debería de ser algo similar a esto:
http://10.0.0.1/ej2/respuesta.html?cajanombre=Pepe&botonenv=Enviar
El método post no tiene límite en su extensión y el resultado no es visible para el
usuario pero, cuidado, eso no quiere decir que sea un método seguro para enviar
información sensible. Ninguno de ambos métodos lo es puesto que el resultado de
rellenar los datos del formulario se enviará en claro aún cuando con el método
post no podamos verlos directamente.
En los siguientes puntos iremos viendo uno a uno los distintos elementos que
pueden formar parte de un formulario y algunos de sus argumentos más usados.
La mayor parte de ellos usan la etiqueta input e indican el tipo de objeto de que
se trata mediante el valor del argumento type.
8.2.1. Caja de edición de texto (type=”text”)
Como su nombre indica, sirve para introducir texto con la restricción de que este
no puede tener más de una línea.
<input type="text" name="nombre" size="20" maxlength="40"
value= "Escribe aquí tu nombre" />
El argumento size indica el tamaño en caracteres de la caja mientras que
maxlength indica la longitud máxima que puede introducirse. value sirve para
introducir un valor por defecto que aparecerá al cargar la página (en caso
8.2.3. Etiquetas (label)
El elemento label sirve para asociar un campo de texto con un objeto de edición
de forma que, por ejemplo, si el usuario pulsa con el ratón sobre la etiqueta
asociada a un campo de edición de texto el cursos aparecería en modo edición
en el interior de dicho campo como si el usuario hubiera pulsado en él. Se trata,
por tanto, de una forma de extender la superficie de dichos objetos de forma que
resulte más cómodo la cumplimentación de los formularios.
Tenemos dos formas diferentes de realizar esta asociación. La primera de ellas
consiste simplemente en anidar el elemento de edición dentro del contenido del
elemento label:
<label>Dirección:<br/><input type="text" name="direccion"
size="80" maxlength="120" /></label>
El segundo método consiste en identificar ambos objetos mediante el valor del
argumento for del elemento label y el valor del argumento id del elemento de
edición:
<label for=”txtdir”>Dirección:</label><br/><input type="text"
name="direccion" size="80" maxlength="120" id=”txtdir” />
ATENCIÓN. Si usamos el primero de los métodos hay que tener mucho cuidado
porque los estilos que apliquemos al elemento label se extenderían también al
objeto de edición.
8.2.4 Radio Buttons (type=”radio”)
Los radio buttons son los característicos objetos redondos para elegir entre varias
opciones alternativas pero con la restricción de que sólo puede seleccionarse
uno de ellos, de forma que marcar cualquiera implica que se elimina la selección
del que hubiéramos seleccionado previamente. Además, debería de haber una
elección obligatoria.
<input type="radio" name="sexo" value="hombre"
checked="checked" /> Hombre<br/>
<input type="radio" name="sexo" value="mujer" /> Mujer
Puesto que en un mismo formulario podemos tener diferentes grupos de radio
buttons, es el valor del argumento name el que los mantiene asociados entre si. El
argumento checked sirve para seleccionar la opción por defecto que aparecerá
marcada al cargar la página. Además, podemos usar el argumento disabled si
queremos que alguno de ellos no sea seleccionable.
ATENCIÓN. Cuidado con las propiedades que aparentemente funcionan pero
no lo hacen. Si ponemos un argumento readonly en un radio (o en un check box
que veremos a continuación), este cambia de aspecto pero puede seguir
usándose. El argumento correcto para deshabilitarlos sería disabled.
El valor del argumento value es lo que se transmitirá en las respuesta del
formulario si ese elemento se encuentra seleccionado.
8.2.5 Checkboxes (type=”checkbox”)
Los checkboxes son muy similares a los radio butons. Se diferencian básicamente
en dos aspectos: visualmente son cuadrados y desde el punto de vista lógico
deberían de permitir, si así lo deseamos, la elección de más de una opción dentro
de un mismo grupo de objetos. Además, debería de permitirnos no elegir ninguno
de ellos.
<input type="checkbox" name="vehiculo" value="motocicleta"
disabled="disabled" /> Motocicleta<br/>
<input type="checkbox" name="vehiculo" value="moto"
checked="checked" /> Moto<br/>
<input type="checkbox" name="vehiculo" value="coche" />
Coche<br/>
<input type="checkbox" name="vehiculo" value="camión" />
Camión<br/>
<input type="checkbox" name="vehiculo" value="tractor" />
Tractor</p>
Todo lo dicho en cuanto a los argumentos en los radio es válido también para
estos.
8.2.6. Agrupación de objetos
Podemos agrupar visualmente diferentes objetos de nuestro formulario mediante
el elemento fieldset:
<fieldset>
<legend>Información personal</legend>
...
</fieldset>
Esto, por defecto, dibuja un recuadro alrededor de los elementos que contiene. El
elemento legend sirve para poner título a dicho recuadro.
8.2.7 Caja de edición de texto de múltiples líneas
El elemento textarea nos crea una caja de edición que admite más de una línea.
Las dimensiones iniciales de la misma se asignan mediante los argumentos rows y
cols.
<textarea name="comentarios" rows="8" cols="50" >Escribe tus
comentarios...</textarea>
No existe forma de limitar desde HTML el número de caracteres máximo que
admite la caja (esto se controla habitualmente mediante javascript). El contenido
del elemento, si existe, será el valor inicial que contenga la caja de edición.
Todos los navegadores modernos permiten cambiar el tamaño de estas cajas de
texto visualmente mediante un control que aparece en su esquina inferior
derecha. La mejor forma de evitar esto, si así lo deseamos, es en los CSS.
8.2.8 Caja de selección de ficheros
Nos abre una ventana de diálogo (cuyo aspecto depende del navegador y el
sistema operativo) que nos permite seleccionar un fichero de nuestro disco duro
<label>Fotografía:<br/><input type="file"
name="fichero"/></label>
No realiza ningún tipo de validación de la elección. Eso nos corresponde hacerlo
a nosotros posteriormente mediante javascript o en el servidor cuando enviemos
los datos.
8.2.9 Cajas de selección (Comboboxes y Listboxes)
Existen dos cajas de selección típicas en entornos gráficos: los comboboxes son
cajas con distintas opciones en las que sólo podemos seleccionar una de ellas.
Además, aunque podemos desplegarla en el momento de la selección, cuando
elegimos la lista se cierra y sólo permanece visible nuestra elección. Además,
debería de ser obligatorio hacer al menos una elección. Los listboxes, por el
contrario, nos suelen permitir elegir más de una opción simultaneamente (o
ninguna) y siempre suelen estar total o parcialmente abiertos.
En HTML ambos se implementa mediante el elemento select y son los argumentos
que usemos los que hacen que se comporte de una u otra forma. Veamos
inicialmente un combobox:
<select name="oficina" >
<option>Madrid</option>
<option>Sevilla</option>
<option selected="selected" >Alcorcón</option>
<option>Lisboa</option>
<option>Burdeos</option>
</select>
Un listbox sería de esta forma:
8.2.10 Botones
Todo formulario debería de tener, al menos, un botón que sirva para indicar que
ya hemos terminado de cumplimentarlo y que da paso al procesado y/o envío
de los datos que hemos rellenado. Este botón debe de estar identificado con el
argumento type y el valor submit y el comportamiento normal al pulsarlo es
invocar el enlace que hemos puesto como valor del argumento action del
elemento form. Dicho esto, tenemos dos formas de implementar este botón:
<input type="submit" value="Enviar" />
<button type="submit">Enviar</button>
Ambos elementos se comportarían igual y harían lo mismo. La diferencia está en
que el texto que aparece en el primero es el que aparece como valor del
argumento value (o un texto por defecto que pone el navegador si ese
argumento no aparece) y que, por tanto, no podemos aplicarle estilos mientras
que en el segundo botón el texto es el contenido del elemento y podemos
aplicar estilos con total libertad o, incluso, poner una imagen:
8.3. CSS EN LOS ELEMENTOS DE LOS FORMULARIOS
Con algunas limitaciones, es posible cambiar el estilo y las propiedades de
visualización de los formularios mediante CSS. No nos pararemos en detalle, pero
como ejemplo debe de valer la diferencia de aspecto entre los siguientes
formularios a los que sólo los separa una hoja de estilos de apenas 30 líneas (y
algún elemento adicional que usaremos posteriormente para las validaciones):
8.4. VALIDACIÓN DE FORMULARIOS MEDIANTE JAVASCRIPT
Para entender correctamente la forma de manipular un formulario mediante
Javascript tenemos que entender previamente los principios básicos de la
programación visual orientada a eventos.
8.4.1. Métodos, eventos y propiedades
Sin meternos en demasiada profundidad, diremos que los eventos son acciones
que ocurren sobre los elementos de nuestro formulario, generalmente debido a la
acción del usuario: rellenar una caja de edición de texto, pulsar con el ratón, etc.
Los eventos vienen predeterminados según el elemento del formulario y no
podemos añadir ninguno nuevo.
Los métodos son las funciones que se invocan al producirse los eventos. Existen ya
algunos métodos por defecto que vienen predefinidos con los formularios pero
nosotros siempre tendremos la posibilidad de crear otros nuevos o modificar los ya
existentes.
Por último, las propiedades son, por regla general (aunque no siempre), los valores
de los argumentos con que están construidos los elementos del formulario y los
valores de los mismos introducidos o elegidos por el usuario y que nosotros
podremos manipular desde nuestros métodos.
8.4.2. Eventos del elemento form
El elemento form responde a dos eventos denominados onSubmit y onReset y que
se corresponden con la pulsación de los botones de submit y/o reset
respectivamente. Por defecto los métodos que se invocan en cada uno de
ambos casos reciben los nombres de submit y reset, pero nosotros podemos
introducir nuestros propios métodos. Esto lo hacemos introduciendo nuevos
argumentos en el elemento form. Así, por ejemplo:
<form name="form2ASI" onSubmit="alert('Enviando el
formulario')" onReset="alert('Limpiando el formulario')"
method="post" action="respuesta.html">
…
</form>
que se genera cuando lo pulsamos.
<input type="submit" value="Enviar" onClick="enviar()"
name="btnenv" />
<input type="button" value="Enviar" name="btnenv"
onClick="enviar()" />
Estos dos botones tienen comportamientos diferentes y es muy importante que los
distingamos. El primero, puesto que es del tipo submit, cuando sea pulsado
ejecutará la función enviar() y luego también invocará el evento submit() (salvo
que lo impidamos desde dentro de la función). El segundo ejecutará la función
enviar() pero no ejecutará el evento submit() (salvo que nosotros lo hagamos
expresamente). La diferencia es importante cuando queremos hacer una
validación previa del formulario.
8.4.4. DOM, Modelo de objetos del documento
El llamado DOM es la interfaz que nos va a permitir interactuar con la tercera pata
que aún no hemos mencionado: las propiedades. Se trata, ni más ni menos, de
una nomenclatura especial (que a los programadores habituados a la
orientación a objetos le resultará familiar) que nos va a permitir identificar los
elementos del formulario y sus propiedades y poder leerlas y modificarlas.
El DOM nos va a permitir darle nombre a los objetos del formulario de forma muy
sencilla. Vamos a ver un ejemplo muy sencillo. Imaginemos este botón:
<input type="submit" value="Enviar" onClick="enviar()"
name="botonenv" disabled="disabled" />
<input type="reset" value="Limpiar"
onClick="limpiar(this.form)" />
Hemos visto ya que a las funciones javascript se les pueden pasar parámetros.
this.form es una referencia al formulario en el que aparece el elemento desde el
que hacemos la referencia. La función limpiar sería así:
function limpiar(formulario){
alert('Haz pulsado el botón de limpiar...');
formulario.botonenv.disabled=true;
}
Si quisieramos hacer la referencia al formulario desde el evento form, usaríamos
simplemente this:
<form name="form2ASI" onSubmit=”enviar(this)”
action="respuesta.html">
...
</form>
A partir del parametro que le hemos enviado a la función identificamos al botón
de enviar a través del valor de su argumento name y a la propiedad disabled
mediante su nombre. De esta forma conseguimos variar su valor y hacer que
cuando el formulario esté limpio el botón de Enviar aparezca deshabilitado.
Existen otras referencias útiles que podemos hacer a través de DOM. Por ejemplo,
8.4.5. Validación del formulario
La estrategia habitual a seguir a la hora de validad un formulario sigue uno de los
dos patrones siguientes:
• Validamos uno a uno los elementos del formulario mientras que se rellenan
(respondiendo a los eventos onKeyDown, onKeyUp, onKeyPress, onChange
y/o onBlur)
• Validamos todos los elementos del formulario una vez que se ha pulsado el
botón de enviar respondiendo al evento onSubmit
A veces se puede usar una estrategia combinada de ambos.
El primer método es el más sencillo. Veamos un ejemplo muy simple en el que la
validación consiste sólo en comprobar que un campo no se ha quedado sin
rellenar. El formulario sería este:
<form name="form2ASI" onSubmit="return enviar(this)"
action="respuesta.html">
<p><label>Nombre: <input type="text" name="cajanombre"
/></label></p>
<p><input type="submit" value="Enviar" name="botonenv" />
<input type="reset" value="Limpiar" /></p>
</form>
La función javascript que realiza la validación sería algo así:
function enviar(formulario){
alert('Haz pulsado el botón de enviar...');
if(formulario.cajanombre.value.length == 0){
alert('No puedes dejar este campo en blanco');
validacionOK = false;
}
else{
alert('Haz escrito: '+ formulario.cajanombre.value);
validacionOK = true;
}
return validacionOK;
}
La otra estrategia, más dinámica pero también más complicada, consistiría en
validar uno a uno los campos a rellenar y no dejar que el formulario se envíe
(deshabilitando incluso el botón de Enviar) hasta que no estén todos correctos.
Veamos un pequeño ejemplo también. Primero el formulario:
<form name="form2ASI" action="respuesta.html">
<p><label>Nombre: <input type="text"
onBlur="validar(this.form)" name="cajanombre"
/></label></p>
<p><input type="submit" value="Enviar" onClick="enviar()"
name="botonenv" disabled="disabled" /> <input
type="reset" value="Limpiar" onClick="limpiar(this.form)"
/></p>
</form>
Y luego el código Javascript:
function validar(formulario){
if(formulario.cajanombre.value.length == 0){
alert('No puedes dejar este campo en blanco');
formulario.botonenv.disabled=true;
formulario.botonenv.value="¡No puedes Enviarlo
así!";
}
else{
alert('Haz escrito: ' +
formulario.cajanombre.value);
formulario.botonenv.disabled=false;
formulario.botonenv.value="Enviar";
}
}
function enviar(){
alert('Haz pulsado el botón de enviar...');
}
function limpiar(formulario){
alert('Haz pulsado el botón de limpiar...');
formulario.botonenv.disabled=true;
}
Veamos ahora la forma de validad un campo numérico. Por ejemplo un número
de teléfono. El formulario es muy similar al que hemos visto anteriormente:
<form name="form2ASI" onSubmit="return enviar(this)"
action="respuesta.html">
<p><label>Teléfono: <input type="text" name="cajatlf"
/></label></p>
<p><input type="submit" value="Enviar" name="botonenv" />
<input type="reset" value="Limpiar" /></p>
</form>
En el código javascript validaremos por un lado que la longitud sea exactamente
de siete dígitos y por otro que sean todos numéros y no letras o caracteres
extraños. Esto segundo lo hacemos apoyándonos en dos funciones de javascript:
parseInt que convierte una cadena de texto a su valor numérico entero (el
contenido de los formularios siempre se lee como texto aunque se trate de cifras)
y la función isNAN que devuelve un 0 si el argumento que recibe no es un número
correcto.
function enviar(formulario){
alert('Haz pulsado el botón de enviar...');
if(formulario.cajatlf.value.length != 9 ||
isNAN(parseInt(formulario.cajatlf.value)) == false){
alert('No es un teléfono correcto');
validacionOK = false;
}
else{
alert('Haz escrito: ' + formulario.cajatlf.value);
validacionOK = true;
}
return validacionOK;
}
Lógicamente se puede complicar mucho más y hacer una validación más
estricta: comprobar que empiece por 9, 6 o 7, permitir el uso de prefijos
internacionales, etc.
En los ejemplos que acompañan a este texto tienes algún ejemplo más, como
por ejemplo como validar que la contraseña repetida dos veces coincida o la
longitud máxima de un textarea (ejemplo 5) o como cambiar el contenido de un
listbox en función de la selección hecha en un combobox y como pasar
elementos entre dos listboxes (ejemplo 6).
8.4.6. Lista de eventos de Javascript disponibles en los formularios
A continuación tienes una tabla con los eventos que podemos usar en un
formulario, los elementos a los que afectan y una breve descripción de los mismos.
Las propiedades fundamentales que podemos alterar o consultar mediante
código javascript de cada uno de los elementos de un formulario son las
siguientes:
Elemento Propiedades
form name, action, method
button name, value, disabled
text y
name, value, disabled, readonly, size, length, maxlength
password
name, value, disabled, readonly, size, length,
textarea
maxlength, cols, rows
radio y
name, value, disabled, checked, length
checkbox
select name, size, disabled, multiple, type
options value, text
file name, size, disabled
8.5. JAVASCRIPT FUERA DE LOS FORMULARIOS
Aunque ya hemos dicho que Javascript nació como una forma de validar de
forma rápida los formularios, su uso hoy transciende de esto y podemos hacer una
página que utilice javascript al margen de los formularios o no sólo con ellos.
Veremos algunos ejemplos sencillos de uso en este último punto
8.5.1. Alert y otras ventanas de confirmación o entrada de datos
Hemos usado durante todo el capítulo la función alert que nos muestra una
ventana con un texto y un botón de Aceptar. Esta función paraliza la ejecución
hasta que el usuario no pulsa el único botón que aparece en ella.
Pero Javascript dispone de otros dos tipos de ventanas más útiles según para que
las necesitemos. Vamos a verlas.
La ventana confirm muestra dos botones (OK y Cancelar) y devuelve la elección
del usuario para que actuemos en consecuencia como una variable booleana:
true si hemos pulsado OK y false si hemos pulsado Cancel:
respuesta = confirm("Pulsa un botón");
if (respuesta == true){
alert("Haz pulsado el botón de OK");
}
else{
alert("Haz pulsado el botón de Cancel");
}
La ventana prompt nos muestra una caja de texto y devuelve el valor que hemos
escrito en ella. Además, muestra dos botones y devuelve el valor null si hemos
salido pulsando el botón de Cancelar en lugar del de OK:
texto = prompt("Escribe tu nombre, por favor");
if(texto == null){
alert("Haz pulsado el botón de cancelar");
}
else{
if(texto.length!=0){
alert("Hola " + texto + ", buenos días \n ¿Cómo
estás?");
}
else{
alert("Buenos días aunque no quieras decirme tu
nombre... :-(");
}
}
8.5.2. Lista de eventos de Javascript disponibles de forma genérica
Los eventos que podemos capturar en una página web y asociarlos a un método
javascript y que no tienen relación directa con los elementos de un formulario son
estos:
Evento Descripción
onAbort Cuando se aborta la carga de una imagen
Cuando se hace doble click con el botón izquierdo
onDblClick
del ratón
Cuando la página termina de cargarse
onLoad
completamente
onMouseDown Cuando se pulsa un botón cualquiera del ratón
onMosueMove Cuando se mueve el ratón
onMove Se mueve la ventana
onResize Se cambia el tamaño de la ventana
Además, alguno de los eventos que se usan en los formularios pueden tener
también aplicación fuera de ellos.
Veamos un trozo de código con ejemplos sencillos de aplicación:
<body onLoad="alert('La página se ha cargado completamente');"
onResize="alert('Haz cambiado el tamaño de la página');">
<h1 onMouseOver="alert('Haz pasado el ratón sobre el
titular');" >Titular de la página</h1>
<p onClick="alert('Haz hecho click en el primer
párrafo');" >Primer párrafo de texto de la página</p>
<p onDblClick="alert('Haz hecho doble click en el primer
párrafo');" >Segundo párrafo de texto de la página</p>
</body>
En el ejemplo 8 que acompaña a este texto tienes un ejemplo más complicado
donde se ve como cambiar el estilo CSS de un elemento de la página a través de
un método que se lanza al capturar el envento de hacer Click en un ratón.
8.5.3. Los objetos document y window
El modelo DOM nos proporciona dos objetos denominados document y window
con una amplia colección de propiedades y atributos que nos permiten
interactuar de forma fácil con características interesantes del navegador y el
documento HTML.
Por ejemplo, el objeto window nos permite obtener las dimensiones en píxeles de
la superficie útil del navegador. La siguiente función nos muestra estas
dimensiones en una ventana de alerta:
function muestraDimensiones(){
alert("Ancho: " + window.innerWidth + " píxeles.\nAlto: "
+ window.innerHeight + " píxeles.");
}
Tienes una buena referencia de las posibilidades que te ofrece el objeto window
aquí:
http://www.w3schools.com/jsref/obj_window.asp
La principal utilidad del objeto document es que nos permite obtener una
referencia a cualquier elemento HTML de la página para interactuar con él a
través del valor de su atributo id que, como ya sabes, debería de ser único. Lo
hacemos mediante la función getElementById(). La siguiente función obtiene la
referencia de un objeto HTML cuyo valor del atributo id es caja1 y modifica su
estilo por uno llamado estilo2. Dicho estilo debería de existir en los CSS del
documento y ser aplicable al objeto en cuestión (puedes consultar el ejemplo 8
que acompaña a este documento para ver el código completo)
function cambiar_estilo(){
objeto = document.getElementById("caja1");
objeto.className="estilo2";
}
Puedo, incluso, cambiar el contenido de un elemento a través de la propiedad
innerHTML:
function cambiaTitular1(titular){
titular.innerHTML="Nuevo Texto para el Titular";
}
Para ver más propiedades del objeto document puedes consultar esta página:
http://www.w3schools.com/jsref/dom_obj_document.asp
Y si quieres ampliar conocimientos o ver más ejemplos sobre cualquier otra cosa
de javascript, aquí tienes una completa referencia de todas las funciones
disponibles:
http://www.w3schools.com/jsref/
9. HTML5
HTML5 es la nueva revisión del lenguaje HTML definido por la W3C. Se encuentra
aún en fase beta experimental y, por tanto, hay que tratar con mucho cuidado la
introducción de sus nuevas características puesto que muchos navegadores,
sobre todo si son relativamente antiguos, no contemplan aún estos cambios o no
lo hacen en su totalidad. Una de las grandes novedades es que, por primera vez,
la definición de HTML y XHTML para esta nueva versión (HTML5 y XHTML5) se han
desarrollado en paralelo. XHTML5 es, básicamente, HTML5 con las restricciones de
sintaxis que ya planteamos cuando presentamos XHTML1
9.1. ESTRUCTURA DE UN DOCUMENTO HTML5 O XHTML5
La estructura de un documento con html5 o xhtml5 es mucho más sencilla que en
versiones anteriores y, además, idéntica para ambos:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="estilos.css" media="all" />
<title>Html5</title>
</head>
<body>
</body>
</html>
Observa que ya no es necesario usar el argumento type en las etiquetas link que
declaran el uso de hojas de estilo (tampoco en las que declaran un fichero con
funciones javascript). Tampoco existen diferencias en los argumentos entre HTML5
y XHTML5. De hecho, podemos escribir documentos denominados “políglotas”
que puedan ser interpretados como uno o como otro indistintamente y sin ningún
problema observando las siguientes condiciones:
El DOCTYPE no es obligatorio en XHTML pero si en HTML, así que debemos
de ponerlo. Además, HTML no es sensible a mayúsculas o minúsculas pero
XHTML si, así que hay que ponerlo tal y como aparece en el ejemplo de
aquí arriba.
Debemos de usar la sintaxis de HTML5, y observar todas las restricciones de
XHTML5 que ya habíamos visto, a saber:
Los elementos deben de cerrarse siempre
Los elementos sin contenido deben de usar la sintaxis de autocerrado
siempre.
La apertura y cierre de los elementos anidados no debe de solaparse.
Los valores de los atributos deben de ir siempre entre comillas simples
o dobles
Los nombres de etiquetas y atributos deben de ir siempre en
minúsculas
No está permitido usar un atributo sin valor
9.2. CAMBIOS EN LAS ETIQUETAS
Lo primero a reseñar en HTML5, un lenguaje de marcas basado en un conjunto de
etiquetas, debería de ser los cambios sufridos en el conjunto de estas. Aparecen
25 nuevas etiquetas, hay ligeros cambios en 7 de las antiguas y desaparecen 16.
Etiquetas eliminadas
Las etiquetas eliminadas, de las cuales nosotros no deberíamos de preocuparnos
demasiado porque unas las hemos evitado expresamente desde el principio de
este curso y otras ni siquiera las hemos presentado, son las siguientes:
acronym, applet, basefont, big, center, dir, font, frame,frameset,
isindex, noframes, s, strike, tt, u, xmp
Nuevas etiquetas para la organización del documento.
Dentro de las nuevas etiquetas, el primer grupo que nos interesa ver es el de
aquellas que introducen una mayor información semántica a la estructura del
documento. Se trata de header, nav, footer, aside, section y article. Se trata de
etiquetas que identifican las secciones más habituales que existen en la gran
mayoría de las páginas web y que hasta ahora identificábamos usando la
etiqueta div en función con algún id o class, por ejempo <div id=”footer”> o <div
class=”article”>.
Estas etiquetas no hacen nada especial y no introducen ninguna información de
estilo. Su único propósito es proporcionar información semántica a nuestras
páginas de cara, sobre todo, a facilitar su lectura y la valoración del contenido
por parte de los buscadores. Pensemos, por ejemplo, en una página web que se
titule “Carnicerías de calidad en Sevilla” y otra en cuyo pié de página aparezca
el nombre de su autor: “Javier Carnicería Sevilla”. Google no debería de tratar a
ambas al mismo nivel cuando alguien realice una búsqueda de carnicerías en
Sevilla. Estas etiquetas le proporcionan, a él y al resto de buscadores, una forma
clara de valorar el contenido de una web según donde se presente cada texto.
Solventando los problemas de versiones antiguas de Internet Explorer
Cuando contemplamos el uso de versiones antiguas del Microsoft Internet Explorer
podemos tener un problema con estas etiquetas. El resto de navegadores nos
permite “inventarnos” etiquetas y aplicarles estilos, pero Explorer si no reconoce
una etiqueta como válida la ignora. Esto hace que una versión antigua de Firefox
nos permita aplicar estilos a la etiqueta header, aunque no la conozca, pero
Explorer no. Para solucionar esto usamos dos recursos: la posibilidad de incluir
comentarios condicionales en Internet Explorer y las librerías html5shiv.
Los comentarios condicionales tienen esta forma:
<!--[if IE]>
<p>Esto sólo se verá en un Internet Explorer</p>
<![endif]-->
Es fácil ver que, según la sintaxis HTML que conocemos eso es un comentario y no
se verá, pero Explorer lo reconoce como una secuencia especial y si nos lo
mostrará. Tenemos otras formas más complejas para detectar una versión
concreta de Explorer, o una mayor o menor que una dada:
<!--[if IE 6]>
<p>Sólo en Explorer 6</p>
<![endif]-->
<!--[if lt IE 9]>
<p>Sólo en versiones de Explorer menores a la 9</p>
<![endif]-->
<!--[if lte IE 7]>
<p>Sólo en versiones de Explorer menores o iguales a la 7</p>
<![endif]-->
<!--[if gt IE 6]>
<p>Sólo en versiones de Explorer mayores a la 6</p>
<![endif]-->
<!--[if gt IE 8]>
<p>Sólo en versiones de Explorer mayores o iguales a la 8</p>
<![endif]-->
O, incluso, darle otra vuelta de tuerca a la sintaxis y mostrar código que sólo se
verá en navegadores que no sean el Internet Explorer:
<!--[if !IE]> -->
<p>Esto sólo se verá si no estás con un Explorer</p>
<!-- <![endif]-->
De esta forma ya podemos mostrar unas etiquetas en Explorer y otras en otros
navegadores de forma relativamente fácil, pero existe un método más rápido y
limpio de solucionar el problema de las nuevas etiquetas de organización: la
librería html5shiv nos permiten que el Explorer aplique estilos a etiquetas que no
conoce. Para que funcionen basta con incluirlas en la sección head de nuestra
web y, si queremos, podemos incluirlas con un comentario condicional como los
vistos para que sólo se carguen cuando realmente las necesitamos:
<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
9.3. MEJORAS EN LOS FORMULARIOS: NUEVOS TIPOS DE INPUT
Tal vez una de las mejoras más significativas sea la gran riqueza que HTML5 añade
a los formularios con objeto de que podamos construir con facilidad aplicaciones
web. Son 13 los nuevos tipos disponibles para la etiqueta input además de algún
argumento extra añadido a los ya existentes.
El argumento required, válido para casi todos los tipos de objetos permite, marcar
como obligatorio un campo de forma que no se pueda ejecutar la función submit
si no está completo y dando, además, un efecto visual que cada navegador
podrá personalizar.
El argumento autofocus, que debería de usarse sólo en un objeto por formulario,
selecciona el campo del mismo que tomará el foco de forma automática una
vez cargada la página.
El argumento autocomplete puede tomar dos valores (on o off) e indica al
navegador si puede hacer sugerencias al usuario dependiendo de lo que haya
escrito en anteriores ocasiones en ese mismo campo.
El argumento placeholder, válido en todos los campos de texto, nos muestra un
texto con instrucciones sobre que debemos de cumplimentar en el mismo.
El argumento wrap, existente en versiones anteriores a HTML4 pero desaparecido
en esta, vuelve en HTML5. Es válido en los input de tipo textarea y nos permite
indicar si queremos que los saltos de línea que el usuario escriba en ellos se
tranmsitan (wrap=”hard”) o no (wrap=”soft”) que es la opción por defecto.
datalist es una nueva etiqueta que puede asociarce a los campos de texto y que
nos permite mostrar al usuario una lista de sugerencias de forma muy similar a la
que, por ejemplo, Google utiliza cuando escribimos en su caja de búsquedas. Se
usa en conjunto con la etiqueta option de forma muy parecida a la que
utilizamos en un campo select:
<input type="text" name="provincia" list="provincias" />
<datalist id="provincias">
<option value="Sevilla"></option>
<option value="Madrid"></option>
<option value="Cuenca"></option>
<option value="Málaga"></option>
</datalist>
La identificación entre el input y el datalist se hace a través de los argumentos list
e id cuyos valores deben de ser iguales.
Por último, el argumento pattern permite especificar una expresión regular que
debe de cumplir lo que pongamos en el campo para que el formulario sea
validado. Veamos un par de ejemplos:
<input type="text" name="codpostal" pattern="[0-9]{5}" />
<input type="text" name="nif" pattern="[0-9]{8}[A-Za-zÑñ]{1}" />
En el primero el patrón especifica que el campo sólo validará si consta de cinco
números seguidos sin ningún caracter adicional. En el segundo caso, el campo
debe de ser rellenado con ocho números seguidos de una letra, ya sea esta en
mayúsculas o minúsculas. Para aprender más sobre como construir expresiones
regulares más complejas puedes consultar el siguiente enlace:
http://www.w3schools.com/jsref/jsref_obj_regexp.asp
Y una nota adicional acerca de los patrones: si el campo no está marcado como
requerido mediante el argumento antes visto sería posible dejarlo en blanco y eso
no cumpliría con el patrón especificado. Así que si se quiere obligar no olvides
también este argumento.
Los tipos nuevos introducidos a los input son email, url, number, date, month,
week, time, datetime, datetimelocal, search, color, range y tel. Proporcionan
controles especializados de diferentes peticiones bastante cotidianas con
validación automática. Veamos algunos ejemplos con los argumentos más
habituales de cada uno de ellos (aparte de los ya vistos: required, disabled,
readonly, etc. y que funcionarían perfectamente con la mayoría de ellos).
<input type="email" name="email" />
<input type="url" name="web" />
<! funcionan en opera y en chrome >
<input type="number" name="edad" min="18" max="100" step="1" value="18" />
<input name="cursor" name="unidades" type="range" min="3" max="12"
value="6" step="3" />
<! funcionan sólo en opera >
<input type="date" name="nacimiento" />
<input type="month" name="alta" />
<input type="week" name="vacaciones" />
<input type="time" min="07:00" max="23:00" step="3600" value="09:00" />
<input type="datetime" name="fecha1" />
<input type="datetime-local" name="fecha2" />
<input type="color" name="color" value="#c0ffee" />
<! No implementados aún por ningún navegador >
<input type="search" name="busqueda" /> <input type="button"
value="Buscar" />
<input type="tel" name="telefono" />
Intimamente relacionado con los formularios, aunque mucho más universal y sin
dependencia directa con estos, tenemos el nuevo agumento contenteditable
que convierte, cuando su valor es true, a casi cualquier elemento, ya sea de
bloque o de linea, en editable de forma directa por el usuario:
9.4. MODERNIZR
Modernizr es una librería escrita en javascript y que nos sirve de ayuda en la
transición a HTML5. Su funcionamiento es muy simple: nos permite “interrogar” al
navegador del usuario que está viendo nuestras páginas sobre si entiende
determinadas características de HTML5 o CSS3 y, en ese caso, elegir lo que vamos
a mostrarle. Veamos un ejemplo muy sencillo y explicamos con él como instalarlas
y hacerlas funcionar de forma básica.
Lo primero que debemos de hacer es descargar las librerías de modernizr de la
web http://www.modernizr.com/ y copiar el fichero js en el directorio de nuestro
proyecto. Tenemos dos opciones: o descargarnos las librerías completas de la
versión de desarrollo o generar una librería a medida que sólo contenga las
comprobaciones de las etiquetas y atributas que usamos. Esta segunda opción
será mucho más ligera y acelerará la carga y ejecución de nuestro proyecto.
En segundo lugar tenemos que incluir una llamada a la librería en el head de
nuestro html:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<script src="modernizr-2.5.3.js"></script>
<link rel="stylesheet" href="estilos.css" media="all" />
<title>Ejemplo de uso de Modernizr</title>
</head>
<body>
</body>
</html>
Dos indicaciones en este paso: en primer lugar el nombre de la librería puede
cambiar según lo que nos descarguemos de la web. Revísalo antes de incluirlo en
tu proyecto. En segundo lugar, la carga de la librería de modernizr debe de
hacerse antes de la carga de las hojas de estilo si queremos hacer
comprobaciones también en estas.
Ahora ya lo único que tenemos que hacer es, desde nuestro documento,
interrogar a Modernizr si el navegador es capaz de interpretar determinadas
etiquetas y/o argumentos y actuar en consecuencia. Podemos ver una
demostración sencilla introduciendo este código en el body de nuestro ejemplo
anterior:
<script>
if (Modernizr.input.required) {
alert("Tu navegador soporta el atributo required");
}
else {
alert("Tu navegador no soporta el atributo required");
}
if (Modernizr.inputtypes.range) {
alert("Tu navegador soporta el input type=range");
}
else {
alert("Tu navegador no soporta el input type=range");
}
</script>
Pero lo que nosotros realmente queremos, la mayoría de las veces, no es advertir
de nada al usuario sino crear una página 'alternativa' de forma que el no se de
cuenta de nada aunque, lógicamente, pierda algunas de las funcionalidades
que ofrece HTML5. Para ello usamos la función document.write de javascript que
nos permite crear parte del documento HTML en el mismo momento de su
ejecución y dependiendo de las indicaciones que nos haga Modernizr. Veamos
una alternativa más útil al código anterior con estas indicaciones:
<script>
if (Modernizr.input.required) {
document.write("<label>Nombre: <input name='nombre'
type='text' required='required' /></label><br/>");
}
else {
document.write("<label>Nombre: <input name='nombre'
type='text' /></label><br/>");
}
if (Modernizr.inputtypes.range) {
document.write("<label>Edad: <input name='edad' type='range'
min='1' max='120' value='18' step='1' /></label><br/>");
}
else {
document.write("<label>Edad: <input name='edad' type='text'
size='3' maxlenght='3' value='18' /></label><br/>");
}
</script>
Otra posibilidad es cargar una hoja de estilos diferente de forma condicional a los
elementos que nuestro navegador soporte usando la función load de Modernizr.
A continuación vemos un ejemplo sencillo:
<script>
Modernizr.load({
test: Modernizr.input.placeholder && Modernizr.inputtypes.date,
yep : 'estilos1.css',
nope: 'estilos2.css'
});
</script>
En el ejemplo anterior “testeamos” dos elementos HTML5 (el tipo de input date y el
argumento placeholder) y en función de que estén soportados, o no, cargamos
una hoja de estilos diferente. Lógicamente, se trata de una función que
encontraremos más útil a la hora de probar el soporte de elementos de CSS3,
pero puesto que aún no los hemos tocado lo vemos aquí y más adelante
haremos algún otro ejemplo.
Dos apuntes importantes sobre esto. La función load de Modernizr no viene en la
versión de desarrollo de la libería y, por tanto, para usarla debemos de generar
una librería desde la opción de producción incluyendo esta utilidad (está
marcada por defecto en el apartado de extras) y todas las comprobaciones
adicionales de tipos, argumentos o propiedades que vayamos a hacer.
NOTA IMPORTANTE: Lo visto aquí se trata de un uso muy básico de estas librerías
que no incluye todas las posibilidades y comprobaciones previas que deberíamos
de hacer en un proyecto profesional. Para más información visita la página de
documentación:
http://www.modernizr.com/docs/
9.5. ETIQUETAS MULTIMEDIA
HTML5 incluye dos etiquetas, audio y video para facilitar la interpretación directa
por parte del navegador de contenido multimedia y embed para incrustar
archivos en formato flash.
Audio
La etiqueta audio nos permite insertar un archivo de audio en nuestra página
web sin necesidad de usar flash ni un plugin de javascript como hacíamos hasta
ahora. Será el propio navegador el que realice la reproducción y dependemos
tanto de que la etiqueta esté implementada como de los codecs de audio que
sea capaz de interpretar. El uso básico es este:
<audio src=”archivo_audio”>Su navegador no soporta la etiqueta
audio</audio>
Formatos de audio
Son cuatro los codecs de audio diferente a los que, en la actualidad, se da
soporte (de forma irregular) en los diferentes navegadores que implementan esta
etiqueta: ogg, mp3, wav y acc (ó m4a). Ningún navegador los implementa todos
ni ninguno de ellos es implementado por todos los navegadores. Al menos no por
el momento. Para solucionar esto tenemos la etiqueta source que nos permite
especificar diferentes archivos de forma que el navegador tenga elección:
<audio controls="controls" >
<source src="finaldetrayecto.ogg" />
<source src="finaldetrayecto.mp3" />
<source src="finaldetrayecto.wav" />
Etiqueta no soportada
</audio>
Cuando el navegador procese estas etiquetas se quedará con el primer archivo
que sea capaz de reproducir. Por tanto el orden en que aparezcan es
importante. Si nosotros preferimos que un navegador que pueda reproducir tanto
el .ogg como el .mp3 se quede con el primero, este debería de aparecer
también por delante. La etiqueta source tiene un parametro opcional para
especificar el tipo de archivo y el codec que usa el mismo, por ejemplo
type="audio/mpeg" o type="audio/ogg; codecs=vorbis"
Vídeo
La etiqueta video, su uso y problemática es muy similar a la de audio. El caso más
sencillo de uso sería este:
<video src="archivo_video"> Su navegador no soporta la etiqueta
video</video>
En este caso al usar la nueva etiqueta sin especificar autoplay ni controls si que se
reserva espacio para el primer fotograma del mismo pero la única forma de
reproducirlo sería pulsando con el botón derecho y usando el menú contextual
que nos suele ofrecer el navegador. El atributo src sigue siendo, pues, el único
obligatorio. Los parámetros controls, autoplay, loop y preload también existen y
su uso es idéntico a los vistos para la etiqueta audio. Los nuevos parámetros
disponibles para la etiqueta video son los siguientes:
width y height nos permiten controlar las dimensiones de visualización del vídeo. Si
no usamos ninguno de estos parámetros el navegador nos mostrará el vídeo con
sus dimensiones originales. Si especificamos uno cualquiera de ambos, pero no el
otro, se ajustará el no especificado para respetar la proporcionalidad de la
imagen.
El atributo poster nos permite definir una imagen estática que aparecerá mientras
que el vídeo se carga o hasta que el usuario decide comenzar su reproducción
pulsando el botón de play. Si no se especifica aparecerá el primer fotograma del
vídeo. Un ejemplo con algunos de estos argumentos:
<body>
<video src="video_ogv.ogv" controls="controls" width="700"
poster="thatsallfolk.jpg"> Su navegador no soporta la etiqueta
video</video>
</body>
Formatos de vídeo
Con los formatos de vídeo tenemos el mismo problema que con los de audio:
ningún navegador implementa todos los reconocidos ni existe ninguno de ellos
que sea soportado por todos los navegadores. Ogv, H.264, y WebM son las
posibilidades con las que jugamos en este caso. Ogv es el más libre, equivalente
al formato ogg de audio. H.264 y WebM son dos formatos propietarios, el primero
empujado por Apple y el segundo propiedad de Google. La etiqueta source se
puede usar también en este caso para proporcionar alternativas al navegador:
<video controls="controls" >
<source src="video_ogv.ogv" />
<source src="video_mp4.mp4" />
<source src="video_webm.webm" />
Su navegador no soporta la etiqueta video.
</video>
Archivos de Flash
HTML5 incorpora también la posibilidad de incrustar directamente archivos de
animación flash a través de la etiqueta embed:
<embed src="animacion_flash.swf" />
src es, al igual que en audio y video, el único atributo obligatorio. height y width
también son válidos y funcionan de igual forma que hemos descrito en la etiqueta
vídeo.
9.6. DIBUJO MEDIANTE LA ETIQUETA CANVAS
La etiqueta canvas define un objeto que actuará como un lienzo dibujable
mediante la llamada a funciones de javascript, proporcionando un potente
elemento de dibujo y diseño capaz de hacer competencia directa con flash. El
siguiente ejemplo dibuja un rcuadrado verde:
<script>
var canvas=document.getElementById("myCanvas");
var ctx = canvas.getContext("2d");
ctx.fillStyle = "#00ff00";
ctx.fillRect(0,0,100,100);
</script>
El contenido de la etiqueta canvas sólo se visualizará si nuestro navegador no la
soporta. canvas define un lienzo transparente susceptible de ser “rellenado”
mediante funciones de dibujo de un API de javascript incorporado al navegador.
En las dos primeras líneas del script del ejemplo anterior obtenemos primero una
referencia al objeto y en el segundo elegimos el API que usaremos para el dibujo
en función del argumento de la función. El contexto “2d” es el más extendido por
el momento aunque existe una especificación muy avanzada que permite el
dibujo en 3D usando el argumento “webgl” y las librerías de dibujo OpenGL, la
competencia libre de las DirectX:
http://www.khronos.org/registry/webgl/specs/latest/
Las dos líneas siguientes del ejemplo dibujan un rectángulo de 100 píxeles de
ancho por 100 de alto (un cuadrado, en realidad) que empieza en la
coordenada 0,0 (en la esquina superior derecha del canvas) y que se rellena de
color verde (#00ff00 en hexadecimal).
Veamos algunas de las funciones básicas del dibujo mediante canvas:
• fillStyle y strokeStyle son variables que nos permiten elegir el color, patrón o
gradiente de color que usaremos para relleno o línea de dibujo,
respectivamente. Para seleccionar un color podemos usar los mismos
métodos que en CSS (por ejemplo, “#c0ffee”, “#fff”, “orange” o
“rgb(255,160,23)”) pero siempre entre comillas como si fuese una cadena.
Para seleccionar un gradiente o un patrón asignamos el objeto donde está
definido el mismo (veremos como hacerlo mas adelante).
• fillRect y strokeRect son funciones que nos permiten dibujar un rectángulo
especificando cuatro parámetros: el punto de su vértice superior derecho y
las dimensiones de sus lados (x, y,ancho, alto).
• clearRect (x,y,ancho,alto) limpia el contenido del rectángulo especificado.
Para reiniciar el canvas completo podemos hacer un clearRect con las
dimensiones totales del mismo o reasignar el valor de ancho o de alto del
mismo, como por ejemplo así:
cv.width = cv.width;
trazadas.
• font es una variable que nos permite definir un tipo de letra. Recibe una
cadena con las características de este, de forma similar a la de la
propiedad font de CSS. Por ejemplo "bold italic 30px monospace"
• fillText(“texto”, x, y) es una función que escribe el texto que recibe como
primer parámetro a partir del punto definido mediante su segundo y tercer
parámetro. El color que escogerá será el último que hayamos definido
mediante fillStyle.
• strokeText(“texto”, x, y) hace lo mismo pero sólo dibujando la línea de
contorno del texto sin rellenarlo.
El trabajo con gradientes es bastante más delicado. En el siguiente ejemplo
vemos como definir un gradiente y rellenar un rectangulo con él:
gradiente = cv.createLinearGradient(250, 50, 350, 250);
gradiente.addColorStop(0, "#0f0");
gradiente.addColorStop(1, "#f00");
cv.fillStyle = gradiente;
cv.fillRect (250, 50, 100, 200);
La primera línea crea el objeto que contendrá el gradiente. Este será lineal e irá
desde el punto 250,50 hasta el 350,250. Las coordenadas están refereridas a la
superficie del canvas. Las dos siguientes líneas definen los colores inicial y final del
gradiente. Por último, usamos el objeto gradiente para definir la variable fillStyle y
dibujamos un rectángulo que se rellenará con el mismo. Nota que el rectangulo
coincide exactamente con la superficie del gradiente pero no tendría porque ser
así. El gradiente lineal puede crearse mediante una diagonal (como en el
ejemplo) pero también mediante una línea vertical u horizontal. También
podemos crear un radiante cónico mediante la siguiente función:
createRadialGradient(x0, y0, r0, x1, y1, r1)
Los tres primeros parámetros definen un círculo y los tres últimos otro. El gradiente
se creará dibujando una superficie cónica entre ambos círculos.
El dibujo de arcos se realiza mediante la función arc que recibe seis parámetros:
las coordenadas del centro, el radio, el punto de inicio y de final del arco en
radianes y una variable booleana que define si el arco se trazará en sentido
horario (false) o antihorario (true). El 0 de los grados estaría situado en el punto de
las tres en una esfera horaria. La constante Math.PI también nos resultará útil para
expresar los grados en radianes. Una vez definido el arco o el círculo podemos
llenarlo o dibujar sólo su línea mediante las funciones fill o stroke,
respectivamente. Veamos un ejemplo:
cv.beginPath();
cv.arc(150, 300, 70, 0, 2 * Math.PI, true);
cv.fillStyle = "#9cf";
cv.fill();
cv.beginPath();
cv.arc(100, 150, 200, 0, Math.PI, false);
cv.lineWidth = 10;
cv.strokeStyle = "black";
cv.stroke();
Tenemos disponibles tres funciones que nos van a permitir hacer transformaciones
sobre los elementos dibujados: translate(x,y), rotate (angulo) y scale(x,y). La
primear desplaza un elemento al punto indicado por las coordenadas que
enviamos como parámetros. La segunda va a rotar el elemento el número de
grados (en radianes) en el sentido de las agujas del reloj. Por último la tercera
permite cambiar la escala de un objeto indicando el factor de escalado
horizontal y vertical como parámetros. Todas ellas son acumulativas y se aplican
sobre todos los elementos que se vayan a dibujar desde el momento en que se
indican hasta que se desactivan. Un ejemplo:
for(j=0; j<6; j++){
cv.fillRect(400,50,75,75);
cv.translate(50, 50);
cv.rotate(Math.PI/16);
cv.scale(0.7, 0.7);
}
Canvas nos va a permir también interactuar con las coordenadas del ratón para
realizar gráficos interactivos. En el siguiente ejemplo del libro diveintohtml5 puedes
ver un ejemplo y pulsando sobre el enlace etiquetado como Rules of play te
explican lo fundamental de su funcionamiento:
http://diveintohtml5.ep.io/examples/canvashalma.html
API 2d:
http://www.whatwg.org/specs/webapps/currentwork/multipage/the
canvaselement.html
http://www.w3schools.com/html5/html5_ref_canvas.asp
9.7. GEOLOCALIZACIÓN
La geolocalización consiste en situar exactamente mediante coordendas
geográficas (longitud y latitud) al usuario que está viendo nuestra página web en
un plano. HTML5 introduce esta posibilidad de forma nativa mediante su propio
API y sin necesidad de usar librerías externas como hasta ahora. Los datos para
proporcionar dichas coordenadas pueden tomarse de tres formas diferentes, que
pueden ser complementarias y que, en escala de menor a mayor precisión son
las siguientes:
A través de la dirección IP pública de acceso a Internet proporcionada por
nuestro proveedor.
Por triangularización a través de la localización de los puntos de acceso wifi
a los que estemos conectados.
A través de un GPS integrado en nuestro equipo.
<script>
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
var latitud = position.coords.latitude;
var longitud = position.coords.longitude;
var altura = position.coords.altitude;
var precision = position.coords.accuracy;
var precisionAltura = position.coords.altitudeAccuracy;
document.getElementById("latitud").innerHTML = latitud;
document.getElementById("longitud").innerHTML =
longitud;
document.getElementById("altura").innerHTML = altura;
document.getElementById("precision").innerHTML =
precision;
document.getElementById("precisionAltura").innerHTML =
precisionAltura;
} );
}
else {
alert("Su navegador no soporta la geolocalización");
}
</script>
El script, que es donde usamos las funciones, tiene tres partes bien diferenciadas.
En primer lugar comprobamos si nuestro navegador soporta la función de
geolocalización interrogando a la variable navigator.geolocation. Si el resultado
es negativo mostramos una alerta y, en caso contrario, llamamos a una función
(navigator.geolocation.getCurrenPosition) a través de la cual obtenemos la latitud
y la longitud (positions.coords.latitude y position.coords.longitude), la precisión en
estas medidas según el método empleado para obtenerlas de los tres vistos en
metros (position.coords.accuracy), la altura (position.coords.accuracy) y la
precisión en la medida de esta (position.coords.altitudeAccuracy). La altura y la
precisión en ella sólo estará disponible si contamos con GPS y será cero en otro
caso. La última parte del script muestra los datos obtenidos en nuestra página
HTML usando la función Javascript document.getElementById que nos permite
sustituir el contenido de cualquier etiqueta (innerHTML) simplemente indicando el
ID de la misma.
Existen otros dos parámetros más además de los vistos en este ejemplo:
position.coords.heading que te proporciona la posición en grados respecto al
norte y position.coords.speed que, tomando como referencia la última posición y
el tiempo transcurrido entre una y otra, nos proporciona la velocidad a la que nos
movemos en metros por segundo.
Tienes otro ejemplo más completo que enlaza con el API de google maps para
mostrar las coordenadas en un plano aquí:
http://benwerd.com/lab/geo.php
9.8. MÁS COSAS
Existen muchas otras novedades en HTML5: funcionalidad de arrastrarsoltar (drag
drop) nativa en el navegador, un sistema mejorado de comunicaciones
bidireccionales con el servidor, cookies que permitiran almacenar más
información, etc. Muchas de estas nuevas funcionalidades, al igual que ocurre
con las antes vistas de geolocalización o de canvas, todas ellas se proporcionan
mediante el uso de un API externo realizado en javascript. Para seguir
aprendiendo y ampliando conocimientos, así como novedades y cambios de
última hora, la mejor referencia es la que proporciona el comité del W3C:
http://dev.w3.org/html5/spec/Overview.html
Y si quieres algo más didáctico puedes consultar el libro gratuito diveintohtml5:
http://diveintohtml5.ep.io/
10. CSS3
Los cambios en CSS3 han sido amplios y significativos para conseguir páginas web
más límpias y atractivas con un menor esfuerzo para el codifidador. Repasaremos
algunas de las más importantes pero no olvidemos que ni el estándar está
cerrado ni lo que hay es compatible con muchos de los navegadores que se
siguen usando ampliamente.
10.1. LOS NUEVOS SELECTORES DE CSS3
Pseudoelementos
Los pseudoelementos existentes en CSS2.1 se mantienen invariables en CSS3 salvo
un pequeño detalle: ahora se distinguen más claramente de las pseudoclases
usando :: delante en lugar de : como hasta ahora. Así, por ejemplo, usaremos
p::firstletter en lugar de p:firstletter como hasta ahora. Además, se añade un
nuevo pseudoelemento llamado ::selection que permite aplicar estilos
diferenciados al texto que el usuario ha seleccionado mediante el ratón o el
teclado.
Pseudoclases
El principal cambio en los selectores de CSS3 se encuentra aquí, donde se han
añadido 14 selectores nuevos.
El selector :root representa al elemento raíz del documento HTML que siempre ha
de ser la propia etiqueta html. No existe ninguna diferencia apreciable entre usarl
este o la etiqueta body, salvo que :root tendría una mayor especificidad.
:empty es un selector que demarca a todos los elementos vacíos de contenido y
sin hijos. Por ejemplo, tengamos el siguiente HTML:
<p>A paragraph.</p>
<p></p>
<p>Another paragraph.</p>
El párrafo central, vacío y sin hijos, sería el único que respondería a este selector:
p:empty{ width:200px; height: 40px; background: red; }
El selector :target sirve para seleccionar el elemento activo, o sea, aquél enlace
interno realizado mediante la etiqueta a y que acabas de visitar. Veamos este
código:
<p><a href="#enlace1">Ir al punto 1</a></p>
<p><a href="#enlace2">Ir al punto 2</a></p>
<p><a name="enlace1"></a>La, la, la...</p>
<p><a name="enlace2"></a>Bra, bra, bra...</p>
Y usemos esta regla combinada con el selector :before
:target:before{
content: "Estás aquí -> ";
}
El selector p:firstchild seleccionaría a los párrafos marcados en azul (el primer hijo
del body y el primer hijo del div), mientras que el selector p:lastchild seleccionaría
al párrafo marcado en rojo (el último hijo del div).
Similares a estos, tenemos un conjunto de selectores que se comportan de igual
forma pero con los elementos de un determinado tipo. Son :firstoftype, :lastof
type, onlyoftype, :nthoftype(n) y :nthlastoftype(n).
Nuevos selectores para uso con formularios
Existen, además, tres pseudoclases nuevas especificamente pensadas para su
uso con formularios que son :enabled, :disabled y :checked. Como su nombre
indica, aplican a los elementos de tipo input que cumplen con lo especificado en
el nombre del selector.
El selector :not()
Existe una última pseudoclase que trataremos aparte por su especial
importancia. Se trata del selector :not() que sirve para aplicar estilos a aquellos
elementos que no cumplen lo especificado ente paréntesis. Veamoslo con
algunos ejemplos. La siguiente regla se apliaría al contenido de cualquier div que
no fuese de la clase “comun”
div:not(.comun){color: red; }
La siguiente regla aplicaría a todos los elementos strong que están dentro de un
div pero que no están dentro de un p
div *:not(p) strong{color: red; }
En la siguiente, lo combinamos con un selector de atributo para seleccionar todos
los input salvo aquellos de tipo password.
input:not([type="password"]){color: red; }
Podemos usar también una lista como argumento del not. Lo siguiente se aplicará
a todos los titulares de nivel h2 salvo a aquellos que pertenecen a las clases
“politica” y “economia”:
h2:not(.politica, .economia){color: red; }
Y, por supuesto, se puede combinar con cualquier otro selector que hemos visto
antes: descendientes, etc.
Nuevos selectores de atributos
CSS3 añade, además, tres nuevos selectores de atributos que nos permiten un
control más fino. El primer selector que veremos, que usa el símbolo distintivo ^
sirve para seleccionar a etiquetas con un atributos cuyo valor empieza por una
cadena. En el ejemplo, a aquellas etiquetas a con un atributo href cuyo valor
empieze por mailto:
a[href^="mailto:"]{ color: blue; }
Por último, se incluye un selector que usa el símbolo * que selecciona a aquellas
etiquetas con un atribuyo cuyo valor contenga en cualquier posición la cadena
especificada. En el siguiente ejemplo, seleccionaría a cualquier imagen cuyo
título contenga la palabra importante.
Todos los selectores de atributo pueden combinarse entre si y, por supuesto, con
otros selectores como siempre. Por ejemplo, el siguiente selector cuadraría con las
imágenes cuyo titulo empieze por Estadísticas y contenga la palabra importante:
img[title^="Estadísticas"][title*="importante"] {border: 3px red dashed; }
Selector general de elementos hermanos
El último de los nuevos selectores de CSS3 amplía las posibilidades del selector de
hermanos existente en la versión anterior. Recordemos que el selector de
hermanos (que usaba el símbolo +) sólo se “activaba” cuando los dos elementos
de la regla eran hermanos e iban uno a continuación de otro de forma
inmediata. El nuevo selector usa el símbolo ~ y se activa cuando ambos
elementos son hermanos y el segundo va después del primero pero sin importar
que sea de forma inmediata. Veamos un ejemplo sencillo:
<h1>Titular 1</h1>
<h2>Titular 2</h2>
<p>Párrafo 1</p>
<div>
<h2>Titular 3</h2>
</div>
<h2>Titular 4</h2>
Una regla que use el selector de hermanos “clásico” ( por ej. h1+h2 {color: red;})
sólo seleccionaría el Titular 2, mientras que usando el selector general h1 ~ h2
{color: red; } seleccionaría el Titular 2 y el Titular 4.
9.2. LAS NUEVAS PROPIEDADES DE CSS3
Son muchas las propiedades añadidas en CSS3 y muy irregular la implantación en
los diferentes navegadores hasta el punto de que cada uno de ellos en muchos
casos ha desarrollado por su cuenta algunas de las implementaciones añadiendo
un prefijo distintivo que es o para ópera moz para firefox, webkit para
chrome, safari y otros que usen el Webkit y ms para Internet Explorer. Veremos
ejemplos de esto en varios de los apartados siguientes.
Gradientes y una nueva paleta de colores
CSS3 adopta (con ligeros cambios) la paleta de colores stándard de X11 que
consta de 147 elementos que podemos usar mediante un nombre característico.
La lista de colores X11 puedes consultarla aquí:
http://en.wikipedia.org/wiki/X11_color_names#Color_name_charts
En CSS3 los usaremos siempre en minúsculas y eliminando los espacios. Por
ejemplo, el color Blanched Almond pasaría a ser blanchedalmond.
Además, se incorpora la posibilidad de realizar degradados de forma que ya no
necesitamos usar imágenes estáticas para estos fines. Existen dos tipos de
gradientes: lineales y radiales. Veamos un ejemplo de cada uno:
background-image: linear-gradient(bottom, rgb(107,168,104) 13%,
rgb(204,137,180) 57%, rgb(164,219,245) 83%);
Desglosemos las particularidades de estas reglas. En primer lugar, cualquiera de
ellas puede ir en la propiedad background o backgroundimage. En segundo, el
valor de la propiedad debería de empezar por lineargradient o radialgradient
según el tipo de gradiente deseado. En tercer lugar, ambas deben de llevar un
número de parámetros separados por comas que serán un mínimo de tres en el
caso del lineal y de cuatro en el caso del radial. Veamos estos parámetros.
En el caso del lineal, el primer parámetro define la dirección del degradado
definiendo su inicio y pudiendo usar para ello una o dos de las palabras clave top,
bottom, right o left. A continuación se enumeran los colores del degradado (dos,
al menos pero pudiendo ser más). Cada color se define de cualquiera de las
formas admitidas habitualmente en CSS (con un valor hexadecimal, una palabra
distintiva o una función rgb) y pudiendo ir acompañado de un porcentaje que
define la suavidad de la trancisión entre uno y otro color.
En el caso del radial, el primer parámetro también define la dirección pero
además de las palabras claves anteriores tenemos otra, center, que en caso de
usarse debería de ir sola. El segundo parámetro define la forma del degradado y
puede ser circle o ellipse. A continuación irían los colores del degradado que
siguen el mismo formato explicado anteriormente y deberían de ser al menos dos.
Se trata esta de una de las propiedades de que hablábamos cuyo estándard no
se encuentra generalizado, así que si queremos que los principales navegadores
lo entiendad debemos repetir la regla con los diferentes prefijos distintivos. Por
ejemplo así:
p.degradadoradial{
background: radial-gradient(center, circle, white, #7DA5CD);
background: -o-radial-gradient(center, circle, white, #7DA5CD);
background: -moz-radial-gradient(center, circle, white, #7DA5CD);
background: -webkit-radial-gradient(center, circle, white, #7DA5CD);
background: -ms-radial-gradient(center, circle, white, #7DA5CD);
}
En el caso de los gradientes lineales, tenemos una herramienta web muy útil que
nos permite generar las reglas de forma automática aquí:
http://gradients.glrzad.com/
Fondos múltiples
CSS3 incorpora la posibilidad de incluir fondos múltiples en una misma caja sin
necesidad de tener que superponer una caja por cada imagen. La posición, y
características de cada imagen (repetición, etc.) se define también de forma
independiente para cada una de ellas. Veamos un par de ejemplos. Ahora definir
imágenes independientes para personalizar las esquinas de una caja es tan
sencillo como esto:
p.caja2{
padding: 60px;
border: 1px solid black;
Y si queremos solapar dos imágenes de fondo transparente en la misma caja nos
basta con hacer lo siguiente:
p.caja3{
width: 300px;
height: 400px;
background: url(imagen1.gif) bottom no-repeat,
url(imagen2.gif) bottom no-repeat;
}
Esquinas redondeadas y bordes decoradas
CSS3 incluye, por fin, la posibilidad de redondear bordes sin necesidad de
complicadas maniobras como hemos tenido que hacer hasta el momento. La
propiedad para hacer esto se llama borderradius. Su sintaxis es bien sencilla:
border-radius: 10px;
El valor indica el radio del arco de circunferencia que delimita el arco. Se puede
usar cualquier unidad de medida válida en CSS (pulgadas, em, etc.) y definir de
forma independiente cada una de las cuatro esquinas de la caja con la siguiente
sintaxis:
border-top-right-radius: 5px;
border-bottom-right-radius: 2em;
border-bottom-left-radius: 3em;
border-top-left-radius: 10px;
Con el formato abreviado podemos poner dos valores diferentes (el primero para
las esquina superior izquierda e inferior derecha y el otro para las otras dos) o
cuatro valores (uno para cada esquina empezando por la superior izquierda y
continuando en el sentido de las agujas del reloj):
border-radius: 10px 5px;
border-radius: 10px 5px 20px 25px;
Podemos usar también esquinas irregulares especificando dos radios diferentes:
uno para el eje X y otro para el eje Y. El formato cuando todas las esquinas son
iguales es este:
border-radius: 10px / 50px;
Cuando especificamos las esquinas una a una no necesitamos la barra:
border-top-right-radius: 5px 10px;
Y cuando las esquinas son diferentes pero las especificamos en grupo:
border-radius: 10px 10px / 20px 30px;
border-radius: 5px 10px 5px 10px / 10px 5px 10px 5px;
El redondeado de esquinas mediante esta propiedad se puede aplicar, además
de a una caja, también directamente a una tabla o a una imagen:
table {
width: 200px;
background-color: rgb(185,205,225);
text-align: center;
margin: 30px;
border: 1px solid gray;
border-radius: 20px;
}
#imgredondo {
width: 600px;
height: 150px;
margin: 0 auto;
border-radius: 1em;
border: 1px solid gray;
background-image: url(header.jpg);
}
Sombras
CSS3 incorpora dos propiedades que sirven par dar sombras a textos y cajas que
se llaman, respectivamente, textshadow y boxshadow. El formato básico de
ambas es similar. Veamos un par de ejemplos:
text-shadow: 15px 5px 10px orange;
box-shadow: -5px -10px 5em #000;
Opacidad
La propiedad opacity permite definir elementos parcial o totalmente
transparentes. El valor de esta propiedad es un número decimal entre 0 y 1, de
forma que 1 define la total opacidad (cuerpo sólido y no translucido) y el 0 la
total transpariencia.
opacity: .3;
Más control de la tipografía
En CSS3 se normaliza el uso de tipografías externas (como las de Google Fonts
que vimos hace ya tiempo) de forma que podamos usar cualquier tipo de fuente
disponible en la red en nuestras páginas. La incorporación y descarga de fuentes
se hace mediante la instrucción @fontface que tiene el siguiente formato:
@font-face {
font-family: "fantasia";
url("fantasia.ttf");
}
Si quisiéramos importar más de una fuente en nuestro proyecto necesitamos una
instrucción @fontface por cada una de ellas:
@font-face { font-family: vera; src: url("VeraSeBd.ttf"); }
@font-face { font-family: fantasia; src: url("fantasia.ttf"); }
@font-face {
font-family: fantasia;
src: url("fantasia.ttf");
src: url("fantasia.eot");
}
http://www.kirsle.net/wizards/ttf2eot.cgi
La nueva propiedad fontsizeadjust permite ajustar la altura de fuentes diferentes
mediante el uso de un coeficiente de ajuste. Sólo está implementada en Firefox:
font-size-adjust: .448;
Aunque puede aproximarse “a ojo” por el método de prueba y de error, existe un
recurso web que nos lista las fuentes disponibles en nuestro sistema y nos calcula
los coeficientes de ajuste:
http://www.brunildo.org/test/xheight.pl
La propiedad textoverflow decide lo que se hará con un texto que no cabe
completamente dentro de la caja en la que se encuentra. Tiene dos posibles
valores: clip (lo corta sin más) o (lo corta pero antes coloca tres puntos
suspensivos).
La propiedad fontstretch permitirá ajustar el ancho de los caracteres, pero por el
momento ningún navegador la implementa. Sus valores posibles son, de más
ancha a más estrecha, wider, narrower, ultracondensed, extracondensed,
condensed, semicondensed, normal, semiexpanded, expanded, extra
expanded y ultraexpanded.
La propiedad textwrap define como cortar las líneas de un texto y tampoco está
implementada por el momento. El valor normal, por defecto, indica que sólo se
pueden romper en los espacios y puntos. none indica que no pueden romperse,
unrestricted que pueden romperse entre dos caracteres cualesquiera y suppress
indica que no sólo no pueden romperse sino que se suprimen incluso los saltos de
línea manuales que hayamos colocado.
Columnas más fáciles
CSS3 dispone de siete propiedades que nos van a permitir mostrar el texto
mediante columnas de forma muy fácil. Son columns, columngap, columnfill,
columnspan y columnrule. Al igual que ocurre con las propiedades relacionadas
con los gradientes, esta colección de propiedades precisa llevar el prefijo del
navegador (moz, webkit) para funcionar en firefox y chrome pero no así en
opera. Explorer no las implementa aún. Los ejemplos a continuación se verán con
la sintaxis necesaria para mozilla salvo que se indique lo contrario.
columns define el número de columnas y el ancho mínimo esperado para cada
una de ellas. Puede “separarse” en dos propiedades independientes: column
width y columncount. El funcionamiento de ambos parámetros está íntimamente
relacionado pero la interpretación que hacen de ellos los diferentes navegadores
no es unánime. Mozilla, por ejemplo, da preferencia al número de columnas
mientras que Opera lo hace con el ancho de estas.
/* -moz-columns: 200px 3; */
-moz-column-width: 200px;
-moz-column-count: 3;
puede dividirse en tres propiedades distintas: columnrulewidth, columnrulestyle
y columnrulecolor. Los estilos permitidos son los mismos que los de un borde.
columngap define el espacio de separación entre columnas:
-moz-column-gap: 50px;
columnspan nos permite marcar algún elemento para que no se propague entre
diferentes columnas sino que esté completo en una de ellas. Imaginemos, por
ejemplo, un texto de entradilla o un titular. Tiene dos valores válidos: 1 y auto
según que deba limitarse a la primera columna o expandirse por las que precise.
Sólo lo implementan Opera y Chrome:
column-span: 1;
-webkit-column-span: 1
Transformaciones y trancisiones
La propiedad transform permite realizar diferentes transformaciones en 2D o 3D
sobre cualquier elemento (textos, cajas...) de nuestra web. Se trata de una de las
propiedades sobre las que aún se está trabajando (sobre todo en el terreno de
3D), implementada en todos los navegadores excepto el explorer, que hay que
usar con los prefijos propios de cada navegador (moz, webkit y o) y para la
que sólo veremos algunos ejemplos básicos.
Las transformaciones disponibles son rotación cambio de escala, deformación
oblicua y desplazamiento.
La rotación se puede expresar en grados (deg), radianes (rad), aplicarse a los ejes
X e Y por separado (rotateX y rotateY), a ambos por igual (rotate), y especificar un
número de grados positivo (en el sentido de las agujas del reloj) o negativo
(sentido contrario). Un ejemplo:
transform: rotate(-20deg);
-moz-transform: rotate(-20deg);
-webkit-transform: rotate(-20deg);
-o-transform: rotate(-20deg);
Los cambios de escala se especifican mediante un número entero o decimal que
-moz-transform: scale(2.5);
-webkit-transform: scale(2.5);
-o-transform: scale(2.5);
transform: scale(2.5);
Por último, translate nos permite definir un desplazamiento indicando este en una
medida concreta o en tanto por ciento, con valores positivos (abajo y hacia la
derecha) o negativos (arriba y hacia la izquierda). En este caso el valor de la
propiedad puede llevar uno o dos valores aplicando en el primer caso a ambos
ejes y en el segundo distinguiendo entre ambos:
-moz-transform: translate(100px, -50px);
-webkit-transform: translate(100px, -50px);
-o-transform: translate(100px, -50px);
transform: translate(100px, -50px);
La propiedad transition, por último, nos va a permitir realizar pequeños efectos de
animación sin necesidad de recurrir a javascript. Usamos para ello cuatro
propiedades: transitionproperty, transitionduration, transitiontimingfunction y
transitiondelay (o transition, sin más). Tampoco está disponible para Explorer.
Veamos primero un ejemplo y luego explicaremos los diferentes parámetros:
div.trancision {
margin: 10px auto;
padding: 10px;
text-align: center;
width: 200px;
height: 100px;
background-color: pink;
border: 5px solid blue;
div.trancision:hover{
border-right: 200px solid #9cf;
}
En la primera regla especificamos que la trancisión afectará al borde (trancision
property), que durará 5 segundos (trancisiontimingfunction) y que será rápida al
principio y más lenta al final (easeout). En la segunda regla, que se activará al
colocar el ratón encima, hacemos un cambio en el borde del elemento (tanto de
tamaño como de color) y la trancisión realizará la transformación entre el estado
original y el final con los datos especificados. Al retirar el ratón la animación se
invertirá.
La propiedad puede ser el ancho (width), el alto (height), el color, una lista de
propiedades diferentes separadas por coma o all (todas las propiedades que
cambien entre uno y otro estado). Los tiempos y retrasos se especifican en
segundos (s) o milisengudos (ms). Por último, el timingfunction puede ser
constante (linear), de lento a rápido (easein), de rápido a lento (ease o ease
out) o lento al principio y al final y más rápido en el centro (easeinout).
11.ENLACES, BIBLIOGRAFÍA Y REFERENCIAS
Es absolutamente imposible reseñar todas las ayudas y referencias que a lo largo
del año en que he redactado estos apuntes y durante mucho tiempo antes he
tomado de la web, libros de consulta, ejemplos de páginas encontradas en
Internet, etc. Pero si tuviera que quedarme con algunas como referencias “de
cabecera”, sería justo mencionar al menos a las siguientes.
http://www.librosweb.es/ es una colección de libros web escritos en
castellano que abarcan todas las disciplinas que hemos tocado aquí.
http://www.w3schools.com/ es, sin duda, la mejor referencia que existe en
la web cuando quieres consultar los argumentos de una etiqueta, los
valores que puede tomar o, simplemente, ver algunos ejemplos simples de
cualquier elemento HTML y/o CSS
http://meyerweb.com/ es la página web de Eric A. Meyer, un verdadero
monstruo de esta disciplina y artífice de la gran mayoría de trucos y
técnicas que hemos visto en el capítulo 7
Y, para los fanáticos del papel, si tengo que mencionar dos libros de mi biblioteca
personal sobre este tema me quedo con estos:
HTML5 y CSS3. Van Lancker, Luc. Ediciones ENI. 2011
CSS, Técnicas profesionales para el diseño moderno. Meyer, Eric A. Editorial
Anaya Multimedia. 2011