El gran libro de HTML5, CSS3 y Javascript
Segunda edición, 2013
© 2013 Juan Diego Gauchat
© 2013 MARCOMBO, S.A.
www.marcombo.com
Los códigos fuente para este libro se encuentran disponibles en www.minkbooks.com.
«Cualquier forma de reproducción, distribución, comunicación pública o transformación de esta obra solo puede ser realizada con la autorización de sus titulares, salvo excepción prevista por la ley. Diríjase a CEDRO (Centro Español de Derechos Reprográficos, www.cedro.org) si necesita fotocopiar o escanear algún fragmento de esta obra».
ISBN: 978-84-267-2064-1
Dedicado a aquellos
que ya no están a mi lado.
Introducción
1. Documentos HTML5
1.1 Componentes básicos
1.2 Una breve introducción a HTML
1.2.1 Etiquetas y elementos
1.2.2 Atributos
1.2.3 Elementos anteriores
1.3 Estructura global
1.3.1 <!DOCTYPE>
1.3.2 <html>
1.3.3 <head>
1.3.4 <body>
1.3.5 <meta>
1.3.6 <title>
1.3.7 <link>
1.4 La estructura del cuerpo del documento
1.4.1 Organización
1.4.2 <header>
1.4.3 <nav>
1.4.4 <section>
1.4.5 <aside>
1.4.6 <footer>
1.5 En el interior del cuerpo
1.5.1 <article>
1.5.2 <hgroup>
1.5.3 <figure>
y <figcaption>
1.5.4 <details>
y <summary>
1.6 Elementos nuevos y elementos antiguos
1.6.1 <mark>
1.6.2 <small>
1.6.3 <cite>
1.6.4 <address>
1.6.5 <wbr>
1.6.6 <time>
1.6.7 <data>
1.7 Nuevos atributos y viejos atributos
1.7.1 El atributo data–*
1.7.2 reversed
1.7.3 ping
y download
1.7.4 translate
1.7.5 contenteditable
1.7.6 Spellcheck
2. Estilos CSS y modelos de caja
2.1 CSS y HTML
2.2 Breve introducción a CSS
2.2.1 Reglas CSS
2.2.2 Propiedades
2.2.3 Estilos en línea
2.2.4 Estilos incrustados
2.2.5 Archivos externos
2.2.6 Referencias
2.2.7 Selectores nuevos
2.3 Aplicar CSS a nuestro documento
2.3.1 Modelos de caja
2.4 Modelo de caja tradicional
2.4.1 Documento HTML
2.4.2 Selector universal (*)
2.4.3 Títulos
2.4.4 Declaración de nuevos elementos HTML5
2.4.5 Centrar el cuerpo
2.4.6 Creación de la caja principal
2.4.7 La cabecera
2.4.8 Barra de navegación
2.4.9 Área principal y Barra lateral
2.4.10 Pie de página
2.4.11 Toques finales
2.4.12 box-sizing
2.5 Modelo de caja flexible
2.5.1 Contenedor flexible
2.5.2 Documento HTML
2.5.3 Display
2.5.4 Ejes
2.5.5 Propiedad Flex
2.5.6 flex-direction
2.5.7 order
2.5.8 justify-content
2.5.9 align-items
2.5.10 align-self
2.5.11 flex-wrap
2.5.12 align-content
3. Propiedades CSS3
3.1 Las nuevas reglas
3.1.1 CSS3 ha enloquecido
3.1.2 Documento HTML
3.1.3 border-radius
3.1.4 box-shadow
3.1.5 text-shadow
3.1.6 @font-face
3.1.7 linear-gradient
3.1.8 radial-gradient
3.1.9 rgb
3.1.10 hsla
3.1.11 outline
3.1.12 border-image
3.1.13 background
3.1.14 Columnas
3.2 Transformar
3.2.1 transform: scale
3.2.2 transform: rotate
3.2.3 transform: skew
3.2.4 transform: translate
3.2.5 Transformar todo en un elemento
3.2.6 Transformaciones dinámicas
3.2.7 Transformaciones 3D
3.3 Transiciones
3.4 Animaciones
4 Javascript
4.1 Breve introducción a Javascript
4.1.1 El lenguaje
4.1.2 Variables
4.1.3 Condicionales y bucles
4.1.4 Objetos
4.1.5 Constructores
4.1.6 El objeto Window
4.1.7 El objeto Document
4.2 Una introducción a los eventos
4.2.1 Atributos de eventos
4.2.2 Propiedades del evento
4.2.3 El método addEventListener()
4.3 Incorporar Javascript
4.3.1 En línea
4.3.2 Incrustado
4.3.3 Desde un archivo externo
4.4 Nuevos selectores
4.4.1 querySelector()
4.4.2 querySelectorAll()
4.4.3 matchesSelector()
4.5 Interactuar con el documento
4.5.1 Estilos Javascript
4.5.2 ClassList
4.5.3 Acceder a los atributos
4.5.4 dataset
4.5.5 Crear y borrar elementos
4.5.6 innerHTML, outerHtml
e insertAdjacentHTML
4.6 Las API
4.6.1 API nativas
4.6.2 API externas
4.7 Errores y depuración
4.7.1 Consola
4.7.2 console.log()
4.7.3 Evento error
5 Formularios
5.1 Formularios HTML
5.1.1 El elemento <form>
5.1.2. El elemento <input>
5.1.3 Más elementos de formulario
5.1.4 Enviar un formulario
5.2 Nuevos tipos de entrada
5.2.1 Tipo email
5.2.2 Tipo search
5.2.3 Tipo url
5.2.4 Tipo tel
5.2.5 Tipo number
5.2.6 Tipo range
5.2.7 Tipo date
5.2.8 Tipo week
5.2.9 Tipo month
5.2.10 Tipo time
5.2.11 Tipo datetime
5.2.12 Tipo datetime-local
5.2.13 Tipo color
5.3 Nuevos atributos
5.3.1 Atributo autocomplete
5.3.2 Atributos novalidate
y formnovalidate
5.3.3 Atributo placeholder
5.3.4 Atributo required
5.3.5 Atributo multiple
5.3.6 Atributo autofocus
5.3.7 Atributo pattern
5.3.8 Atributo form
5.4 Nuevos elementos de los formularios
5.4.1 El elemento <datalist>
5.4.2 El elemento <progress>
5.4.3 El elemento <meter>
5.4.4 El elemento <output>
5.5 Nueva pseudo-clases
5.5.1 valid
e invalid
5.5.2 optional
y required
5.5.3 in-range
y out-of-range
5.6 Formularios API
5.6.1 SetCustomValidity()
5.6.2 El evento invalid
y el método CheckValidity()
5.6.3 Validación en tiempo real con ValidityState
5.6.4 Restricciones de validez
6 Vídeo y audio
6.1 Vídeo con HTML5
6.1.1 El elemento <video>
6.1.2 Atributos del elemento <video>
6.1.3 Formatos de vídeo
6.2 Audio con HTML5
6.2.1 El elemento <audio>
6.3 Subtítulos
6.3.1 El elemento <track>
6.4 Programar un reproductor multimedia
6.4.1 Diseño de un reproductor de vídeo
6.4.2 Aplicación
6.4.3 Eventos
6.4.4 Código Javascript
6.4.5 Métodos
6.4.6 Propiedades
6.4.7 Código en funcionamiento
7 API TextTrack
7.1 API TextTrack
7.1.1 Lectura de pistas o tracks
7.1.2 Lectura de entradas o cues
7.1.3 Adición de pistas nuevas
8 API Fullscreen
8.1 Basta de ventanas
8.1.1 Ir a pantalla completa
8.1.2 Estilos “Fullscreen”
9. API Stream
9.1 Capturar contenidos
9.1.1 Acceder a la cámara web
9.1.2 Objetos MediaStreamTrack
9.1.3 Método stop()
10 API Canvas
10.1 Los gráficos para la Web
10.1.1 El elemento <canvas>
10.1.2 GetContext()
10.2 Dibujar en el lienzo
10.2.1 Dibujar rectángulos
10.2.2 Color
10.2.3 Degradados
10.2.4 Crear trazados
10.2.5 Estilos de línea
10.2.6 Texto
10.2.7 Sombras
10.2.8 Transformaciones
10.2.9 Restaurar el estado
10.2.10 globalCompositeOperation
10.3 Procesamiento de Imágenes
10.3.1 drawImage()
10.3.2 Datos de imagen
10.3.3 cross-Origin
10.3.4 Extracción de los datos
10.3.5 Patrones
10.4 Animaciones sobre lienzo
10.4.1 Animaciones elementales
10.4.2 Animaciones profesionales
10.5 Procesar vídeo en el lienzo
10.5.1 Mostrar vídeo en el lienzo
10.5.2 Aplicación de la vida real
11. WebGL y Three.js
11.1 Lienzo en 3D
11.2 Three.js
11.2.1 Renderer
11.2.2 scene
11.2.3 Cámara
11.2.4 Mallas
11.2.5 Geométricas primitivas
11.2.6 Materiales
11.2.7 Implementación
11.2.8 Transformaciones
11.2.9 Luces
11.2.10 Texturas
11.2.11 Aplicación UV
11.2.12 Texturas de lienzo
11.2.13 Texturas de vídeo
11.2.14 Cargar modelos 3D
11.2.15 Animaciones en 3D
12 API Pointer Lock
12.1 Nuevo puntero del ratón
12.1.1 Capturar el ratón
12.1.2 pointerLockElement
12.1.3 movementX
y movementY
13 API Drag and Drop
13.1 Arrastrar y soltar en la web
13.1.1 Eventos
13.1.2 DataTransfer
13.1.3 dragenter, dragleave
y dragend
13.1.4 Seleccionar una fuente válida
13.1.5 setDragImage()
13.1.6 Archivos
14 API Web Storage
14.1 Dos sistemas de almacenamiento
14.2 SessionStorage
14.2.1 Implementar un sistema de almacenamiento de datos
14.2.2 Crear datos
14.2.3 Leer datos
14.2.4 Eliminar datos
14.3 LocalStorage
14.3.1 Evento storage
15 API IndexedDB
15.1 Una API de bajo nivel
15.1.1 Base de datos
15.1.2 Objetos y Almacenes de objetos
15.1.3 Índices
15.1.4 Transacciones
15.1.5 Métodos de almacenes de objetos
15.2 Implementar IndexedDB
15.2.1 Plantilla
15.2.2 Abrir la base de datos
15.2.3 Almacenes de objetos e índices
15.2.4 Agregar objetos
15.2.5 Leer objetos
15.2.6 Finalizar y probar el código
15.3 Listar datos
15.3.1 Cursores
15.3.2 Cambio de orden
15.4 Eliminar datos
15.5 Buscar datos
16 API File
16.1 Almacenamiento de archivos
16.2 Procesar archivos de usuario
16.2.1 Plantilla
16.2.2 Leer archivos
16.2.3 Propiedades de archivos
16.2.4 Blobs
16.2.5 Eventos
16.3 Crear archivos
16.3.1 Documento HTML
16.3.2 El disco duro
16.3.3 Crear archivos
16.3.4 Crear directorios
16.3.5 Listar archivos
16.3.6 Manejar archivos
16.3.7 Mover archivos
16.3.8 Copiar archivos
16.3.9 Eliminar
16.4 Contenido de archivos
16.4.1 Escribir contenido
16.4.2 Agregar contenido
16.4.3 Leer contenido
16.5 Acceder a los archivos
16.6 Sistema de archivos real
17 API Geolocation
17.1 Encontrar su lugar
17.1.1 Documento HTML
17.1.2 getCurrentPosition(ubicación)
17.1.3 getCurrentPosition(ubicación, error)
17.1.4 getCurrentPosition(ubicación, error, configuración)
17.1.5 watchPosition(ubicación, error, configuración)
17.1.6 Usos prácticos con Google Maps
18 API History
18.1 La interfaz de API History
18.1.1 Navegar por la Web
18.1.2 Nuevos métodos
18.1.3 URL falsas
18.1.4 La propiedad state
18.1.5 Un ejemplo de la vida real
19 API Offline
19.1 El manifiesto
19.1.1 El archivo manifiesto
19.1.2 Categorías
19.1.3 Comentarios
19.1.4 Uso del archivo manifiesto
19.2 API Offline
19.2.1 Los errores
19.2.2 online
y offline
19.2.3 Estado del caché
19.2.4 Progreso
19.2.5 Actualización del caché
20 API Page Visibility
20.1 El estado de visibilidad
20.1.1 Estado actual
20.1.2 Una mejor experiencia
20.1.3 Detector completo
21 Ajax Level 2
21.1 XMLHttpRequest
21.1.1 Recuperar datos
21.1.2 Propiedades de respuesta
21.1.3 Eventos
21.1.4 Envío de datos
21.1.5 Solicitudes de orígenes cruzados
21.1.6 Cargar archivos
21.1.7 Una aplicación real
22 API Web Messaging
22.1 Mensajería entre documentos
22.1.1 Enviar un mensaje
22.1.2 Comunicar con un iframe
22.1.3 Filtros y orígenes cruzados
23 API WebSocket
23.1 WebSockets
23.1.1 Servidor WebSocket
23.1.2 Instalación y ejecución de un servidor WS
23.1.3 Constructor
23.1.4 Métodos
23.1.5 Propiedades
23.1.6 Eventos
23.1.7 Documento HTML
23.1.8 Iniciar la comunicación
23.1.9 Aplicación completa
24 API WebRTC
24.1 Llega la revolución
24.1.1 El viejo paradigma
24.1.2 El nuevo paradigma
24.1.3 Requisitos
24.1.4 RTCPeerConnection
24.1.5 Candidato ICE
24.1.6 Oferta y respuesta
24.1.7 SessionDescription
24.1.8 Flujos de medios o streams
24.1.9 Eventos
24.1.10 El final
24.2 Ejecutar WebRTC
24.2.1 Servidor de señalización
24.2.2 Servidores ICE
24.2.3 Documento HTML
24.2.4 El código Javascript
24.2.5 Aplicación de la vida real
24.3 Canales de Datos
24.3.1 Creación de canales de datos
24.3.2. Envío de datos
25 API Web Audio
25.1 Estructura de nodos de audio
25.1.1 Los nodos de audio
25.1.2 Contexto Audio
25.1.3 Fuentes de audio
25.1.4 Nodos de conexión
25.1 Sonidos para la Web
25.2.1 Dos nodos básicos
25.2.2 Bucles y tiempos
25.2.3 Crear AudioNodes
25.2.4 AudioParam
25.2.5 GainNode
25.2.6 DelayNode
25.2.7 BiquadFilterNode
25.2.8 DynamicsCompressorNode
25.2.9 ConvolverNode
25.2.10 PannerNode
y sonido 3D
25.12.11 AnalyserNode
26 API Web Workers
26.1 Hacer el trabajo duro
26.1.1 Crear un trabajador
26.1.2 Enviar y recibir mensajes
26.1.3 Detectar errores
26.1.4 Detener el trabajador
26.1.5 API asíncronas
26.1.6 Importación de scripts
26.1.7 Trabajador compartido
Conclusiones
Trabajando para el mundo
Las alternativas
Modernizr
Bibliotecas
Google Chrome Frame
Trabajar para la nube
Las API que no han sido incluidas
Lo que debe saber
Palabras finales del autor
HTML5 es mucho más que una nueva versión del viejo lenguaje. Incluso es mucho más que una mejora respecto al lenguaje anterior, que ya podía ser considerado “tecnológicamente antiguo”. Realmente es un nuevo concepto diseñado para la creación de sitios web y aplicaciones en la era de los dispositivos móviles, el cloud computing y las redes.
Todo comenzó hace mucho tiempo con una sencilla versión de HTML que fue desarrollada para crear estructuras básicas de páginas web, organizar contenidos y compartir información. Es preciso recordar que el lenguaje y la misma Web nacieron sobre todo con la intención de comunicar información a través de textos.
El alcance limitado de HTML hizo que las empresas comenzaran a desarrollar lenguajes y aplicaciones que han dotado a la web de nuevas características y han elevado la experiencia del usuario hasta niveles antes inimaginados. Aparecieron poderosos y populares complementos: juegos simples y sencillas animaciones dieron paso a sofisticadas aplicaciones que cambiaron el concepto de la Web para siempre. De todas las opciones propuestas, Java y Flash fueron las más exitosas. Fueron adoptadas masivamente y unánimemente consideradas un sinónimo del futuro de la red. Sin embargo, ante el aumento avasallador del número de usuarios, Internet dejó de ser solo una manera de conectar a amantes de ordenadores para convertirse en un medio indispensable tanto para los negocios como para la interacción social. Y en este contexto, las limitaciones presentes en ambas tecnologías se convirtieron en su sentencia de muerte.
Java y Flash tienen una importante limitación en común y es la falta de integración. Ambas fueron concebidas como complementos: algo que se insertaba en una estructura con la que solo compartían un espacio en la pantalla. No había comunicación e integración entre aplicaciones y documentos. Esta falta de integración pronto se convirtió en un grave problema que allanó el camino para la evolución de un lenguaje que comparte espacio en el documento con HTML y que no se ve afectado por las limitaciones de sus predecesores.
Javascript, el lenguaje interpretado incorporado en los navegadores, sin duda era la mejor manera de mejorar la experiencia del usuario y proporcionar mayor funcionalidad a la Web. Sin embargo, después de algunos años de intentos fallidos de promoverlo, y ante el mal uso que se hizo del lenguaje, el mercado no llegó a adoptarlo plenamente y su popularidad comenzó a decaer.
Los detractores tenían buenas razones para oponerse a su uso. En ese momento, Javascript no podía reemplazar la funcionalidad de Java y Flash. Y aun cuando era evidente que Java y Flash estaban limitando el alcance de las aplicaciones web y aislaban el contenido de la Web, características como el streaming de vídeo, que se estaban convirtiendo en una parte importante de la web, solo eran ofrecidas de forma efectiva a través de estas tecnologías.
A pesar de su dominio, Java fue decayendo cada vez más. La compleja naturaleza del lenguaje, su lenta evolución y su falta de integración fueron minando su importancia hasta el punto de que hoy en día prácticamente no se utiliza en las aplicaciones web tradicionales. Con Java fuera de juego, los desarrolladores centraron su atención en Flash. Sin embargo, el hecho de que Flash comparte características básicas con su competidor lo hace susceptible a la misma suerte.
Mientras que se desarrollaba esta competencia silenciosa e intensa, el software para acceder a la Web continuaba evolucionando. Junto a las nuevas características y a las técnicas más rápidas de acceso a Internet, los navegadores también estaban mejorando sus motores de Javascript. La mayor potencia trajo consigo nuevas oportunidades que Javascript estaba dispuesto a aceptar.
En algún momento durante este proceso se hizo evidente para algunos desarrolladores que ni Java ni Flash serían capaces de proporcionar las herramientas necesarias para crear las aplicaciones que demandaba un número creciente de usuarios. Estos desarrolladores comenzaron a aplicar Javascript en sus aplicaciones de una manera que no se había visto nunca antes. La innovación y los resultados sorprendentes así obtenidos atrajeron la atención de más programadores y pronto nació la “Web 2.0”. Y a partir de ese momento, la percepción que la comunidad de desarrolladores tenía de Javascript cambió radicalmente.
Javascript es definitivamente el lenguaje que ha permitido a los desarrolladores innovar y crear cosas que nadie había hecho antes en la Web. En los últimos años, a los programadores y diseñadores web de todo el mundo se les han ocurrido métodos increíbles para superar las limitaciones de esta tecnología y sus deficiencias iniciales en cuanto a portabilidad. Pronto se hizo evidente que Javascript, junto a HTML y CSS, es el tercer elemento de una perfecta combinación de lenguajes, necesaria para la evolución de la Web.
HTML5 es el fruto de esa combinación, el pegamento que mantiene todo unido. HTML5 propone normas para todos los aspectos de la Web, así como un propósito claro para cada tecnología involucrada. Actualmente, HTML proporciona los elementos estructurales, CSS se encarga de la presentación para hacerlos más atractivo y útiles, y Javascript tiene el poder necesario para proporcionar la funcionalidad y crear aplicaciones web completas.
Los límites entre sitios web y aplicaciones finalmente han desaparecido. Las tecnologías necesarias están listas. La promesa es el futuro de la Web, y la evolución y la combinación de estas tres tecnologías (HTML, CSS y Javascript) es una alianza de gran alcance que ha convertido a Internet en la plataforma líder para el desarrollo. HTML5 está claramente a la cabeza.
El lenguaje HTML5 proporciona tres características básicas: estructura, estilo y funcionalidad. Nunca fue declarado oficialmente pero, aun cuando algunas API (Interfaces de programación de apliaciones) de Javascript y la especificación completa CSS3 no forman parte del lenguaje, HTML5 es considerado un producto que surge de la combinación de HTML, CSS y Javascript. Estas tecnologías son altamente confiables y actúan como una unidad organizada de acuerdo a la especificación HTML5. HTML es el encargado de la estructura, CSS presenta esa estructura y su contenido en la pantalla, y Javascript hace el resto, que (como veremos más adelante en este libro) es muy importante.
A pesar de la integración de estas tecnologías, la estructura sigue siendo la parte fundamental de un documento. Proporciona los elementos necesarios para distribuir el contenido estático o dinámico, y es también una plataforma básica para las aplicaciones.
Con la variedad de dispositivos que acceden a Internet y la diversidad de interfaces que se utilizan para interactuar con la Web, un aspecto tan básico como la estructura se convierte en una parte vital del documento. Ahora bien, la estructura debe proporcionar forma, organización y flexibilidad, y debe ser tan sólida como los cimientos de una casa.
Para trabajar con HTML5, ya sea en la creación de páginas web o de aplicaciones, primero necesitamos saber cómo se construye esa estructura. La creación de una base sólida nos ayudará después aplicar otros componentes para sacar el máximo provecho de estas nuevas posibilidades. Por ello vamos a empezar con lo básico, paso a paso. En este primer capítulo, aprenderá lo que es HTML y cómo construir una estructura esencial utilizando los nuevos elementos de este lenguaje.
El HyperText Markup Language (HTML) es un lenguaje de programación. A diferencia de otros lenguajes, no está compuesto por instrucciones, sino por un conjunto de etiquetas que organizan y declaran el propósito de cada contenido del documento.
En el sentido estricto, HTML es un texto escrito con una sintaxis particular que el navegador es capaz de leer y aplicar. Se trata de un lenguaje que fue creado para compartir a través de Internet no solo el texto incluido en los documentos, sino también su formato.
Precisamente es esta posibilidad de diferenciar las partes importantes del contenido de un documento proporcionada por el lenguaje HTML lo que ha abierto la puerta a la creación de la Web como la conocemos hoy en día.
Efectivamente, el código HTML no es un conjunto secuencial de instrucciones sino es un lenguaje de marcado, un conjunto de etiquetas que por lo general vienen en pares y que pueden ser anidadas (contenidas dentro de otros elementos). Estas etiquetas son palabras clave y atributos encerrados entre corchetes angulares (por ejemplo, <html lang=“en”>
). Por lo general, nos referimos a una etiqueta individual simplemente como “etiqueta” y a un par de etiquetas de apertura y cierre como un “elemento”. Observe el siguiente ejemplo:
Algunos elementos de HTML son simples, es decir, están compuestos de una sola etiqueta, pero la mayoría requiere una etiqueta de apertura y otra de cierre. En el ejemplo del Código 1-1 podemos ver varias etiquetas, una tras otra, con texto e incluso con otras etiquetas en medio. Compare las etiquetas de apertura y de cierre de este ejemplo, y verá que la de cierre se distingue por tener una barra antes de la palabra clave. Por ejemplo, la etiqueta <html>
indica el inicio del código HTML, mientras que </html>
declara el final. El navegador tratará todo lo que se encuentre en medio de estas etiquetas como código HTML.
En este ejemplo, aunque se trata de un código muy sencillo, ya podemos ver una estructura compleja. En la primera línea, hay una sola etiqueta con la definición del documento seguido de la etiqueta de apertura <html lang=“en”>
. Entre las etiquetas <html>
insertamos otras etiquetas, como las que representan a la cabeza y el cuerpo del documento (<head>
y <body>
), que también vienen en pares y encierran contenido adicional, como texto o de otros elementos (<title>
).
Como se puede ver, para construir un documento HTML, las etiquetas aparecen una tras otra y también entre otras etiquetas, lo que da como resultado en una estructura en árbol, en la que la etiqueta <html>
es la raíz.
En general, todo elemento puede ser anidado, ser un contenedor o ser contenido por otros elementos. Básicamente, elementos estructurales especiales como <head>, <html>
o <body>
tienen un lugar específico en un documento HTML, pero el resto de elementos son flexibles, como veremos más adelante en este mismo capítulo.
Como podrá darse cuenta, la etiqueta de apertura <html>
del Código 1-1 no solo se compone de la palabra clave y el corchete angular, sino también de la cadena de texto lang=“es”
. Se trata de un atributo con un valor. El nombre del atributo es lang
y mediante el símbolo = se le ha asignado el valor “es”
. Los atributos proporcionan información adicional acerca de un elemento HTML. En este caso, se declara que el lenguaje humano del código HTML es el español.
Los atributos siempre se declaran dentro de la etiqueta de apertura y pueden tener una estructura nombre=valor, tal como sucede con el atributo lang
de nuestro ejemplo, o representar un valor booleano, en cuyo caso su presencia indica la condición verdadera o falsa (por ejemplo, el atributo disabled
sin un valor específico deshabilita un elemento de formulario).
Dado que el lenguaje HTML pasó de tener un propósito general para centrarse más en la creación de la estructura del documento, la mayoría de los atributos clásicos han dejado de usarse y algunos han sido sustituidos incluso completamente por las propiedades CSS, como veremos en los capítulos siguientes. Sin embargo, algunos siguen siendo útiles; especialmente cuatro atributos genéricos que tienen especial importancia en el desarrollo de sitios y aplicaciones web en HTML5:
class:
Este atributo permite trabajar con un grupo de elementos que comparten algunas características. Por ejemplo, es posible asignar el mismo tipo de fuente y estilos a textos ubicados en diferentes partes del documento simplemente asignando un valor para el atributo class
.
id:
Este atributo nos permite asignar un identificador único para cada elemento. Es la mejor manera de tener acceso a partir de CSS o Javascript a un elemento específico.
style:
Este atributo nos permite asignar estilos CSS para cada elemento, de forma individual. Como veremos en el capítulo 2, es recomendable evitar el uso de este atributo y, en cambio, asignar estilos a los elementos HTML haciendo referencia a sus atributos class
e id
.
name:
Es un viejo atributo que aún tiene aplicaciones cuando trabajamos con formularios. Simplemente declara un nombre personalizado para el elemento. Para obtener más información, consulte el Capítulo 5.
Además de los mencionados, hay atributos más específicos, como el atributo lang
del elemento <html>
del que también ya hemos hablado. Otros dos que vale la pena mencionar son el atributo href
para el elemento <link>
y el elemento <a>
, así como
el atributo src
para elementos multimedia como son <img>, <video>, <audio>
, etc, que indican la ruta para cargar el archivo o acceder a él.
Pruebe el ejemplo siguiente en su navegador:
En HTML5 algunos elementos han quedado obsoletos porque algunos elementos han cambiado y se han añadido otros nuevos. Entre ellos, hay algunos elementos que ya no se consideran parte del lenguaje, como <center>, <frame>
o <font>
. El último es tal vez el más importante. El elemento <font>
, ahora generalmente sustituido por el elemento <span>
, se utilizó hasta HTML4 para mostrar texto en la pantalla.
Otros elementos como <i>
o <b>
, que antes eran utilizados para enfatizar texto en pantalla, ahora tienen un significado diferente. Al mismo tiempo, nuevos elementos como <mark>, <address>
o <time>
, por ejemplo, fueron añadidos para proporcionar una mejor forma de describir y representar el contenido del documento.
Los documentos HTML están estrictamente organizados. Cada parte del documento está diferenciada, declarada y encerrada entre etiquetas específicas. En esta sección vamos a ver cómo construir la estructura global de un documento HTML y cómo ha cambiado este proceso en HTML5.
<!DOCTYPE>
En primer lugar, es necesario que indicar el tipo de documento que se va a crear, porque los navegadores son capaces de procesar diferentes tipos de archivos. Para asegurarse de que el documento sea interpretado como código HTML de forma correcta, es necesario declarar el tipo de documento al principio del mismo. En HTML5 es simple:
Tenga en cuenta que esta línea debe ser la primera línea de su archivo y que no debe haber espacios ni líneas antes de ella. De esta forma se activa un modo y se fuerza a los navegadores a interpretar HTML5 si es posible, o ignorarlo si no es el caso.
<html>
Después de declarar el tipo de documento, tenemos que construir la estructura de árbol del HTML. Como siempre, el elemento raíz de este árbol es <html>
. Éste es el elemento que contendrá todo el código HTML.
El atributo lang
en la etiqueta de apertura <html>
es el único que necesitará indicar en HTML5. Recuerde que hemos dicho que este atributo define el idioma que se utiliza para el contenido del documento, que en este caso es, obviamente, español.
Para conocer otros idiomas para el atributo lang, puede seguir este enlace: http://www.w3schools.com/tags/ref_language_codes.asp
<head>
Continuemos avanzando en la construcción del documento. El código HTML insertado entre las etiquetas <html>
ha de estar dividido en dos secciones principales. Tal como sucedía en versiones anteriores de HTML, la primera sección es la cabeza (head
) y la segunda el cuerpo (body
). Así que el próximo paso será la creación de estas dos secciones en el código utilizando las etiquetas <head>
y <body>
.
Evidentemente, el elemento <head>
va primero y, como el resto de los elementos estructurales, tiene una etiqueta de apertura y una etiqueta de cierre.
La etiqueta en sí no ha cambiado respecto a versiones anteriores y su propósito también sigue siendo exactamente el mismo. Dentro de las etiquetas <head>
vamos a definir el título de nuestra página web, a declarar la codificación de caracteres, a proporcionar información general sobre el documento y a incorporar archivos externos con los estilos, los scripts e incluso las imágenes necesarias para identificar la página. A excepción del título y de algunos iconos, la información incorporada al documento entre las etiquetas <head>
normalmente no está a la vista del usuario.
<body>
La siguiente sección en un documento HTML contiene la parte visible del documento y se identifica con la etiqueta <body>
. Se trata, nuevamente, de una etiqueta que no ha cambiado respecto a las versiones anteriores de HTML.
<meta>
A continuación construiremos el elemento head
del documento. El contenido de este elemento ha sufrido algunos cambios y uno de ellos es la etiqueta que define la codificación de caracteres del documento, que es la etiqueta meta
, que indica cómo debe presentarse el texto en la pantalla.
La novedad de este elemento en HTML5, como en la mayoría de los casos, es la simplificación alcanzada. La nueva etiqueta <meta>
para la codificación de caracteres es más corta y más simple. Por supuesto, puede utilizar la codificación que prefiera en lugar de utf-8 y además puede añadir las etiquetas <description>
o <keywords>
, tal como mostramos en el ejemplo siguiente.
Debe saber que en HTML5, no es necesario cerrar las etiquetas individuales con una barra al final, pero es recomendable hacerlo por razones de compatibilidad. A continuación, añadimos al código anterior barras inclinadas:
<title>
La etiqueta <title>
, tal como sucedía en versiones anteriores, simplemente indica el título del documento, de manera que no hay ninguna novedad que comentar sobre la misma.
<link>
Otra parte importante del elemento <head>
o la cabeza de un documento HTML5 es el elemento <link>
. Este elemento se utiliza para incorporar estilos, scripts, imágenes o iconos desde archivos externos en el documento. Uno de sus usos más habituales es la incorporación de estilos mediante la inserción de un archivo CSS externo.
Como en el lenguaje HTML5 no es necesario indicar el tipo de hoja de estilo, el atributo type
ha sido eliminado. Ahora solo son necesarios dos atributos para incorporar la hoja de estilo: rel
y href
. El nombre del atributo rel
significa relación y establece la relación entre el documento y el archivo incorporado. En este caso, el atributo rel
tiene el valor stylesheet
que indica al navegador que el archivo misestilos.css es un archivo CSS que contiene los estilos necesarios para interpretar la página.
El atributo href
, como hemos explicado antes, declara la ruta para cargar el archivo. Este archivo, por supuesto, debe tener un contenido adecuado al valor del atributo rel
. En este caso, la ruta apunta a un archivo CSS que contiene los estilos para el documento (stylesheet
).
Con la última instrucción insertada, podemos dar por terminada la cabeza de nuestro documento. Ahora estamos en condiciones de agregar contenido a las etiquetas <body>
para que comience la magia.
La estructura del cuerpo del documento, que es el código que se encuentra entre las etiquetas <body>
, es la que generará la parte visible del mismo: el código que realmente le dará forma a la página web.
El lenguaje HTML siempre ha ofrecido distintas formas de construir y organizar la información visible en el cuerpo del documento. Uno de los primeros elementos utilizados para este fin era el elemento <table>
, que permitía a los autores organizar datos, textos, imágenes y herramientas en filas y columnas de celdas, a pensar de que no había sido concebido para este fin.
El elemento <table>
representó una de las primeras revoluciones de la web, un gran paso adelante en la visualización del documento que mejoró la experiencia de los usuarios. Con el tiempo otros elementos sustituyeron la función de este elemento pues proporcionaban una manera diferente de hacer lo mismo, pero más rápido y con menos códigos, facilitando así la creación, el mantenimiento y la portabilidad el sitio.
El elemento <div>
fue uno de los que adquirió gran importancia. Con la aparición de nuevas aplicaciones web interactivas y la integración de HTML, CSS y Javascript, su uso se convirtió en una práctica habitual. Pero al igual que sucedía con el elemento <table>
, el elemento <div>
no proporciona mucha información sobre las partes del cuerpo del documento que representa. Cualquier cosa, desde imágenes hasta menús, textos, enlaces, scripts, formularios, etc., puede ir entre las etiquetas <div>
de apertura y cierre. En otras palabras, la palabra clave <div>
solo establece una división en el cuerpo, como las celdas de una tabla, pero no da una idea de qué tipo de división que es o cuál es el propósito de esa división y de su contenido.
Esta información, que es irrelevante para los usuarios, resulta en cambio de una importancia crucial para que los navegadores puedan realizar una correcta interpretación del contenido. Tras la revolución de los nuevos dispositivos móviles y las nuevas formas de acceder a la web, esta correcta identificación de cada una de las partes de una web ha adquirido una enorme relevancia.
Considerando estas circunstancias, HTML5 ha incorporado nuevos elementos que ayudan a identificar cada sección del documento y a organizar el cuerpo del mismo. En HTML5 las secciones más importantes se encuentran por tanto claramente diferenciadas y la estructura principal ya no está definida por las etiquetas <div>
y <table>
.
La Figura 1-1 representa un diseño regular que actualmente es utilizado en la mayoría de los sitios web. A pesar del hecho de que cada diseñador crea sus propios diseños, en general, podremos identificar las siguientes secciones en prácticamente cualquier sitio web:
En la parte superior, que hemos llamado Cabecera del sitio, normalmente se encuentran el logo, el título o nombre de la página, los subtítulos y una breve descripción del sitio o página web.
La mayoría de los programadores ubican a continuación una Barra de navegación en la que ofrecen un menú o una lista de enlaces para facilitar la navegación, que dirige a los usuarios a diferentes páginas o documentos, por lo general en el mismo sitio web.
El contenido más relevante de la página se coloca generalmente en el centro de ésta. En esta sección se presenta la información más importante además de los enlaces y habitualmente está dividida en filas y columnas. En el ejemplo de la Figura 1-1 se pueden ver solo dos columnas: la Información principal y la Barra lateral, pero sepa que se trata de una sección extremadamente flexible, que los diseñadores suelen adaptar a según sus necesidades mediante la inserción de más filas, la división de las columnas en bloques más pequeños o la generación de diferentes combinaciones y distribuciones.
El contenido que se presenta en esta parte del diseño generalmente tiene la mayor prioridad o relevancia. En el ejemplo que presentamos, la Información principal podría incluir una lista de artículos, descripciones de productos, entradas de blog, o cualquier otro contenido relevante, y la Barra lateral podría mostrar una lista de enlaces relacionados con esos elementos. En un blog, por ejemplo, esta última columna ofrece una lista de enlaces a las entradas del blog, la información sobre el autor, etc.
En la parte inferior de la disposición típica, se encuentra el pie o Barra institucional. Le hemos dado este nombre porque suele mostrar información general sobre el sitio web, el autor, la compañía, además de enlaces a reglas, términos y condiciones, mapas y toda clase de datos adicionales sobre el promotor. La Barra institucional es el complemento de la Cabecera y es considerada actualmente una parte esencial de la estructura de una página web.
La Figura 1-2 es la representación de un blog estándar y en ella donde se pueden identificar claramente las partes del diseño descritas anteriormente:
1. Cabecera
2. Barra de navegación
3. Información principal
4. Barra lateral
5. Pie o Barra institucional
Esta sencilla representación de un blog que acaba de ver muestra claramente que cada sección definida en un sitio web tiene un propósito. Aunque el propósito no siempre será tan explícito, siempre se mantiene la esencia y cualquier usuario será capaz de reconocer estos elementos en cualquier sitio.
HTML5 parte de esta estructura básica de diseño, y proporciona nuevos elementos para diferenciar y declarar cada uno de ellos. Ahora podemos anunciar a los navegadores cuál es el objetivo de cada una de las secciones. La Figura 1-3 muestra la disposición típica de la que venimos hablando, pero esta vez con los elementos de HTML5 correspondientes para cada sección (tanto etiquetas de apertura como de cierre).
<header>
Uno de los nuevos elementos incorporados en HTML5 es el llamado <header>
. El <header>
no debe confundirse con la etiqueta <head>
, que usamos páginas atrás para construir la cabeza del documento. De la misma manera que la etiqueta <head>
, la etiqueta <header>
proporciona informaciones introductorias (tales como títulos, subtítulos o logotipos), pero ambas etiquetas difieren en alcance. Si bien las etiquetas <head>
tienen el propósito de proporcionar información sobre todo el documento, las etiquetas <header>
están destinadas a ser utilizadas como parte del cuerpo del documento HTML.
En el Código 1-12 definimos el título de la página web con la etiqueta <header>
. Tenga en cuenta que este título es distinto al título general del documento que definimos anteriormente en la sección <head>
. La inserción del elemento de <header>
representa el comienzo del cuerpo del documento y, por tanto, de su parte visible. A partir de este punto será capaz de ver los resultados del código que está creando en la ventana de su navegador.
<nav>
La siguiente sección de nuestro ejemplo es la barra de navegación, que en HTML5 se genera con la etiqueta <nav>
:
Tal como puede ver en el Código 1-13, el elemento <nav>
también se encuentra entre las etiquetas <body>
pero después de la etiqueta de cierre </header>
. Se debe a que <nav>
no es parte de la cabecera sino de una nueva sección.
Ya hemos mencionado que la estructura y el orden a utilizar con HTML5 es algo muy personal porque HTML5 es muy versátil y solo proporciona los parámetros y elementos básicos para trabajar, mientras que la forma de usarlos es una decisión personal. Gracias a esta versatilidad, la etiqueta <nav>
realmente podría ser insertada dentro del elemento <header>
o en cualquier otra sección del cuerpo. Sin embargo, debe tener en cuenta que se trata de una etiqueta que ha sido creada para proporcionar más información a los navegadores y para ayudar a los nuevos programas y dispositivos a identificar las partes más relevantes del documento y, como ya hemos dicho antes, para mantener la portabilidad y la facilidad de lectura de nuestro código HTML es preferible seguir las normas. El elemento <nav>
está destinado a contener ayudas a la navegación como el menú principal u otros grandes bloques de navegación, y con este objetivo debería ser utilizado.
<section>
Las siguientes partes del diseño son las que en la Figura 1-1 hemos llamado Información principal y Barra lateral. Como ya hemos mencionado, la Información principal comprende los contenidos más relevantes del documento y puede tener diversas presentaciones. Debido a que el propósito de estas columnas y bloques es más general, el elemento HTML5 que identifica estas secciones se llama simplemente <section>
.
Igual que sucedía con la Barra de navegación, la Información principal constituye una sección aparte. Por lo tanto, las instrucciones correspondientes a la Información principal están por debajo de la etiqueta </nav>
de cierre.
<aside>
En el diseño de la Figura 1-1, la barra lateral está junto a la Información principal. Las etiquetas <aside>
definen una columna o sección que normalmente contiene los datos relativos a la información principal, pero no es tan relevante ni importante como aquella. En el ejemplo de un diseño de blog estándar presentado en la Figura 1-2, la Barra lateral contiene una lista de enlaces a cada entrada del blog o proporcionan información adicional sobre el autor del blog. La información que contiene esta sección está por lo tanto relacionada con la Información principal