Introducción a HTML5 y Redes
Introducción a HTML5 y Redes
Tim Berners-Lee podemos decir de forma resumida que creó un protocolo de comunica-
ción (HTTP), un lenguaje para que las máquinas se entendieran (HTML) y una forma de llamar
a los recursos a través de (URL), lo que solemos llamar la dirección web. Hoy en día, cuando
pensamos en Internet, pensamos en miles de ordenadores interconectados, transmitiendo imá-
genes, música, en definitiva, información. Pero nosotros también podemos tener varios ordena-
dores conectados a un servidor de forma local, crear una intranet, y tener nuestra página web
de la empresa o corporación; eso sí, se podrán ver dentro de la red, a no ser que se dé permiso
en el router para que esa página web ser vea desde fuera de nuestra red.
Un símil puede ser que dos amigos están en una habitación y están comunicándose
(usando lenguaje español ~ HTML), usando como medio físico el aire, a través de nuestras cuer-
das vocales; pero también podríamos comunicarnos mediantes lenguaje de señas, o incluso de
humo, al final son diferentes medios existentes. También estos dos amigos tienen un protocolo
de comunicación (turnos de palabra y tiempo, primero habla uno, y luego responde el otro ~
HTTP). También deben saber dónde está uno y el otro, porque el amigo A no sabe si está en el
salón o en la cocina, sino sabe la ubicación no podrá intercambiar nada con él (localización de
cada amigo ~ URL).
Ellos pueden disfrutar de conversaciones horas y horas sin necesidad de nada más. Pero
si quisieran comunicarse con otros amigos que están en otro país, tendrían que usar el teléfono.
Bien, pues en este símil, el teléfono sería lo que nos comunica con otras redes, a través de otro
dispositivo llamado modem, con otras personas. Si a su vez están interconectados con muchos
M1. HTML5
amigos de muchos países, finalmente tendrían una red muy grande de comunicación; pues es
un ejemplo en otro contexto de que es Internet.
Por tanto dependiendo del número, el ámbito y el uso de ordenadores que usen la red
podemos tener diferentes tipos de redes (tipos de reuniones de amigos). Los tipos de redes más
importantes que tendríamos son:
Redes de Área Local (LAN). Local Área Network, se refiere a redes que suelen tener
pocos cientos de metros y no suelen exceder de kilómetros de distancia. Si tu ordenador o
Smartphone está conectado a una red, tendrás una red local, entre tu dispositivo y el router, con
el cual te puedes conectar a Internet si lo tienes contratado, pero tener Internet no es necesario
para conectar varios ordenadores en una red, como hemos visto anteriormente en el símil de
los dos amigos. Por tanto, la mayor parte del curso, lo puedes realizar utilizando incluso un solo
ordenador, y realizar las pruebas sin tener Internet.
Redes de Área Amplia (WAN). Wide Área Network, se refiere a una red de ordena-
dores que abarca varias ubicaciones físicas, proveyendo servicio a una zona, un país, incluso
varios continentes. Es cualquier red que une varias redes locales (LAN), por lo que sus usuarios
no están todos en una misma ubicación física.
Muchas WAN son construidas por organizaciones o empresas para su uso privado, otras son ins-
taladas por los proveedores de Internet (ISP) para proveer conexión a sus clientes, por ejemplo
Telefónica, Jazztel, Orange, Ono…etc. Son empresas (ISP – Internet Services Provider) por las
que nos conectamos desde nuestra red LAN (nuestro router, PC, Smartphone y Tablet) a la WAN
y a su vez a Internet. Un ejemplo típico es el que se puede ver en la siguiente imagen, donde
disponemos de varios PC en nuestra casa u oficina, que se conecta a una WAN a través de la 27
empresa que nos provee los servicios de internet (ISP).
28
Fig. 3: Conexión desde tu LAN a internet.
Volviendo al apartado anterior, para poder ver una página web necesitamos un ordena-
dor que nos sirva páginas web usando el protocolo HTTP, el lenguaje HTML para comunicarnos
y las direcciones URL para saber qué recurso es el que queremos en cada momento. Con todo
eso podemos intercambiar información y disfrutar de navegar por nuestro servidor web.
29
Cuando ponemos en nuestro navegador una URL, comúnmente dirección web, estamos
diciendo al navegador tráeme (GET) la información que haya en la dirección que te he puesto
en la URL. Llegados a este punto hay que aclarar una cosa que seguro que has cambiado o al
menos escuchado y son los DNS (Domain Name System). De forma simplificada, podemos decir
que los ordenadores tienen un identificador propio dentro de la red local y único, como si fuera
el DNI sólo que en redes distintas tipo local (LAN) dos personas pueden usar el mismo DNI,
dentro de cada red para saber quién es quién y mandar los mensajes a las personas correctas.
Por ejemplo, si hacemos un símil con las personas, cada persona tiene un nombre y un
DNI, y normalmente cuando nos comunicamos entre nosotros usamos el nombre y no el núme-
ro que nos identifica. ¿Por qué? Es más fácil de recordar, es más bonito…etc. Este nombre es tan
importante que incluso hay una guerra por cogerse los nombres, ya que en Internet sólo puede
existir un nombre concreto. No pasa como con las personas, que se pueden llamar varias per-
sonas del mismo nombre, en Internet el que coge el nombre por primera vez, queda registrado.
¿Por qué? Por ejemplo, si ponemos www.google.es nos referimos a una empresa y no puede
existir nadie que se llame exactamente igual. Pero www.google.es tiene un "DNI" o dirección
física, ¿quieres saberla? Usa la consola de comandos, en Windows / Inicio / Accesorios / Símbolo
del sistema y escribe el siguiente comando:
ping www.google.es
NOMBRE DNI
Nombre1 Apellido1 Apellido1 11222331K
Nombre2 Apellido2 Apellido2 22333442A
DOMINIO IP
http://www.google.es http://173.194.34.215/
http://www.mecd.gob.es http://193.147.0.116/
30
Esto no funciona con todos los dominios, ya que a veces se usan dominios compartidos,
es decir que para una misma IP cabecera se usan varios dominios, por lo que lo que distingue
a un dominio de otro sería el dominio que lo llama.
Ahora nos debemos preguntar qué hay detrás de la dirección IP, ¿qué pasa realmente y
cómo podemos ver las web usando el dominio o la IP? Otro elemento fundamental en internet
son los servidores. Pero antes debemos explicar ¿qué es un servidor?
Bueno, un servidor según Wikipedia es: "un nodo que, formando parte de una red,
provee servicios a otros nodos denominados clientes". Creo que es una buena definición porque
no especifica nada más ni se mete el tipo de hardware, ya que hay personas que se centran
solo en el hardware para definir si es un servidor o no. Puede ser desde Supercomputadoras
o computadores con rendimientos muy altos, con fuentes de alimentación redundantes por si
falla alguna, infinidad de rack de discos duros intercambiables en caso de ruptura en caliente y
sin que el usuario note nada; a simples ordenadores personales (PC), claro está; el rendimiento,
la efectividad, el mantenimiento y la durabilidad nunca va a ser la misma, pero muchas veces
cuando nos conectamos a una web, no podemos saber en primera instancia si el equipo que hay
detrás es de mayor o menor envergadura, ni tampoco el sistema operativo. (En casos aislados y
por fuerza mayor he tenido que usar un PC con Linux como servidor web mientras reparaba el
Servidor principal, y dependiendo del número de usuarios conectados a esa hora, el usuario no
ha notado ninguna diferencia).
M1. HTML5
Existen muchos tipos de servidores y servicios, los más comunes y usados por los usua-
rios podrían ser los siguientes:
Existen muchos más tipos de servidores, pero éstos son los más usuales.
de espacio limitado para alojar nuestra web, pero también nos ofrecen servicios más avanzados,
como pueden ser servidores cloud o servidores dedicados.
Nos vamos a centrar en los servidores web ya que en este curso vas a poder crear tus
páginas webs y luego decidir dónde alojarlas, ya que lo bueno de todo lo que vas aprender, es
que puedes trasladar tu trabajo de una forma rápida a cualquier opción. Para hacer todas las
pruebas vamos a usar un servidor de páginas web local, así desde cualquier dispositivo de tu
LAN, podrás acceder a la página que has creado. Así, verás en tu Tablet, Smartphone, Smart tv
u ordenador personal lo que estés programando.
Una cosa que tenemos que tener en cuenta es el esquema típico de directorios en los
servidores web, es decir, cómo debemos movernos por los directorios cuando pongamos nues-
tros archivos en la web. Para empezar, en nuestro equipo vamos a disponer de una carpeta
raíz donde vamos a tener alojada la página web, que será la que verán nuestros usuarios. Nor-
malmente se llama www o httpdocs. Imaginemos que tenemos en nuestro equipo una carpeta
donde están nuestras webs. Si usamos Windows por ejemplo puede ser:
C:/mentor/webmultiplataforma/www/ index.html
images/inicio/img1.jpg
images/contactar/img2.jpg
32
audio/audio1.mp3
audio/audio2.mp3
video/web/video1.mp4
video/video2.mp4
accesocliente/login.html
accesocliente/avanzado/login2.html
accesocliente/img/img3.jgp
………………
A partir de ese directorio vamos a tener nuestros archivos HTML, que serán las páginas
webs que hayamos creado, además de tener la configuración correcta en el servidor Web, en
este caso Apache, debemos tener al menos un archivo llamado index.html, que será el que
siempre se toma por defecto en cualquier servidor. Cuando ponemos en el navegador www.mi-
dominio.com, automáticamente el servidor nos direcciona al archivo de inicio: index.php, index.
html, index.htm, index.asp…etc., completando la dirección con www.midominio.com/index.
html en el caso que sea este el formato. Si no existe ningún archivo que el servidor entienda
como inicial, mostrará todos los existentes y una ruta parecida a la mostrada anteriormente.
Para poder referirnos a un archivo concreto del servidor, siempre lo podemos hacer de
M1. HTML5
Absoluta: Ruta completa desde el directorio raíz donde tenemos alojado nuestra página,
es decir, a partir de '/' que hayamos seleccionado en el servidor web.
Tenemos que tener muy en cuenta que en nuestro servidor tenemos varias formas de
movernos por la ruta de directorios y siempre tenemos que tener muy presente donde está el
archivo dentro de su estructura. Imaginemos que estamos en el ejemplo de la página anterior y
nos plantean los siguientes supuestos:
Estamos diciendo al sistema que acceda al directorio padre del archivo actual, y a partir de ahí
vaya a la ruta audio/audio1.mp3
Estamos diciendo al sistema que acceda al directorio padre del archivo actual, y a partir de ahí
vaya a la ruta img/img3.jgp
Debemos tener soltura para manejarnos por los directorios, ya que en el curso usaremos
muchos recursos y debemos saber las URL de los archivos que queremos cargar, ya sea una
imagen, otro enlace web, una imagen, un video…etc. De todas formas, no te preocupes ya que
durante todo el curso estaremos trabajando sobre todos los apartados y asimilaremos los con-
ceptos.
Durante el curso iré notificando y corrigiendo para aquellos que estén acostumbrado a
programar en versiones anteriores, pero a modo de resumen podemos decir que HTML5 nos
aporta:
- Incorpora etiquetas (canvas 2D y 3D, audio, vídeo) con codecs para mostrar los conteni-
dos multimedia. Actualmente hay una lucha entre imponer codecs libres (WebM + VP8) o
privados (H.264/MPEG-4 AVC).
- Etiquetas para manejar grandes conjuntos de datos: Datagrid, Details, Menu y Com-
mand. Permiten generar tablas dinámicas que pueden filtrar, ordenar y ocultar contenido.
34
- Mejoras en los formularios. Nuevos tipos de datos (eMail, number, url, datetime…) y fa-
cilidades para validar el contenido sin JavaScript.
- Drag & Drop. Nueva funcionalidad para arrastrar objetos como imágenes.
- Web Semántica.
Añade etiquetas para manejar la Web Semántica (Web 3.0): header, footer, article, nav, time
(fecha del contenido), link rel='' (tipo de contenido que se enlaza).
Estas etiquetas permiten describir cuál es el significado del contenido. Por ejemplo su importan-
cia, su finalidad y las relaciones que existen. No tienen especial impacto en la visualización, se
orientan a buscadores.
API para trabajar Off-Line. Permite descargar todos los contenidos necesarios y trabajar en local.
API Storage. Facilidad de almacenamiento persistente en local, con bases de datos (basadas en
M1. HTML5
SQLite) o con almacenamiento de objetos por aplicación o por dominio Web (Local Storage y
Global Storage). Se dispone de una Base de datos con la posibilidad de hacer consultas SQL.
http://es.wikipedia.org/wiki/HTML5#Diferencias_entre_HTML5_y_HTML4.2FXHTML
• Un editor de textos. Las páginas webs están creadas con texto llano, texto simple o tam-
bién llamado texto plano. Necesitamos un software que nos ayude a esto.
• Navegadores web y emulador de dispositivos. Para probar todo lo que vayamos de-
sarrollando necesitaremos al menos el navegador web que traiga el sistema operativo y
recomendamos Google Chrome por el plugins existente para emular dispositivos desde un
Iphone5, Ipad, Nexus 7, Blackberry, etc., entre otros muchos más.
Vamos a explicar la instalación en diferentes sistemas operativos del editor de textos Su-
blime Text 2, aunque puedes usar cualquier otro de forma gratuita (Notepad++, Kwrite, MacVim,
Vi, Komodo Edit, etc.). El motivo es porque está muy adaptado para los entornos de desarrollo y
automatiza muchos procesos de una forma sencilla evitando posibles errores y creando peque-
ñas macros o snippet.
Lo primero que tenemos que hacer es ir a su web oficial y descargar la versión corres-
pondiente a tu sistema operativo.
http://www.sublimetext.com/2
Nos aparecerá una pantalla mostrando la última versión, y los link de descarga, a partir
de ahí vamos a realizar algunas capturas de pantalla para facilitar la instalación en los sistemas
operativos más usuales:
Aula Mentor
Como se aprecia en la imagen, se necesita una versión superior a OS X 10.6, y para Win-
dows y Linux, disponemos de dos versiones: para 32 bits y para 64 bits.
37
A no ser que queramos usar una ruta diferente, pulsamos Next. Ahora nos pregunta si
queremos agregar una línea al menú contextual del sistema operativo; esto es para que cuando
pulsemos botón derecho sobre un archivo nos de la opción de abrir directamente con nuestro
programa Sublime Text 2. Es útil, por lo que es recomendable marcarla en la instalación:
Aula Mentor
38
Pulsamos Next y nos aparece una pantalla de confirmación:
M1. HTML5
Para probarlo nos podemos ir al icono creado en la instalación por defecto, o si tenemos
algún fichero que sea de texto, pulsamos sobre él con el botón derecho del ratón y nos aparece
el menú contextual:
Debemos seleccionar en este caso el link OS X y descargarlo a nuestro equipo. Una vez
esté descargado, nos saldrá la siguiente pantalla:
39
Si ejecutamos ahora el programa Sublime Text 2 veremos que nos pregunta si queremos
ejecutar esta aplicación descargada de internet, seleccionamos abrir y ya tendríamos instalado
nuestro editor de texto avanzado para Mac.
Aula Mentor
Pulsamos en Linux 32 bit y nos abrirá una ventana indicando si queremos abrir o guardar
el archivo en el ordenador. Lo podemos guardar donde decidamos:
40
Una funcionalidad que podemos aprovechar con Sublime Text 2 es usar los snippet
creados por nosotros mismos. Si nunca has oído este término, comentarte que los snippet es
"una utilidad usada en programación para referirse a partes reusables de código fuente, código
binario o texto". Por ejemplo, imaginemos que usamos un texto muchas veces, o por ejemplo
hemos preparado un esquema para escribir un libro, en el cual vamos a repetir en cada capítulo
la siguiente estructura:
#----------------------------------------------------------------------------------------------------------------
#Capítulo:
M1. HTML5
#----------------------------------------------------------------------------------------------------------------
#Título:
#----------------------------------------------------------------------------------------------------------------
#Contenido:
#---------------------------------------------------------------------------------------------------------------
#Ejercicio de iniciación:
#---------------------------------------------------------------------------------------------------------------
#Ejercicio de refuerzos:
#---------------------------------------------------------------------------------------------------------------
#Evaluación:
#---------------------------------------------------------------------------------------------------------------
#Conclusiones:
Si nos fijamos, tenemos textos, símbolos, guiones, espacios concretos, y una estructura 41
fijada. Lo ideal en el supuesto del libro sería mantener siempre la misma estructura, además,
imaginemos que lo podemos no sólo repetir exactamente igual, sino que lo podemos repetir con
un mínimo esfuerzo y escribir tantas veces necesitemos usando la combinación de teclas que
hemos decidido nosotros.
En la documentación del software podemos ver varios parámetros que podemos usar.
No obstante, en el curso vamos a utilizar los más importantes y dejamos del lado del alumno
realizar snippets más avanzados:
http://sublimetext.info/docs/en/extensibility/snippets.html
Bien, pues vamos a ver a continuación cómo poder crearnos nuestros snippets, y vamos
a utilizar el ejemplo anterior para ver cómo con una simple combinación de teclas el programa
nos inserta las veces que desees un trozo de código exactamente igual.
En este ejemplo podemos ver que nos aparece un texto por defecto:
Podemos borrar ese texto que aparece y agregar el texto que habíamos comentado an-
teriormente, a modo de ejemplo y práctica, pero lo importante es aprender a crear el snippet
según necesitemos, existirán épocas que programemos mucho en HTML5 y otras en jQUERY,
PHP, etc. Por ejemplo, si hacemos una conexión a una base de datos, no es necesario que vol-
vamos a escribir todo el código de nuevo, simplemente reutilizamos ese código y lo integramos
en nuestro editor de textos. En la siguiente captura de pantalla hemos añadido el texto, para ello
simplemente hemos copiado y pegado lo que queremos reutilizar dentro de las etiquetas
42
Con eso tenemos cubierta la parte de texto que vamos a reutilizar, pero ahora debemos
decidir ¿cómo vamos a recuperar ese texto?, ¿cómo va a saber el programa cuándo debe propo-
nernos insertar este texto?, ¿qué tipo de alarma o disparo (trigger) vamos a utilizar?
• Mediante tabTrigger. Mediante un texto concreto, por ejemplo, quiero que cuando escriba
el texto "estructuracapitulo" y pulsemos el tabulador me agregue el texto automáticamen-
te. Debemos escribir a continuación de la etiqueta </content> el siguiente texto:
M1. HTML5
<tabTrigger>estructuracapitulo</tabTrigger>
• Mediante una combinación de teclas. Por ejemplo quiero que cuando pulse las teclas
"keys": ["ctrl+shift+e"] me agregue el texto. Debemos tener cuidado en no usar una combi-
nación de teclas ya existente, por ejemplo la combinación de teclas Ctrl + A selecciona todo
el texto, no podemos usar esa combinación ya que habría dos Triggers. Para ello siempre se
suele anteponer las teclas ctrl+shift por la cercanía entre ellas, facilidad y rapidez.
En vez de poner esta información dentro del fichero, se creará a posteriori, es decir,
primero debemos guardar el snippet con un nombre y posteriormente cambiar la combinación
de teclas del usuario de Sublime Text 2. Una forma para saber si la combinación elegida puede
crear conflictos sería tan sencilla como usar la combinación de teclas que deseemos testear en
un archivo vacío, si produce algún resultado, entonces deberemos cambiar la combinación.
estructuracapitulo.sublime-snippet
Para asociarlo a una combinación de teclas, nos vamos a Preferences y seleccionamos Key
Bindings - User
43
Nos aparecerán dos corchetes vacíos y ahí es donde vamos a insertar el siguiente texto:
"keys": ["ctrl+shift+e"],
"command": "insert_snippet",
Existen otros parámetros interesantes en la creación de los Snippets, como puede ser la
limitación a una extensión concreta de archivo, así si estamos en un archivo con extensión html
podemos elegir unos tabTrigger concretos y si estamos en un archivo css podemos tener una
respuesta diferente. Para ello usamos las etiquetas <scope></scope>.
Imaginemos que queremos que nuestro trigger funcione sólo cuando estemos en un
archivo de página web con extensión html, para eso debemos agregar después de <tabTrigger>
</tabTrigger> la nueva etiqueta:
Aula Mentor
<scope>source.html</scope>
<scope>source.php</scope>
<scope>source.python</scope>
Y así con las extensiones que quisiéramos usar. En concreto vamos a limitarlo para el
uso de archivos html, aunque si se omite esta etiqueta, se podrá usar para todas las ex-
tensiones sin limitación.
Ya hemos definido el texto que vamos a reutilizar, cómo vamos a recuperarlo, y ahora
sólo nos falta guardarlo para que Sublime Text 2 lo tenga agregado a su lista de snippets. Para
ello debemos pulsar Ctrl+S (Cmd+S en MAC) o mediante el menú File – Save.
44
Y nos abrirá una ventana indicando la ruta donde debemos guardarla, tenemos que
asegurarnos que se guarda en la ruta /Sublime Text2/Packages/User, al igual que debemos
asegurarnos que la extensión del archivo que guardemos tenga obligatoriamente la extensión
" .sublime-snippet".
Debes revisar muy bien estos dos puntos ya que la mayoría de las veces que no funcio-
nan nuestros snippets es por alguno de estos dos motivos. Dicho sea de paso, debemos elegir
un nombre que nos indique y oriente sobre el contenido del archivo, en nuestro caso vamos
a elegir estructuracapitulo.sublime-snippet, introduciremos el nombre que hayamos decidido y
pulsaremos guardar:
M1. HTML5
En caso que queramos guardar nuestros Snippet para reservarlos, compartirlos o usarlo
en otro ordenador, debemos recordar que debemos tener activada la opción Mostrar archivos,
carpetas y unidades ocultas:
Aula Mentor
Una vez guardado nuestro snippet podemos probarlo de la siguiente forma: creamos un
fichero nuevo File – File New y empezamos a escribir el nombre que pusimos en el tabTri-
gger (estructuracapitulo): estr y pulsamos la tecla Ctrl+(Tecla Espaciadora), directamente si
no tenemos ningún snippet que empiece igual nos saldrá directamente el texto que habíamos
predefinido, si no nos aparecerá un menú de autocompletado donde podremos elegir.
Por último, vamos a ver una última utilidad de los snippets que es la utilización de pa-
rámetros, es decir, en el texto que hemos creado anteriormente tenemos varios apartados, los
cuales siempre que vayamos a reutilizarlo queremos repetir el valor que introduzcamos en todas
las líneas que deseemos.
Por ejemplo, imaginemos que tenemos que poner la nota de cada alumno y tenemos una
estructura básica, pero el nombre del alumno se repite en varios sitios y lo único que cambia es
la nota. Podríamos hacer nuestro snippet de la siguiente forma:
<snippet>
<content><![CDATA[
46 RESULTADOS:
${1:nombre} MATEMÁTICAS:
${1:nombre} LENGUA:
${1:nombre} INFORMÁTICA:
${1:nombre} INGLÉS:
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>resultados</tabTrigger>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
</snippet>
M1. HTML5
En este caso hemos creado una variable llamada nombre, donde vamos a insertar el
nombre del alumno y directamente se duplicará en el resto del documento, ahorrándonos poner
en cada línea el mismo valor del parámetro. Lo guardamos con el nombre:
resultados.sublime-snippet
Cuando lo utilicemos, a diferencia del método normal, notaremos que en este caso nos
aparece el cursor en el parámetro que hemos definido con la variable y conforme empecemos
a escribir se duplicarán en todas las líneas; si vamos a escribir Albert Einstein veremos que se
duplica en todos los sitios:
Comentar que se pueden usar varias variables y reutilizar el código, como el contenido
de las variables que decidamos. Para pasar de una a otra, en caso de más parámetros, pulsando
la tecla TAB, saltará al siguiente parámetro.
A lo mejor ahora no le ves la utilidad, pero conforme vayamos realizando código empe-
zarás a crearte muchos snippets y te darás cuenta que tus proyectos son mucho más ágiles. Para
usar más variables sólo debemos ir aumentado el número y cambiando el nombre de la misma,
un ejemplo compuesto para poner de manifiesto el uso de varias variables e interactuar con 47
ellas sería:
<snippet>
<content><![CDATA[
El Sr. ${2:vendedor} expone que vende el artículo a don ${1:comprador} por el precio de ${3:precio}.
La cantidad de ${3:precio} será pagadera por ${1:comprador} en un solo pago realizado el día ${4:fe-
chapago}.
Por otra parte, ${2:vendedor} expone que el artículo es nuevo y tiene dos años de garantía según nor-
mativa vigente.
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
Aula Mentor
<tabTrigger>contrato</tabTrigger>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
</snippet>
Como vimos anteriormente las páginas webs se alojan en diferentes equipos, ya sea de
forma local o en servidores remotos. En este curso vamos a usar un servidor de páginas webs
de forma local, es decir, vamos a instalar un software que va a proporcionar a nuestro equipo el
alojamiento de páginas webs.
Para ello vamos a ver cómo se instala en los sistemas operativos más comunes:
Lamp – Software de instalación en (L)inux de un servidor de páginas web HTTP, en este caso
48 (A)pache, con un gestor de base de datos, en este caso (M)ysql y un lenguaje programación
llamado (P)HP, del lado del servidor.
Mamp – Software de instalación en (M)ac de un servidor de páginas web HTTP, en este caso
(A)pache, con un gestor de base de datos, en este caso (M)ysql y un lenguaje programación
llamado (P)HP, del lado del servidor.
Si te has fijado, sólo cambia la primera letra indicando el sistema operativo en el cual
será usado, existen muchas versiones gratuitas y en caso que tengas instalada alguna no será
necesario que uses estas versiones, puedes usar la tuya. Si no tienes ninguna, elige la que co-
rresponda a tu sistema operativo.
Una vez sigamos los pasos que nos dice la web, descargaremos e instalaremos con las
49
opciones que nos dé por defecto, tenemos que tener en cuenta que salen modificaciones y ver-
siones nuevas cada mes, pero no te debes preocupar ya que para este curso no nos afectará el
número versión:
Aula Mentor
50
Pulsamos Next y elegimos el directorio de instalación:
M1. HTML5
51
52
Una vez finalice la instalación nos preguntará la configuración del servidor SMTP, en este
caso no lo vamos a configurar y en caso de necesitarlo se puede configurar posteriormente, así
que pulsamos Next y ya tenemos instalado nuestro servidor web, con Apache, PHP y Mysql.
M1. HTML5
53
Si pulsamos sobre el icono con el botón izquierdo se nos abrirá un desplegable indican-
do todas las opciones del mismo.
Aula Mentor
Si pulsamos sobre Localhost veremos que se nos abre una página web indicando mucha
información. Esto es señal que ha ido todo bien, toda esta información se refiere a las caracte-
rísticas de nuestro servidor, con la versión del Apache, PHP y extensiones activas.
¡Ojo! Si no se pone en verde revisa que no haya otro programa intercediendo, p.e. Skype suele
dejar sin arrancar al servidor web. Debemos arrancar en tal caso 1º el Servidor Web y luego
Skype, si está por defecto en Skype: Ejecutar Skype al arrancar el equipo, habrá que desactivarla,
cerrar el programa y ya si podemos ejecutar el Servidor Web.
54
Aunque para este curso no es necesario debes saber que si trabajas en un servidor
remoto, este tiene unas versiones instaladas, es bueno tener la misma configuración que tenga
el servidor remoto donde vayas alojar tus páginas webs, ya que si son versiones muy distintas
y difieren entre sí tendrás opciones y funcionalidades distintas, por lo que tendrás que retocar
y modificar el código que has realizado, pero todo esto afecta más cuando trabajes con PHP y
Mysql.
M1. HTML5
Para ello debemos tener Internet, ejecutar un terminal y escribir el siguiente comando:
/var/www/html
55
Si abrimos el navegador y escribimos localhost, nos aparecerá una pantalla indicando la
configuración del servidor:
Con esto tenemos ya podríamos seguir el curso sin problemas, ya que sólo necesitamos
el servidor web. De todas formas, vamos a dejar instalado PHP y Mysql.
Aula Mentor
Para probarlo deberíamos reiniciar el servidor Apache como hemos visto anteriormente.
Luego nos podríamos crear un archivo php de prueba escribiendo por ejemplo en el terminal
sudo gedit /var/www/html/miconfiguracion.php y escribe el siguiente contenido:
<?php
phpinfo();
?>
Para instalar nuestro gestor de bases de datos debemos insertar los siguientes comandos:
Y después de aceptar la confirmación nos pedirá para qué servidor queremos instalarlo,
en nuestro caso Apache2:
Marcamos con el espacio la opción correcta, pulsamos intro. A continuación nos pre-
guntará que debemos tener alguna base de datos instalada, en principio usamos los parámetros
por defecto y pulsamos Aceptar:
57
Hay diferentes formas de tener instalado en nuestro MAC un servidor de páginas web
con Apache, PHP y Mysql. Podemos usar Mamp o Xmamp, en este manual vamos a ver una
forma fácil y gratuita de instalar Mamp para poder seguir el curso sin problemas.
http://www.mamp.info/en/download
59
Pulsamos en Continuar y vamos aceptando las opciones de configuración por defecto,
en uno de los pasos, nos pedirá la contraseña del usuario del equipo. La introducimos, comen-
zará la instalación, y pasados unos minutos tendremos finalmente nuestro servidor de páginas
web instalado.
Una vez que lo tengamos instalado tendremos todas las opciones del programa dentro
del FINDER / APLICACIONES / MAMP.
Aula Mentor
Cuando ejecutemos el programa MAMP nos pedirá Arrancar MAMP PRO o Arrancar
MAMP; a no ser que queramos usar la versión de pago debemos desmarcar la opción Compro-
bar MAMP PRO al arrancar MAMP y pulsar en Arrancar MAMP:
Una vez arranque el programa tendremos configurado nuestro servidor de páginas web
de forma gratuita y podremos usarlo para realizar los ejercicios del curso:
60
Pulsamos sobre Iniciar Servidores y podemos comprobar que se nos han activado las
pestañas de Servidor Apache y Servidor MySql, además nos habrá cambiado la interfaz, pudien-
do pulsar sobre la opción Abrir página de inicio:
Y ahora si hacemos clic en Abrir página de inicio podremos comprobar que está co-
rrectamente instalado.
M1. HTML5
Si queremos acceder a nuestro directorio raíz, donde deberemos escribir nuestras pági-
nas webs, debemos escribir en el Navegador localhost:8888, o acceder a través de la ruta "/
Aplication/MAMP/htpdocs". Para probar que todo está correcto y además el directorio donde
debemos trabajar en el curso es ése, podemos hacer una prueba. Prueba a escribir el siguiente
link:
http://localhost:8888/ 61
Si prefieres, puedes pulsar en la opción Establecer los puertos 80 y 3306 y así podrás
acceder directamente sin tener que escribir el puerto a continuación de localhost. Pudiendo ac-
ceder directamente desde el navegador con http://localhost.
Aunque todos los sistemas operativos disponen de un navegador propio (o varios), va-
mos a usar Google Chrome. Pero ¿puedo usar el navegador que tengo instalado? existen plugins
y complementos para la mayoría de navegadores, no obstante para unificarnos, independien-
temente de la plataforma, hemos decidido usar este. Además todas las capturas de pantalla y
Aula Mentor
configuración están realizadas para este. De todas formas no existen grandes diferencias para
usarlos, ya que en definitiva lo que necesito es que me emule un dispositivo, por ejemplo un
IPhone 5, para poder ver cómo se vería mi trabajo en diferentes dispositivos.
https://www.google.com/intl/en/chrome/
Una vez instalado el navegador Google Chrome con la configuración por defecto, debe-
mos irnos a la tienda de Google para descargarnos el emulador Ripple:
https://chrome.google.com/webstore/category/apps
Una vez pulsemos en "Añadir", nos aparecerá una ventana de confirmación de insta-
lación y podremos usar emulador de dispositivos. Para saber que lo tenemos correctamente
instalado, debemos fijarnos en la parte superior derecha y nos debe aparecer el icono de la
extensión.
Pulsamos sobre ENABLE y a partir de ese momento se nos abrirá una nueva ventana y
podremos configurar en el menú de la izquierda diferentes opciones: el dispositivo a emular, la
orientación de la pantalla, modificar el acelerómetro, geolocalización, etc.
63
4. Resumen.
- Existen diferentes dispositivos en el mercado que tienen acceso a Internet, cada uno de ellos
tiene una pantalla y resolución concreta, por lo que la misma web puede tener diferente
apariencia dependiendo del dispositivo.
- Internet nació de la necesidad de la comunicación entre personas, para ello se tuvo que de-
sarrollar un protocolo de comunicación (HTTP), un lenguaje (HTML) y una forma de acceder
a los diferentes recursos (URL).
- Para poder conectarnos desde nuestro equipo a Internet necesitamos un Proveedor de Servi-
cios de internet (ISP) que nos comunique con las otras redes. En la mayoría de los casos se
Aula Mentor
- Los routers pueden ser inalámbricos o alámbrico (con cable) pudiendo conectarse diferentes
dispositivos a él y a su vez a Internet. La velocidad se verá reducida tanto en cuanto el nú-
mero de dispositivos aumente.
- Para poder ver las páginas webs se necesita un servidor que nos sirva e interactúe con las
páginas webs alojadas en él. En la mayoría de los casos se suele usar como servidor web
HTTP Apache, ya que es libre y de código abierto.
- Para escribir páginas webs podemos usar cualquier editor de texto plano. El resultado final
es el mismo, pero las herramientas que nos traiga, nos ayudará para escribir código y crear
páginas webs más rápida y cómodamente.
- Los Snippet son utilidades que usan los software de programación para referirse a partes
reusables de código fuente, código binario o texto. Con ellos podemos repetir texto e inclu-
64 so pasarle parámetros, pudiendo insertar el valor de esos parámetros a la vez en diferentes
sitios, agilizando la tarea del programador web.
- Dentro de los diferentes lenguajes y servidores web, tenemos de forma gratuita (Wamp –
para Windows), (Lamp – para Linux) y (Mamp – para Mac). Todos ellos instalan Apache para
mostrar las páginas webs, Mysql como gestor de base de datos y PHP será un lenguaje de
programación del lado del servidor que permite incorporar directamente en el documento
HTML.
- Si usamos nuestro equipo como servidor web, tendremos un directorio donde almacena-
remos los archivos HTML donde tendremos nuestras páginas webs. Dependiendo del S.O.
puede ser c:/www/, /aplication/mamp/www/htpdocs, /var/www. o cualquier otro que
asigne el programa de instalación. Posteriormente se puede modificar a otro directorio en la
configuración del Apache.
Unidad 2: Webs con HTML5
Como hemos comentado anteriormente, HTML5 difiere en algunos puntos de sus ver-
siones anteriores, sobre todo por la forma de trabajar y estructurar las páginas. Ahora debemos
hacer un buen trabajo de planificación para poder avanzar sin tener que modificar partes ya
programadas anteriormente y sacarle todo el partido a este lenguaje. Un buen trabajo previo nos
puede ahorrar y facilitar posibles modificaciones. 65
Todo documento o página web en HTML5 debe tener esta estructura básica:
<!DOCTYPE html>
<html lang="es">
<head>
</head>
<body>
</body>
</html>
<!DOCTYPE html>
El doctype o también llamado DTD, no se debe confundir con el tipo de archivo que lo
contiene, con él le estamos diciendo al navegador el tipo de documento y las reglas genéricas
para renderizar a toda costa la página HTML; dependiendo de éste, el navegador se adaptará a
un formato u a otro. Si no existiera esta primera línea el navegador no sabría qué reglas debe
procesar para la página, lo que puede hacer que dependiendo del navegador no se visualice
como teníamos previsto.
Para los programadores de versiones anteriores de HTML pensarán que falta texto al doctype, ya
que estarán acostumbrados a algo parecido a esto:
<!DOCTYPE html>
Este tipo de etiquetas <!--TEXTO --> nos sirve para indicar comentarios dentro del có-
digo de programación HTML, en principio se usarán para agregar información al código (autor,
empresa…), o ayudar al programador a entender u organizar el código para facilitar el mante-
nimiento de la página en un futuro. No es obligatorio de cara a la web, pero sí recomendable
para nosotros aunque también debéis tener en cuenta que, aunque el navegador no los muestra
M1. HTML5
inicialmente, usando el método comentado en la nota anterior podemos ver el código fuente,
por lo que nunca debemos poner información trascendental: usuarios, contraseñas o cualquier
otra que nos sea en perjuicio nuestro.
Como comentamos en la unidad anterior, las páginas webs, están llenas de etiquetas.
Éstas se deben abrir y cerrar para informar al navegador cuando hemos finalizado cada una, de-
bemos ser muy organizados y tener cuidado en el orden de apertura y cierre de las mismas, es
decir, debemos ir cerrando las etiquetas en el mismo orden que las abrimos, y nunca cambiar el
orden. Las etiquetas básicas de cualquier documento HTML son <html><head><body> con sus
correspondientes cierres.
<html lang="es"> 67
<head>
</head>
<body>
</body>
</html>
Aula Mentor
<html lang="es">
En esta línea le decimos al navegador que vamos abrir la etiqueta html y vamos a usar
el lenguaje "es" para el Español. La etiqueta <html></html> sólo puede ser declarada una única
vez en el documento.
<head>
La meta etiqueta charset, indica el juego de caracteres usado (charset), es un detalle muy
importante, ya que la codificación puede hacer que algunos caracteres aparezcan con símbolos
no legibles, con algunos caracteres especiales como pueden ser: tildes, ñ...etc.
El <title> es el título que aparecerá en la página web, en todo navegador web, aparece
un título indicativo de la página web en la que estamos. Vemos un ejemplo de como se muestra
a continuación en los diferentes navegadores, Chrome, Firefox, Explorer y Safari:
M1. HTML5
Internet Explorer 10
69
Mozilla Firefox 28.0
Debemos probar nuestras web en diferentes navegadores, si usas Windows hay versio-
nes de Safari para Windows, y si usas Mac hay también versiones de Chrome, Firefox y Explorer.
Lo importante que debéis pensar como programadores webs es ser lo más estándar posi-
ble, que tus webs o aplicaciones se vean en la mayoría de dispositivos y evitar caer en el mono
desarrollo, ya que éste siempre es limitado, pero en caso de duda, tenemos que ir siempre a la
mayoría actual y por supuesto debemos soportar los navegadores que sabemos que van a usar
nuestro usuarios mayoritariamente.
Cuando finalicemos una web podemos usar aplicaciones web online, que nos ahorran
ese trabajo y realizan una captura de pantalla previsualizando cómo se verá tu web en el nave-
gador correspondiente.
70
Guardamos los diseños seleccionando Download All y nos descargará una carpeta con
todas las capturas de pantalla de la web que hemos puesto y los navegadores seleccionados.
Ahora bien, si estamos trabajando en local, y no tenemos la web subida a ningún servidor en
internet, no podremos hacer esto a no ser que dispongamos de algún hosting ya sea de pago o
gratuito donde hayamos alojado nuestra web.
También se puede usar si tienes los conocimientos suficientes e internet tu propio or-
denador para almacenar las páginas web de internet, para ello necesitas; usar la IP pública de
tu router (mejor si es estática), abrir los puertos TCP/IP del puerto 80 en el router, direccionar
a tu servidor/pc y configurar el servidor local en tu ordenador correctamente para que acepte
peticiones en el puerto 80. Así, si compras un dominio, le modificas el registro A CNAME y agre-
garias la dirección IP de tu casa, cuando escribas www.tudominiocomprado.com accederás al
servidor web que has creado de tu casa u oficina.
<body>
Con esta etiqueta body o cuerpo de la página, le estamos diciendo al navegador que a
partír de ahí va a ser donde vamos a insertar el contenido que él tiene que mostrar al usuario,
por lo que al igual que las etiquetas anteriores, es fundamental que esté declarada para un co- 71
rrecto funcionamiento. En este primer ejemplo hemos escrito un pequeño párrafo con un texto
de ejemplo usando la etiqueta <p> que posteriormente veremos:
Como hemos comentado anteriormente, debemos cerrar todas las etiquetas HTML5 en
el orden correcto e inverso al que hemos abierto, como hemos visto en la Fig. U2.img1. Por lo
que las siguientes etiquetas obligatorias son:
</body>
</html>
Con el código descrito, tendrías definido una estructura básica de una web, puedes verlo
dentro del Ejemplo 0 dentro del módulo 1, HTML5.
Para poder continuar con las siguientes secciones debemos poner de manifiesto que
para cualquier desarrollo web debemos utilizar siempre una planificación y organización ade-
cuada. Para ello, lo más usual es usar storyboard (representación gráfica de bocetos/páginas y
su secuencia/interacción con el usuario), con ello podemos organizar tanto la parte lógica como
posteriormente la visual de la aplicación. Existen diversos programas para ello, pero lo impor-
tante es pararse y realizarlo, aunque sea en papel, para posteriormente seguir el patrón diseñado
más fácilmente.
72
Existen muchas formas de organizar una web, y se pueden hacer según necesitemos,
siguiendo estos ejemplos podemos tener las siguientes partes:
Navegación: Nos va a indicar la navegación de la página, con qué secciones y enlaces voy a
interactuar en la página web. Un ejemplo típico es crear los siguientes elementos en el menú:
M1. HTML5
Anexos: Esta sección que nos proporciona HTML5 es para agregar contenido adicional que
queramos a la web, un ejemplo típico es poder agregar la zona de redes sociales, si es una web
de empresa y queremos que el cliente siempre tenga presente un anexo para CREAR PEDIDO
| VER CARRITO | CONTACTAR | ME GUSTA…etc.
Los anexos están dentro del body o de las secciones <section>, que veremos más adelan-
te. Con HTML5 se introduce unos nuevos elementos que facilitan al programador la organización 73
del contenido web, anteriormente esta labor se realizaba primero con CSS y en algunos casos
de HTML se organizaba el contenido con tablas, pero con los diferentes dispositivos que visitan
hoy una web y sus pantallas, es difícil que esas estructuras cumplan su cometido en la mayoría
de los casos.
Las etiquetas nuevas que nos proporciona son: <headers>, <nav>, <footer> y <aside>,
por ejemplo, vamos a escoger un diseño y asociarle los elementos nuevos:
<headers>
<nav>
<body>
<footer> <aside>
Fig. U2.Img5
Aula Mentor
El código correspondiente a la imagen anterior, podría ser algo como se muestra a con-
tinuación:
<!DOCTYPE html>
<html lang="es">
<head>
</head>
<body>
<header>
<ul>
<li>Inicio</li>
<li>Productos</li>
<li>Empresa</li>
<li>Contactar</li>
</ul>
</nav>
<footer>
</footer>
</body>
</html>
Párrafos: <p> 75
Títulos: <hx>
1.2. Párrafos.
Todo texto que exista en una página web o aplicación debe estar contenido dentro de
alguna etiqueta, no se puede omitir porque dificulta el diseño y posterior mantenimiento de la
web y no cumple con las normas establecidas. Por defecto, cada párrafo que insertemos en la
web contendrá un salto de línea antes y después de él. Aunque en el capítulo de CSS3 veremos
cómo modificar esta acción.
Para ver ejemplos de párrafos vamos a usar un método muy usado en programación.
Inicialmente cuando estamos en fase de diseño, construyendo la aplicación web, no vamos a a
tener contenido, ya que el contenido se agregará posteriormente, o incluso lo creará el propio
cliente. Pero aunque no tengamos ningún contenido, necesitamos textos y párrafos para ver
cómo va desarrollándose la web.
Aula Mentor
En estos casos se suele usar texto neutro generado; normalmente se usa: Lorem limsum
que podemos encontrar en internet o directamente en esta web http://es.lipsum.com/ . Imagi-
nemos que queremos probar y tener tres párrafos en nuestra web, pero queremos agregar texto
y no tenemos ninguno todavía, deberíamos tener algo parecido a esto:
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus ultrices massa at odio dapibus,
a pellentesque purus aliquet. </p>
<p>Suspendisse sed enim quis nisi condimentum tempor at in nisi. Maecenas rhoncus semper varius.
Praesent sodales leo eget lorem rhoncus vulputate. </p>
<p>Mauris ut dui neque. Mauris purus risus, placerat sodales eleifend eget, tincidunt et orci. Cras in
fermentum risus. Pellentesque gravida ue sit amet. Curabitur at nulla convallis ipsum placerat susci-
pit. Sed ultrices dictum rhoncus. </p>
76 Aunque visualmente puede parecer que el salto de línea lo hemos dado nosotros, no
nos podemos dejar engañar, los saltos de línea nos los han dado las etiquetas <p> y </p>, si nos
fijamos obtenemos el mismo resultado haciendo:
Que esto:
En el ejemplo1b.html podrás ver cómo quedarían visualmente los párrafos que hemos
añadido. Te recomiendo que empieces por tu propia cuenta un archivo e intentes usar los com-
ponentes que hemos visto hasta ahora.
1.3. Títulos.
Los siguientes elementos que vamos a enseñar son los títulos. Si nos fijamos en el código
hemos escrito:
HTML5 nos proporciona hasta 6 niveles de título, con ellos podemos organizar el conte-
M1. HTML5
nido de una forma más lógica y posteriormente con las modificaciones del diseño CSS3 podre-
mos enriquecer globalmente y con unas pocas directivas los títulos.
Tendríamos entonces:
77
Los títulos deben usarse siempre para diferenciar secciones en un texto o aumentar/
disminuir la importancia al texto que estamos tratando. Nunca se debe usar para disminuir
o reducir el tamaño del texto o poner en negrita, para ello existen otros elementos que
veremos en capítulos posteriores.
Tal es la importancia de los títulos que W3C lo remarca y el buscador de google busca
este tipo de elementos para realizar su propio mapa web, por lo que es necesario elegir correcta-
mente los títulos en cada momento y nunca usarlo para el aspecto gráfico o distinción del texto.
1.4. Listas.
El siguiente elemento que vamos a ver son las listas en páginas web. Éstas pueden ser
de tres tipos:
- Listas ordenadas.
- Listas desordenadas.
- Listas de descripciones.
Aula Mentor
Listas ordenadas
Nos muestra una lista ordenada o numerada, para ello se usan las etiquetas <ol> (orde-
red list) seguido de <li> (list ítem) para elemento de la lista, un ejemplo puede ser:
<ol>
<li>Unidad 1</li>
<li>Unidad 2</li>
<li>Unidad 3</li>
<li>Unidad 4</li>
</ol>
78
Todos estos valores también se pueden modificar desde CSS3, ya que es específica para
el diseño. Además se pueden anidar diferentes listas, unas dentro de otras.
<ol>
<li>Unidad 1</li>
<ol type="A">
<li>Elemento 1.</li>
<li>Elemento 2.</li>
79
<li>Elemento 3.</li>
</ol>
<li>Unidad 2</li>
<li>Elemento 1.</li>
<li>Elemento 2.</li>
<li>Elemento 3.</li>
</ol>
<li>Unidad 3</li>
<ol type="I">
<li>Elemento 1.</li>
<li>Elemento 2.</li>
Aula Mentor
<li>Elemento 3.</li>
</ol>
<li>Unidad 4</li>
<li>Elemento 1.</li>
<li>Elemento 2.</li>
<li>Elemento 3.</li>
</ol>
</ol>
Veremos dependiendo del navegador que no funciona tal y como he comentado, esto
es porque la tendencia es que todos los navegadores con las últimas actualizaciones vayan
soportando este tipo de atributos. En la imagen siguiente podemos ver como el atributo rever-
sed, funciona correctamente en Mozilla Firefox 28.0, Google Chrome, Opera y no en Internet
Explorer y Safari.
Listas no ordenadas
81
En estos casos la lista no viene precedida por un número, sino por un carácter están-
dar que en versiones anteriores se podía cambiar, y en HTML5 por ahora no nos da opción a
cambiarla (a fecha de este documento); pero si nos proporciona diferentes niveles e imágenes
asociadas según la profundidad del nivel de la lista.
<ul>
<li>Inicio</li>
<li>Productos</li>
<li>Empresa</li>
<li>Contactar</li>
</ul>
Por supuesto podemos entrelazar y anidar las listas, sean ordenadas, con listas des-
ordenadas, un ejemplo podría ser:
Aula Mentor
<ul>
<li>Inicio</li>
<li>Productos</li>
<li>Empresa</li>
<li>Contactar
<ol>
<li>Por teléfono</li>
<li>Por mail</li>
<li>Otros
<ul>
<ol type="i">
82 <li>Teléfono 111222333</li>
<li>Teléfono 222333444</li>
</ol>
</ul>
</li>
</ol>
</li>
</ul>
Listas de descripciones
Muchas veces para hacer glosarios o si la web que estamos desarollando requiere el
uso, podemos usar listas de descripciones donde tendremos un elemento y su descripción, por
ejemplo si escribimos el código:
<dl>
<dt>Término 1</dt>
<dd>Descripción 1</dd>
<dt>Término 2</dt>
<dd>Descripción 2</dd>
<dt>Término 3</dt>
83
<dd>Descripción 3</dd>
</dl>
<dl>
<dt>h1</dt>
<dt>h2</dt>
<dt>h3</dt>
<dt>h4</dt>
<dt>h5</dt>
<dt>h6</dt>
</dl>
Practica intentando imitar el resultado sin usar el código del archivo. Debe parecerse a
la siguiente captura de pantalla:
1.5. Citas.
En determinadas ocasiones necesitaremos escribir un texto que nos indique una cita o
nota aclaratoria dentro de un párrafo. Para ello, podemos usar la etiqueta <blockquote>. Por
tanto si escribimos:
84
<p> No debemos olvidar lo que nuestro gran amigo Albert Einstein dijo:</p>
<blockquote>"Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la
voluntad"</blockquote>
<p> No debemos olvidar lo que nuestro gran amigo Albert Einstein dijo:</p>
Practica intentando imitar el resultado sin usar el código del archivo en el ejemplo 1.
M1. HTML5
También se puede crear una cita en línea usando la etiqueta <q> para resaltar algún
punto en concreto y no cambie de salto de línea, pero sí resalte de alguna forma el contenido
del párrafo. Por ejemplo, siguiendo con el ejemplo anterior se podría poner:
<p> No debemos olvidar lo que nuestro gran amigo Albert Einstein dijo:
<q>Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad</
q>
</p>
Practica intentando imitar el resultado sin usar el código del archivo en el ejemplo 1. 85
Destacar que la etiqueta <q>, no inserta ningún salto de línea, como nos pasaba cuando
usábamos la etiqueta <blockquote>.
Vamos a destacar solo las siguientes opciones: texto en negrita y texto en cursiva, ya que
en el módulo siguiente de CSS3 trataremos la parte de diseño y maquetación más en profundi-
dad.
Siguen permitidas las etiquetas <b></b> para escribir un texto en negrita y la etiqueta
<i></i> para poner el texto en cursiva. Veamos un ejemplo:
Practica intentando imitar el resultado sin usar el código del archivo en el ejemplo 1.
Como en el ejemplo de los párrafos, las etiquetas las lee el navegador y son las que rigen
el formateo y posición del texto. Voy a volver a poner de manifiesto que en este caso, sólo con
incluir los <br> el navegador entiende que debe incluir un salto de línea. Aunque siempre hay
que intentar realizar un código legible y que en un futuro sea fácil de modificar. Por ejemplo,
86 veamos el siguiente ejemplo:
<p>
La guitarra <br>
perdidas <br>
redonda. <br>
</p>
<h3>Las seis cuerdas</h3><p>La guitarra <br>hace llorar a los sueños. <br>El sollozo de las almas <br>
perdidas <br>se escapa por su boca <br>redonda. <br>Y como la tarántula, <br>teje una gran estrella
<br>para cazar suspiros, <br>que flotan en su negro <br>aljibe de madera. <br><cite>Federico García
Lorca - 1924</cite>
</p>
Practica intentando imitar el resultado sin usar el código del archivo en el ejemplo 1.
Reflexiona sobre qué forma de escribir ayuda mejor a los cambios futuros. Como obser-
varás, el navegador a omitido los saltos de línea y sólo ha tenido en cuenta las etiquetas. Si eje-
cutamos el código anterior, tendremos que ambos párrafos se han representado de igual forma:
<hr>
<hr>
<p>
La guitarra <br>
perdidas <br>
redonda. <br>
</p>
Practica intentando imitar el resultado sin usar el código del archivo en el ejemplo 1.
88
<article></article>: tiene una identidad dentro de una sección y pueden existir varios
artículos dentro de una misma sección.
mente y nos encuentren los usuarios correctamente cuando busquen nuestra web.
Al igual que las listas, podemos tener varias secciones anidadas y artículos, siempre que
respetemos el orden de cierre y apertura.
Cuando nos referimos a secciones no tiene por qué estar vinculado con la parte visual,
aunque en algunos casos esté relacionado debemos tener en cuenta que estamos primero escri-
biendo qué vamos a ver en nuestra web.
<!DOCTYPE html>
<html lang="es">
<body>
<nav>
<ul>
89
<li><a href="">Inicio</a></li>
<li><a href="">Productos</a></li>
<li><a href="">Empresa</a></li>
<li><a href="contactar.html">Contactar</a></li>
</ul>
</nav>
<hr>
<section>
<article>
</article>
<aside>
Aula Mentor
<p>Aquí podemos poner los link a las redes sociales (p.e me gusta, leer más, twitter...) < /
p>
</aside>
<hr>
<article>
</article>
<aside>
<p>Aquí podemos poner los link a las redes sociales (p.e me gusta, leer más, twitter...) < /
p>
</aside>
</section>
90 <footer>
</footer>
</body>
</html>
Hemos creado una sección con dos artículos, podíamos haber creado dos o más seccio-
nes, con muchos más artículos y cada uno con su información correspondiente. En este ejemplo
hemos añadido un elemento nuevo que es la etiqueta <a> que veremos a continuación. 91
- Enlaces a un archivo.
En todas las aplicaciones web debemos usar una etiqueta para enlazar con otras páginas,
por ello cuando queremos abrir otra página dentro de la web que estamos creando debemos
usar la etiqueta <a>.
Aula Mentor
Normalmente debemos dotar a nuestro menú de navegación con este tipo de etiquetas,
(INICIO | PRODUCTOS | CONTACTAR...) pues todo son enlaces (o link) usando la etiqueta
<a>. Lo más usual para las secciones de navegación es realizar listas y posteriormente con CSS3
tratarlas para que parezcan menús, siempre va a ser más óptimo que usar dos imágenes: botón
sin pulsar; botón al pasar el ratón por encima, ya que tendríamos que almacenar dos imágenes.
Además de ser más costoso y crear una web más pesada, impedía la organización para
la búsqueda de los motores de búsqueda automáticamente. De todas formas, en determinados
casos tendremos que usar este método.
Como de la parte estética nos ocuparemos en el módulo siguiente con CSS3, vamos a ver
varios ejemplos básicos que posteriormente podremos alimentar con nuestros diseños y colores
deseados.
La etiqueta <a> puede tener varios atributos, el más común es realizar un link a una pá-
gina web, ya sea local, dentro de nuestro servidor, o externa:
<!-- Enlace nos lleva al hacer clic a la página web externa, en este caso la de Google -->
<!-- Enlace nos lleva al hacer clic a la página web local, en este caso a otra página llamada contac-
tos -->
Vamos a realizar una página web que va a tener cuatro archivos, por supuesto no es
obligatorio hacerlo así, como veremos en capítulos posteriores, pero puede ser una interesante
forma para comprender los enlaces o hipervínculos. Nuestros ficheros van a ser:
Para interactuar entre ellas debemos tener un menú de navegación, puede ser, vertical,
horizontal, carrusel, etc. Cuando pulse el usuario sobre cualquiera de ellos nos debe abrir otra
página y sus contenidos.
l">
<a
<a h
.htm
hre
">
ref=
ml
ctos
f="
.ht
co
"em
cio
dud
nta
ini
pre
cta
f="
"pro
sa.h
hre
r.ht
ref=
ml"
<a
tml"
<a h
>
>
93
<nav>
<ul>
<li><a href="inicio.html">Inicio</a></li>
<li><a href="productos.html">Productos</a></li>
<li><a href="empresa.html">Empresa</a></li>
<li><a href="contactar.html">Contactar</a></li>
</ul>
</nav>
Para parecerse un poco más al menú de navegación que buscamos, sin usar CSS3 podía-
mos poner en una línea todo el texto y añadir el carácter "|":
Aula Mentor
<a href="inicio.html">Inicio</a> |
<a href="productos.html">Productos</a> |
<a href="empresa.html">Empresa</a> |
<a href="contactar.html">Contactar</a>
Se pueden hacer modificaciones, como por ejemplo eliminar que aparezcan subrayados
los elementos tipo <a>, añadir fondo y colores diferentes. Que cambien de forma, color, posición
al pasar el ratón por encima, etc. Pero al ser aspecto de diseño, lo veremos en el módulo de
CSS3.
Los enlaces pueden ser a páginas externas o internas. En el ejemplo anterior, hemos visto
que los cuatro link estaban localmente, ya que los archivos estaban en la raíz de nuestro servidor
web, pero a veces es necesario crear enlaces a web externas, y bien podemos cargar su conteni-
do en la misma ventana, pero esto hará que el usuario "pierda" nuestra web, ya que abrimos el
nuevo link sobre la misma ventana. En el caso que no queramos que el usuario pierda u olvide
94 nuestra web, podemos abrir en la misma página del navegador mediante una pestaña o crear
una nueva ventana en el navegador. Para ello usamos el atributo target, dentro de la apertura de
la etiqueta y a continuación del contenido de href sus atributos. Veamos un ejemplo:
Cuando pulsemos sobre "Enlace en nueva ventana" queremos que nos abra una nueva
pestaña con la dirección contenido en el href; en este caso del aula mentor, pero que la página
que llama al enlace no se cierre. El efecto sería abrir el enlace especificado por href en una pes-
taña distinta:
M1. HTML5
• target="_self: Opción por defecto que usa el navegador sino se le indica nada.
Dependiendo del navegador, algunos atributos pueden actuar de una u otra forma, como
ya hemos comentado anteriormente, por ejemplo: el efecto target="_blank" en Mozilla Firefox
28.0 al igual que en Google Chrome 33.0.1750.154 m. es abrir una pestaña. Sin embargo en Safari 95
5.1.7 nos abre una ventana nueva de navegación, al igual que en Internet Explorer 10.0.9200.
En principio no nos debemos preocupar mucho ya que en ninguno de los dos casos se cierra
nuestra ventana y el usuario sigue manteniendo nuestra web.
Existen otros tipos de enlaces que pueden ser interesantes cuando desarrollemos web,
y son enlaces a nuestra propia página dentro del mismo archivo, por ejemplo realizar varios
capítulos y que pueda desplazarme hacia ellos directamente, y por ejemplo subir al inicio de la
página cuando deseemos. Esto se hace a través de "anclas" dentro de la propia página y pode-
mos crear tantas como queramos dentro de nuestra página. Por ejemplo si necesitamos hacer
una página con esta estructura:
Aula Mentor
Debemos declarar tantas anclas como lugares queramos identificar, y podremos hacer
los enlaces a ese lugar indefinidas veces, un ejemplo podría ser tener un ancla al inicio mostran-
do diferentes capítulos y poner en diferentes sitios un link o enlace al inicio.
Por tanto en el ejemplo anterior tendríamos un ancla por cada punta de flecha, y supo-
niendo cada capítulo como un artículo:
<section>
<article>
<a id="listado_capitulos"></a>
<ul>
</ul><hr>
</article>
<article>
<a id="capitulo1"></a>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus hendrerit arcu odio, at mattis diam
bibendum et. Vivamus felis enim, pulvinar eu vulputate sit amet, congue a enim. Ut et tortor nisi. Fusce
viverra orci vitae elit tristique semper. Sed vitae velit quam. Vivamus sed quam felis. Nam lacinia
ornare purus ut dignissim.</p>
</article>
<article>
<a id="capitulo2"></a>
</article>
<article>
<a id="capitulo3"></a>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus hendrerit arcu odio, at mattis diam
bibendum et. Vivamus felis enim, pulvinar eu vulputate sit amet, congue a enim. Ut et tortor nisi. Fusce
viverra orci vitae elit tristique semper. Sed vitae velit quam. Vivamus sed quam felis. Nam lacinia
ornare purus ut dignissim.</p>
Aula Mentor
</article>
</section>
98
Para crear enlaces en nuestra web con una dirección de correo electrónico del tipo, "para
realizar sus pedidos <piche aquí>" y al realizarlo se nos abra nuestro cliente de correo electró-
nico con la dirección, podemos usar el mailto después de indicar href. La sintaxis sería:
Si queremos además añadirle copia a otra dirección de mail y un asunto podemos usar
los atributos: subject y cc; siguiendo el ejemplo anterior si queremos mandar una copia a otroe-
[email protected] y poner de asunto: Email recibido desde mi página web, debemos usar:
<p> Para contactar con el autor y la editorial puede pinchar <a href="mailto:aplicacioneswebmultiplata
[email protected]?subject=Email recibido desde mi página web&[email protected]">aquí</a></p>
Al usuario que está navegando por tu web le aparecerán las siguientes ventanas:
99
Le preguntará la primera vez que lo usa si le da permiso y le da la opción a usarla por de-
fecto marcando "No volver a mostrar la advertencia acerca de este programa". Al pulsar permitir,
le aparecerá su cliente de correo con los datos que les hemos rellenado nosotros previamente:
Ejemplo en el caso que el cliente tiene como cliente de correo Mozilla Thunderbird. An-
tes nos habrá pedido confirmación de Seguridad como pasaba con el otro cliente de correo.
Aula Mentor
Para que el usuario que navega por la web pueda descargarse información que le quera-
mos facilitar, por ejemplo en una web de un Gimnasio poder descargarse el horario de las clases,
ya sea una imagen, archivo comprimido, pdf, etc. En una web de una empresa, descargarse los
100 catálogos, los precios..etc. Podemos usar la sintaxis siguiente:
<a href="rutacompletadelarchivo/nombredelarchivo.extension">
Recordamos que cuando nos referimos a la ruta completa del archivo es partiendo desde
la raíz del archivo que lo llama, como vimos en el módulo 1. Apartado 1.2.
Si creamos una carpeta que se llame descargas dentro de nuestro sitio web, algunos
ejemplos podrían ser los siguientes:
<a href="descargas/documento_pdf_para_descargar.pdf">aquí</a></p>
<a href="descargas/imagen_para_descargar.jpg">aquí</a></p>
<a href="descargas/archivo_comprimido.zip">aquí</a></p>
Es importante cuando se use esta estructura proteger el directorio para que no se visuali-
ce toda la información (audio, pdf, zip, etc.), a no ser que sea ése el propósito. Por ejemplo, un
primer método, existen más métodos, para ocultar la información es usar un archivo anexo que
se llama .htaccess donde se prohíbe el listar el directorio que deseemos, indicándole al usuario
M1. HTML5.
Para crearlo podemos crear un fichero de esta forma y copiar el archivo al directorio que
queremos evitar que se indexes / listen los archivos.
o es posible que el sistema operativo (Linux/Mac) oculte el archivo, por lo que para verlo
deberás listar los archivos con la opción ls –a.
El usuario vería todos los archivos, tamaño, fecha y se los podría descargar. Si añadimos
el fichero antes comentado ".htaccess" a este directorio, prohibimos el listado, pero los archivos
siguen estando en el servidor, sólo no se muestran. El resultado sería el siguiente:
101
Con esta nueva versión de HTML5 podemos hacer un enlace no sólo a un elemento de
texto, sino también a un elemento de bloque que en la versión anterior no era soportado. Los
más comunes son los <li> o <div>. Esta última etiqueta <div> nos delimita trozos de código ya
sea por estética o por utilidad, la veremos más detenidamente en el módulo de CSS3.
<p> Si nos hemos creado un div especial y quiero hacer un enlace, en HTML5 se puede hacer:
<a href="miarchivo.html"><div>aquí puede ir no solo texto, sino muchos elementos (imágenes, videos,
tablas...etc.), y posteriormente los podré modificar con CSS3 y JQuery </div></a></p>
Sin usar nada de diseño respecto al divisor ni a la etiqueta <a> quedaría de la siguiente
forma, en siguientes capítulos volveremos a este ejemplo y ampliaremos:
Te recomiendo que una vez hemos llegado a este punto, te dirijas al ejemplo del curso
del directorio Ejemplo2/index.html y compruebes todo lo que hemos aprendido hasta ahora.
Intenta imitar el resultado sin utilizar el código original para asimilar correctamente los conoci-
mientos.
Si comprendes todos los elementos y los ejemplos; puedes continuar con el siguiente
apartado, sino, coméntale a tu tutor las dudas que no entiendas, dándole la mayor información
posible, apartado, página del manual, capturas de pantalla con el error, etc.
2. Multimedia e imágenes.
Cuando navegamos por las páginas web, en muchas ocasiones existen diferentes imá-
genes, ya sean imágenes de fondo, logotipos de la empresa, fotografías de los autores, etc. Una
imagen en la página web puede tener diferentes formatos: Gif, Jpeg y Png. Cada formato tiene
unas características, de forma resumida podemos decir que vamos a tener los siguientes forma-
tos de imágenes:
GIF: 256 colores como máximo, para imágenes que necesiten mucha definición no
serían válidas, pero para donde se usen pocos colores son idóneas por el poco tamaño que
ocupan. También permite animaciones, llamados GIFs animados, que son secuencias de varias
imágenes.
JPEG: 16,7 millones de colores por imagen, lo que son muy indicados cuando queramos
una buena definición de la imagen, aunque debemos mencionar que tiene cierta pérdida de
calidad al realizar la compresión. No permite trasparencias ni animaciones.
PNG: soporta también 16,7 millones de colores y tienen una buena tasa de
compresión, superior a las del tamaño GIF, además de ser un formato abierto y sin patentar.
Permite trasparencias de hasta 256 colores pero no permite generar imágenes animadas.
WebP: desarrollado por Google está ganando terreno cada vez más debido a su integra-
ción con HTML5 y reducción del tamaño de los archivos más que JPEG y GIF, perdiendo muy
poca calidad.
Para insertar una imagen en nuestra aplicación web vamos a poder usar.
M1. HTML5
<img src="rutaynombredelaimagen">
Por ejemplo podríamos tener en nuestra web una carpeta para ir almacenando las imá-
genes, y tener ahí todas las imágenes que vamos a utilizar en la web, además de estar todo más
organizado, nos creará una estructura web más fácil de mantener. Si escribimos el siguiente
código:
<img src="images/contactar/logo_mentor_mini.jpg">
Debemos pensar que la imagen puede estar no en nuestro propio servidor, puede ser un
enlace externo, por ejemplo imaginemos que una empresa que tiene diez sedes, muestran el ca-
lendario de entrega de sus productos; claro, es el mismo para todas las empresas, pero cada una
tiene su propio servidor. ¿Qué solución se podría dar? Tener los datos comunes en un servidor
web, imaginemos que está localizado en http://www.servidorexterno.com/imagenes/calendario.
png. En las restantes sedes deberíamos crear la imagen de la siguiente forma:
<img src="http://www.servidorexterno.com/imagenes/calendario.png">
Como única contrapartida tenemos lo siguiente: si el servidor donde está alojada la ima-
gen está caído, no se mostrará en ningún de los sitios restantes, además del tráfico extra que 103
estamos generando ya que debe realizar una petición web a otro sitio.
Los atributos adicionales que se pueden usar con las imágenes son los siguientes:
alt: contiene un texto alternativo sobre la imagen. Este texto tiene varias funciones importantes,
la primera es para los invidentes para poder leer el texto referido a la imagen, y el otro usado
por Google para almacenar y clasificar las imágenes respecto a los contenidos, a fin de alimentar
su base de datos de imágenes.
Podemos ver el resultado y si en Firefox, pulsamos sobre la imagen y dentro del menú
que nos aparece seleccionamos Ver información de la imagen comprobaremos que todo está
correcto:
Aula Mentor
104
Para aquellos que hayan estudiado HTML4, pensarán que me he olvidado de aligh,
border, hspace, vspace y longdesc. Estas etiquetas no se han mantenido en HTML5, por lo que
debemos usar CSS3 en su caso.
Para ello, se puede utilizar como realizamos en el apartado anterior un enlace a un blo-
que o en este caso una imagen. De tal modo que al pulsar sobre el enlace dirigimos al usuario
donde queramos; página web externa o interna. Un ejemplo puede ser:
M1. HTML5
<p>Si pulsas en esta imagen se abrirá en una nueva instancia la web del aula mentor <br>
<img src="images/contactar/logo_mentor_mini.jpg"></a></p>
Si nos damos cuenta, dependiendo del navegador, aparece un recuadro del mismo color
de los enlaces alrededor de la imagen. Esto es porque el navegador le da las mismas propieda-
des y lo trata como un enlace más. Todo esto sería parte del diseño y trataremos en el módulo
de CSS3.
Para agregar a la web una imagen de fondo, se ha de usar la propiedad background- 105
image en las hojas de estilo con CSS3, pues ha quedado obsoleto el atributo background en el
body como se hacía con HTML4, pero adelantamos que se puede añadir una imagen de fondo a
nuestra web añadiendo estas etiquetas al head dentro de las etiquetas <style></style>, realmente
corresponde a etiquetas de CSS3, pero a modo de introducción:
<head>
<style>
</style>
</head>
La imagen de fondo se repetirá por toda la web. Hay formas de usar imágenes muy
pequeñas y crear efectos o degradados muy interesantes con pocos kbs, liberando a la web de
cargar un archivo grande en memoria. Aunque hoy en día se disponen de conexiones y disposi-
tivos más avanzados, una web que no sea muy pesada (imágenes de mucha resolución) siempre
va a ser más valorada por los usuarios.
Aula Mentor
Por ello, hay que definir muy bien cada imagen al tamaño correcto y no caer en el error
de usar una imagen superior, por ejemplo 1024x768 píxeles, y modificarle luego con width y
height el tamaño para usar el 10% del tamaño. Ya que aunque muestre esa imagen en el navega-
dor, a título de navegador y memoria en el navegador ha cargado completamente la imagen y ha
tenido que descargar primero la imagen del tamaño superior. Todo esto se soluciona realizando
una buena estructura y organización de la web en la fase del diseño.
Con HTML5 se ha facilitado la inserción de audio y vídeo en nuestras web, sin tener que
usar plug-in ni flash como se hacía anteriormente. Ahora con la etiqueta <audio> insertamos
audio, y con la etiqueta <video> podemos incrustar vídeos en nuestra web.
Por ejemplo si queremos insertar un audio, lo primero que tenemos que saber es qué
formatos soporta, los atributos opcionales y la sintaxis de uso.
FORMATO DESCRIPCIÓN
Mp3 Realiza una compresión fija o variable (bitra-
te). Pero no lo soportan todos los navegado-
res.
Ogg Alternativa al formato mp3 libre y muy expan-
106 dido.
Wav Sin compresión, ocupa mucho más que los
anteriores, por lo que no es muy aconsejable
usarlos.
Acc Más compresión que todos los anteriores, por
lo que es muy recomendable usarlo.
Opus Opus puede funcionar igualmente en altos y
bajos bitrates. Opus tiene un algoritmo con un
retraso muy bajo (22.5 ms), lo que es muy
necesario para usarlo como formato de audio
en enlaces de comunicaciones, que necesitan
una latencia muy baja para permitir la conver-
sación natural en eventos en directo. Lanzado
el 11 de septiembre de 2012.
Weba Desarrollo de Google y complemento del for-
mato de vídeo WebM que veremos a conti-
nuación.
Como podéis apreciar tenemos una gran variedad y se están trabajando en formatos
nuevos y mejores de compresión. Pero debemos tener presente que no todos los navegadores
soportan todos los formatos, por lo que es necesario al menos usar dos para ampliar al máximo
posible el número de navegadores soportados. A fecha de la escritura de este documento tene-
mos las siguientes compatibilidades:
M1.HTML5
none
src URL Ruta del fichero.
</audio>
Existen varios gratuitos, por ejemplo uno de ellos puede ser http://audacity.sourceforge.
net en el que podemos abrir el archivo .mp3 y exportarlo a .ogg para poder agregarlo a nuestra
carpeta sound.
108
Para insertar vídeos en nuestra web y que podamos reproducirlos debemos usar un mé-
todo parecido al que hemos realizado con el audio, pero vamos a prestar atención a fijarle un
ancho y alto específico al vídeo. Esto también se puede realizar con CSS3, como veremos en el
capítulo correspondiente.
M1. HTML5
Al igual que con el audio, debemos saber que formatos son los más usado y permitidos
en la web:
FORMATO DESCRIPCIÓN
Ogv Equivalente a Ogg pero para archivos de ví-
deo.
H.264 Codecs estándar y promocionado por Apple,
no es libre ni gratuito.
WebM Formato de Google y muy estándar en nave-
gadores de Android 2.3 y otros navegadores.
Mp4 Formato avanzado el mp3, muy usado ya que
la mayoría de los dispositivos móviles graban
en Mp4 o 3GP.
none
src URL Ruta del fichero.
poster URL Ruta de una imagen que apa-
recerá antes de que el usuario
pulse a play.
Para realizar las conversiones de vídeos existen diferentes herramientas, una de ellas es
el Freemake Video Converter: http://www.freemake.com/. El potencial de esta herramienta es
que si le pasamos un vídeo por ejemplo en formato wmv y seleccionamos convertir a HTML5,
el sólo nos hará todo el trabajo automáticamente y nos generará los 3 diferentes formatos Ogv,
WebM y Mp4, creándonos el código en HTML5 para que podamos insertarlo en nuestra web.
1. Selecciono Convertir.
Aula Mentor
4. Selecciono el formato final; en este caso lo voy a dejar igual que la fuente origen.
5. Pulso en Convertir.
Me genera una carpeta y archivo HTML5 donde puedo copiar y pegar directamente en
mi web.
(En mi caso he modificado las rutas de los archivos para que todo esté en la ruta /www/film/)
110
Si insertamos el código generado comprobando que las rutas, localización de los ar-
chivos dentro de nuestro servidor, están correctas a donde están los archivos, por consiguiente
tendremos:
</video>
Y si lo ejecutamos en los mismos navegadores que antes se puede ver que los que sopor-
taban correctamente la etiqueta audio, lo hacen también con vídeo. Prueba a insertar un vídeo
que tengas o te descargues de internet y prueba su resultado.
Poco a poco la tendencia de todos los navegadores es soportar las etiquetas <audio> y
<video>, ya que se simplifica mucho el uso elementos multimedia.
En determinados casos deberemos hacer comprobaciones para detectar los navegadores y usar
los métodos antiguos en su caso.
Comentar también, que muchas veces dependiendo del programa que ha generado/ 111
convertido el audio o vídeo no funcionará en algunos navegadores que sí soporta HTML5. Esto
es por el tipo de codificación que usa, versiones o errores en la conversión que algunos pasan
por alto y otros no los permiten.
Debéis probar en este caso con otro programa reconvirtiendo el archivo y probar
antes de desestimar el navegador. Muchas veces no es problema del navegador sino de la com-
probación o el programa que lo ha generado.
3. Tablas y formularios.
3.1. Tablas.
En versiones anteriores de HTML el uso de tablas en web tenían un doble uso: insertar
elementos organizados del usuario para mostrar datos al usuario, con o sin borde, y otro muy
importante que la mayoría de los usuarios no sabían mientras navegaban por la red, y era la
maquetación y colocación de las secciones o elementos web, por ejemplo, una forma sencilla de
organizar una web sería: ¿para qué resolución voy a trabajar? p.e. 800 píxeles (su forma abrevia-
da px), de ancho como máximo. Voy a poner encabezado, ¿de qué tamaño? 250px, y un menú
de 150px. Y un pie de página de 250px. Se podía representar algo parecido a esto:
Aula Mentor
112
Hoy en día con la nueva versión de HTML5 y el fomento de las hojas de estilo con CSS3
todo esto es impensable. Ya que el anidamiento de las tablas y el mantenimiento de la misma
hacía difícil las modificaciones a posteriori. Como veremos con (div), junto con los elementos de
clase (class) y de elemento (id) la forma de organizar las web es totalmente diferente.
Para insertar tablas en nuestra web debemos usar las etiquetas o tag:
Tag Descripción
<table> Para definir la tabla globalmente y con la eti-
queta.
<tr> Para indicar una fila dentro de la tabla.
<td> Para indicar cada columnas dentro de la tabla.
<th> Para indicar que corresponde a la celda nomi-
nativa de la fila o columna. Aunque no es obli-
gatoria ponerla, nos debemos acostumbrar a
realizarlo, ya que es muy recomendable usarla
para posteriormente cuando estemos con el
diseño aplicar una característica concreta, por
ejemplo, quiero que todas las celdas nominati-
vas o cabeceras <th> sean de color azul y con
fondo blanco.
M1. HTML5
<table>
<tr>
</tr>
<tr>
</tr>
<tr>
113
<td>Celda 7</td> <td>Celda 8</td> <td>Celda 9</td>
</tr>
</table>
Voy adelantar cómo se puede añadir un borde de un píxel, para que se puedan ver bien
las demás características. Dentro del <head> </head> de la página, vamos a definir el siguien-
te código:
Aula Mentor
<style>
table{border-collapse:collapse;}
</style>
Con este código obtendríamos el resultado que esperábamos, una tabla con sus filas,
pero depende de la versión del navegador tendrás otro resultado, si es muy antigua no entende-
rá o representará bien la etiqueta border-collapse.
Si por ejemplo queremos fusionar o combinar tablas, debes saber que podemos fusionar
tanto filas como columnas. Para ello usamos los siguientes atributos sólo cuando sean necesa-
rios:
rowspan: Atributo para fusionar filas. Indica el número que fusiona partiendo
desde ella.
El código correspondiente para representar esta tabla con estas características sería el
siguiente:
<table>
<tr>
<th>Celda 1</th><th colspan="2">2 Celdas tipo fila combinadas</th><th colspan="2">2 Celdas tipo fila
combinadas</th>
M1.HTML5
</tr>
<tr>
</tr>
<tr>
</tr>
<tr>
</tr>
<tr>
Además, siempre podemos añadir un título o leyenda a la tabla. Para ello usamos la
etiqueta <caption>, la cual ha de situarse justo después de la etiqueta <table> y sólo puede
aparecer una sola vez en esa tabla. El título se adaptará al tamaño de la tabla. En principio la
posición del título aparecerá en la parte superior; si quisiéramos modificarla se hará mediante
CSS3 añadiendo al estilo caption {caption-side: bot-tom;}. Si realizamos el siguiente código:
<table>
<caption>Tablas en HTML5</caption>
<tr>
</tr>
<tr>
</tr>
<tr>
Aula Mentor
</tr>
</table>
Ahora vamos a ver un atributo muy interesante para agrupar diferentes celdas y aplicarle
el diseño que queramos, para ello usamos la etiqueta <colgroup>. Esta etiqueta iría después
de la etiqueta <caption>, si se ha implementado, sino a continuación de la etiqueta <table>.
Imaginemos que queremos obtener una tabla con varias celdas de un color y otras de otro color.
<colgroup>
<col style="background-color:green">
</colgroup>
<colgroup> <colgroup>
</colgroup>
M1. HTML5
Por si quedara alguna duda, vamos hacer un último ejemplo más complejo:
<colgroup>
<col style="background-color:yellow">
</colgroup>
Hay que destacar que hemos usado notación en línea de CSS3 para exponer el ejemplo
de una forma más clara, en concreto hemos usado la sentencia style para indicar que vamos
117
a usar un estilo propio, y el atributo "background-color:#8db3e2" para indicar el color. Para
indicar el color se puede usar en notación RGB precedida de #, indicando 8d para el nivel de
R(Red-Rojo), d3 para en nivel de G(Green-Verde) y e2 para el nivel de B(Blue-Azul). También se
puede indicar el color usando algunos nombres en inglés predefinidos, por eso hemos podido
añadir style="background-color:green".
Este tipo de diseño es muy útil ya que la mayoría de las tablas que se representarán en
la web, debido a que las web siempre crecen hacia abajo (por eso la rueda del ratón estándar
solo actúa hacia arriba y abajo), nos podría indicar con diferentes colores las columnas de una
tabla, consiguiendo facilitar visualmente el contenido de la tabla a nuestro usuario.
El lector puede estar pensando que le gustaría hacer lo mismo con las filas. Bueno, en
principio también es posible. Normalmente lo que se suele hacer es poner un sombreado a las
filas alternas para facilitar la lectura de la tabla, pero todo eso lo vamos a ver en los siguientes
módulos, con CSS3 y JQuery una forma muy fácil de obtener estos ejemplos.
Para los que hayan programado anteriormente en HTML4, comentar que están obsole-
tas los atributos align, bgcolor, border, cellpadding, cellspacing, frame, rules, summary y width.
¿Cómo podemos hacer todo lo que hacíamos antes? Como era de esperar toda la parte del di-
seño se ha trasladado a CSS3, que veremos en el siguiente módulo. En HTML5 se ha intentado
cargar toda la parte del diseño o aspecto a las hojas de estilo, de ahí la potencia y versatilidad.
3.2. Formularios.
Los formularios web están presentes en todas aquellas páginas o aplicaciones que nece-
siten interacción con el usuario, ya sea para obtener datos de él como para filtrar o seleccionar
Aula Mentor
los datos. Seguro que alguna vez te has identificado en una web mediante usuario y contraseña,
esta acción tiene detrás un formulario web:
- Se validan los datos en el navegador del cliente. Opcional pero recomendable para hacer un
primer bloqueo a los robots e inyección de código malicioso.
- Se trata y se envía respuesta al cliente. En este caso, mostrar un error si los datos no son
correctos y acceder si es usuario correcto del sistema.
No veremos la parte del servidor ya que ésta se suele hacer mediante otros lenguajes
de programación: CGI, Perl, PHP, ASP, JSP, etc. Pero sí vamos a ver todas las partes y elementos
que podemos usar en HTML5. Antes para la validación de formularios se podía hacer en el na-
vegador mediante JavaScript, pero hoy en día HTML5 nos proporciona también elementos para
validar los datos por parte del navegador del cliente.
Es obligatorio comentar al respecto que como HTML5 está siendo la tendencia pero no
está implementada todavía en todos los navegadores. Existen clientes con navegadores antiguos
que no se actualizan, por ello hay que saber el perfil de nuestros usuarios, ya que la validación
no sería correcta para navegadores que no cumplan con el estándar de HTML5. Decir que tiene
una parte buena, ya que la tendencia es que todos los navegadores lo hagan en un futuro y
estaríamos dominando a día de hoy el lenguaje que se va a implantar.
118
Para declarar un formulario tenemos que usar la etiqueta <form> seguida de todos los
elementos que queremos solicitar al usuario y debemos cerrarla con </form> para indicar al
navegador que ha finalizado la entrada de datos. A continuación, podemos usar los siguientes
atributos:
Atributo Descripción
name Nombre que va a designar este formulario
para identificarlo de otros en el caso de existir
varios.
action Indica la acción a realizar cuan-
do el usuario envíe el formulario, es-
tas acciones pueden ir desde enviar mail
(action="mailto:nombrecorreo@nombredo-
minio), de forma interna con (action=""), o si
tenemos un archivo ya sea local o en internet,
podríamos poner: (action="nombrearchivo")
ó (action="direccionWeb/archivo").
enctype Especifica el mime type como se enviarán los
datos del formulario, su valor por defecto es
application/x-www-form-urlencoded, pero
también puede tomar los valores multipart/
form-data o text-plain.
M1. HTML5
Cuando se hacen validaciones por parte del usuario indicado en el action, los atributos
enctype y method no llegan al servidor por lo que no son necesarios.
Para comprobar los datos que recibirían el servidor o la página que va a tratar el formu-
lario, vamos a crearnos un archivo llamado recogidadedatos.php, éste se va a usar para mostrar
todos los valores. Este archivo usa sentencias del lenguaje PHP, que no corresponden a este
manual, pero nos ayudará a entender la forma usual de trabajar con este componente en HTML5.
index.html recogidadedatos.php
El dato más usual de entrada en un formulario web va a ser el campo de texto, donde
podemos escribir texto alfanumérico (p.e. Nombre de usuario, dirección, DNI, etc.). Para ello,
usamos la sentencia <input type="text">.
En HTML5 se puede asociar una etiqueta de tipo <label> para indicar el texto asociado
al campo en cuestión. Vamos a omitirlo en este módulo porque no hemos dado identificadores
(id). El uso sería: <label for="miIdCampo">Introduce tu nombre</label>
Hemos añadido un botón para decir al navegador que queremos enviar los datos,
Cuando pulsemos el botón "Enviar Datos", se enviarán los datos que hemos rellenado
desde el fichero que contiene el formulario, hacia el fichero que habíamos puesto en el action.
Aula Mentor
[edad] => 35
index.html recogidadedatos.php
Atributo Descripción
name Nombre que va a distinguir unívocamente a
ese campo dentro de ese formulario.
size Define el número de caracteres visibles del
campo de texto y la longitud que ocupará en
la pantalla. Por defecto el valor es 20.
maxlength Número máximo de caracteres que el usuario
puede introducir en el campo.
value Valor por defecto que va a contener el campo,
como si el usuario hubiera escrito el valor. El
usuario puede modificar si quiere el valor.
120 readonly Indica que el usuario no puede modificar el
contenido, se quedaría en modo lectura. Apa-
recerá el valor pero no se podrá editar.
placeholder Sugerencia del texto, orientamos al usuario
con el valor a introducir, pero no lo toma
como valor por defecto, como pasa con el
atributo value.
autofocus Sitúa el foco sobre el elemento para que el
usuario no tenga que desplazarse a él y hacer
clic.
required Obliga al usuario a escribir o rellenar este
campo. Si no lo hace aparece mensaje indi-
cando que se complete este campo, evitando
así mandar al servidor campos vacíos y proce-
samiento erróneo.
pattern Obliga al usuario usar un patrón definido de
entrada. Por ejemplo si estamos pidiendo la
edad o el número de teléfono, debe introducir
valores entre [0-9]. Si queremos ajustar a una
longitud exacta podemos usar {longitud} justo
después.
Con los nuevos atributos de HTML5 se simplifica mucho la validación de datos, pues
antes se debía usar JavaScript y normalmente en otra sección muy distinta del código. Como
contraposición, tenemos que tener en cuenta que no todos los navegadores lo soportan todavía,
ya que es un lenguaje en plena expansión. Algunos atributos sobre el diseño se verán en el ca-
pítulo de CSS3 y JQuery.
M1. HTML5
Estoy aprendiendo<br>
121
<input type="text" name="curso" value="HTML5" readonly><br>
<hr>
</form>
Practica intentando imitar el resultado sin usar el código del archivo en el ejemplo 4.
Aula Mentor
En muchas ocasiones nos interesa agregar un campo que oculte la información que está
escribiendo en pantalla el usuario, por ejemplo cuando vamos a ingresar una contraseña, no se
imprimirán por pantalla el texto sino que aparecerán * o •. Para ello usamos el atributo <input
type="password"> Si al ejemplo anterior, quisiéramos añadirle el campo contraseña tendríamos
que agregar después del nombre usuario:
También podemos usar los atributos de filtro y restricciones vistos anteriormente, por
ejemplo si queremos que tenga solo números y 6 números de caracteres exactamente, debería-
mos escribir:
Introduce tu contraseña<br>
Comentar que en el lado del servidor se representarán los valores que hayamos escrito,
el formulario completo que se recibirá usando datos del ejemplo 4.
Las áreas de texto son ampliamente usadas para la escritura de texto con muchos carac-
teres, normalmente van a ser comentarios u observaciones por parte del usuario. No debemos
confundir con un campo de tipo input="text". Para ello usamos la etiqueta <textarea>…</tex-
tarea>.
Siguiendo con el ejemplo anterior, si queremos añadir un campo que sea comentarios/
observaciones u otros datos, deberemos escribir lo siguiente:
M1. HTML5
<textarea name="comentarios1"></textarea><br>
Podemos usar muchos atributos como pasaba con la anterior etiqueta, a continuación os
muestro los más importantes:
Atributo Descripción
name Nombre que va a distinguir unívocamente a
ese campo dentro de ese formulario.
maxlength Número máximo de caracteres que el usuario
puede introducir en el campo.
value Valor por defecto que va a contener el campo,
como si el usuario hubiera escrito el valor. El
usuario puede modificar si quiere el valor.
readonly Indica que el usuario no puede modificar el
contenido, se quedaría en modo lectura. Apa-
recerá el valor pero no se podrá editar.
placeholder Sugerencia del texto, orientamos al usuario 123
con el valor a introducir, pero no lo toma
como valor por defecto, como pasa con el
atributo value.
autofocus Sitúa el foco sobre el elemento para que el
usuario no tenga que desplazarse a él y hacer
clic.
required Obliga al usuario a escribir o rellenar este
campo. Si no lo hace aparece mensaje indi-
cando que se complete este campo, evitando
así mandar al servidor campos vacíos y proce-
samientos erróneos.
Pattern Obliga al usuario a usar un patrón definido de
entrada. Por ejemplo si estamos pidiendo la
edad o el número de teléfono, debe introducir
valores entre [0-9]. Si queremos limitar a una
longitud exacta podemos usar {longitud} justo
después.
Wrap Específica cómo se van a tratar los saltos
de línea cuando se envíe el contenido. Con
wrap="hard" se inserta un carácter de salto de
línea junto al texto. Con wrap="soft" no se in-
serta ningún carácter de salto de línea (opción
tomada por defecto en el navegador).
<textarea name="comentarios1"></textarea><br>
<select name="opcion_documento">
<option value="dni">DNI</option>
<option value="cif">CIF</option>
</select>
Debemos fijarnos que el valor que se mandaría con este formulario no es DNI en ma-
yúsculas, ya que ese valor es el que se muestra al usuario, el verdadero valor es el que está en
el parámetro value=" ".
Atributo Descripción
name Nombre que va a distinguir unívocamente a
ese campo dentro de ese formulario. Si va a
ser una selección múltiple debemos añadir
después del nombre dos corchetes [ ]. P.e <se-
lect name="opciones[ ]" multiple>
size Indica el número de elementos que va a visua-
lizar en el desplegable, por defecto, siempre
es uno y al hacer clic en la fecha de la derecha
se despliegan los elementos restantes, pero si
se hace igual al número de elementos apare-
cerán todos de una vez y se podrá seleccionar
haciendo clic en uno de ellos directamente.
value Valor por defecto que va a contener el campo;
éste puede ser alfanumérico. Es el valor que
recibirá el servidor o elemento que esté indi-
cado en el action.
multiple Si indicamos este atributo podremos seleccio-
nar varios elementos de la lista y éstos serán
los que reciban el servidor o elemento que
esté indicado en el action. Para marcar más 125
elementos, el usuario deberá tener la tecla
[Ctrl] pulsada a la vez que hace la multiselec-
ción.
selected Si no se indica ningún elemento de la lista,
aparecerá por defecto el primer elemento de
la lista. En caso contrario, el elemento que ten-
ga selected como atributo será marcado por
defecto.
<option value="jazz">Jazz</option>
<option value="disco">Disco</option>
</select>
En este caso hemos usado una selección múltiple, con varias opciones predefinidas. Si
ejecutamos eso en el navegador tendríamos un resultado parecido a éste:
En este momento nos hemos dado cuenta que sólo le ha pasado la última opción que
tiene el selected, ¿entonces para qué está la selección múltiple? Bueno, realmente lo está ha-
ciendo bien y si pasamos los datos en action="" pasará los datos por URL correctamente. Si
cambiamos el action veremos que en la barra de direcciones aparece lo siguiente
……MODULO1/U2/HTML5/Ejemplo4/?opcion_musica2=blues&opcion_musica2=clasica
Pero ojo, pensemos que tenemos que mantener una web que usa PHP y debemos captu-
rar todos los datos que ha marcado el usuario, ¿cómo se podría hacer? Debemos forzar e indicar
al navegador que esta variable va a ser un array (lista de parámetros) en vez de una variable
sola, para ello al final del nombre de la lista de selección debemos poner dos corchetes [ ], sin
espacio entre ambos.
<option value="jazz">Jazz</option>
<option value="disco">Disco</option>
<option value="pop">Pop</option>
</select>
)
M1. HTML5
Recordar que los valores que se envían son los contenidos en el atributo value del
option y no el nombre que define el ítem de la lista.
Para mostrar botones de selección única, llamadas radio button, se usa la siguiente
sintaxis.
El texto mostrado es sólo para indicar al usuario que opción está relacionada con la
elección, así si quisiéramos preguntar al usuario su país de nacimiento podríamos escribir:
</form>
<br>
</form>
Si queremos usar otro componente para seleccionar varios elementos, y poder hacer una
especie de lista para checkear, existen los elementos de tipo chekbox.
128
También disponemos del atributo ckecked para indicar los valores marcado previamente
y recordando lo que pasaba en el ejemplo anterior, si queremos pasarle todos los datos al post,
debemos agregar al final del nombre corchete de apertura y de cierre [ ] (sin espacio entre am-
bos). Si por ejemplo, queremos hacer al usuario una pregunta que va a tener múltiples respues-
tas, podríamos hacer lo siguiente:
<br>
</form>
Con esto le comunicamos al navegador que debe actuar y enviar a la dirección que
contenga action los datos que contenga el formulario. Si no se indica nombre en el value del
submit, dependiendo del idioma y del navegador, agregará un texto por defecto, por ejemplo
en Firefox el texto que pone por defecto es "Enviar consulta", en Google Chrome "Enviar", en
Internet Explorer "Enviar consulta", etc.
129
Podemos usar en vez de un botón, una imagen. Para ello debemos usar el atributo src y
usar la etiqueta de la siguiente forma:
Veamos un ejemplo; si en vez del típico botón queremos agregar uno diferente, y tene-
mos la siguiente imagen, llamada btn_envio.jpg dentro de la carpeta img:
</form>
Si nos fijamos además de la variable de texto que le hemos enviado llamada prueba con
el valor que hemos escrito "prueba", se ha enviado unas coordenadas [x] e [y] que corresponde
a las coordenadas donde hemos hecho clic dentro del botón de la imagen.
Al igual que pasaba con el botón submit, podemos agregarle un texto inicial distinto al
que selecciona el navegador:
El efecto será en el caso de que hayamos escrito algo en todos los elementos que com-
130 pongan el formulario (texto, textarea, select, radio button, checkbox, etc.) después de pulsar el
botón "Resetear configuración", los pondrá en su estado original. Veamos un ejemplo de prueba,
si el usuario tiene relleno un formulario con los siguientes datos:
Podemos añadir otro tipo de botón a nuestro formulario, tanto para activar comandos en
JavaScript o JQuery, como para hacer que todo un bloque o imagen sea un botón para el usua-
rio. Para ello usamos la etiqueta <button> </button>, y si la estamos usando en un formulario
esta etiqueta puede sustituir el botón de envío o de anulación de un formulario (submit, reset).
Pero también se puede usar fuera del formulario, por eso se les llama de acción, porque van a
realizar alguna acción ya sea localmente o va activar una función externa, que posteriormente
debemos de programar.
M1.HTML5
Imaginemos que queremos que cuando se pulse el botón nos salga una ventana de
JavaScript indicando "Hola, has pulsado el botón"; posteriormente en el módulo de JQuery pro-
fundizaremos más en estas acciones.
Los atributos más importantes que puedes usar con esta etiqueta son los siguientes:
Atributo Descripción
name Nombre que va a distinguir a este componen-
te.
type Define el estilo del botón, si es para dentro
de un formulario podemos usar los atributos
submit y reset. Si es fuera de él podemos usar
button.
disabled Desactiva el botón impidiendo que el usuario 131
pulse sobre él. Un ejemplo típico puede ser,
hasta que no rellene todos los campos desac-
tivamos el botón de continuar. Cuando todos
los campos no estén vacíos, vuelvo a poner el
botón en enabled.
<br>
</form>
Crea por ti mismo dos formularios, uno usando <input type="submit"> y otro con <but-
ton type="submit">, observa que el resultado es el mismo, pero en este último caso puedes
agregar más información ya que al tener etiqueta de apertura y de cierre, dentro podemos usar
más cosas como pasa con el <input type="submit>.
Aula Mentor
Además de las variables que hemos visto anteriormente, podemos pasar información
oculta que no aparecerá en la pantalla del usuario, pero sí podremos tratar posteriormente en
el servidor, o localmente con JQuery. Un ejemplo puede ser la hora del sistema, el índice de la
tabla que ha pinchado el usuario, el nombre del archivo que lo llama o cualquier otra cosa que
se crea para que ayude al programador. Para ello tenemos que usar la siguiente estructura:
</form>
Y si rellenamos los campos con Minombre y 12345678, estaríamos mandado los siguien-
tes datos, sin que el usuario lo sepa:
Prueba a pasar varias variables ocultas dentro de un formulario, y observa que se reciben
correctamente. Tienes un ejemplo en el archivo: Ejemplo4/#variablesocultas
4. Resumen.
- La estructura de HTML5 difiere de sus versiones anteriores, en declaraciones distintas de las
etiquetas y la incorporación de etiquetas o Tags nuevos.
- Quirks Mode será el modo que adoptará el navegador y como mostrará la página si no
encuentra declarado el DOCTYPE en la primera línea del archivo HTML.
- La meta etiqueta charset, indica el juego de caracteres usado, en nuestro caso usaremos UTF-
8, ya que es un conjunto de caracteres internacionales de Unicode de diferentes idiomas.
- Las etiquetas que nos proporciona HTML5 para crear la semántica de la web son <headers>
para cabeceras, <nav> para la navegación, <footer> para la parte inferior y <aside> para los
anexos que deseemos añadir.
133
- Para crear párrafos usaremos la etiqueta <p>…texto…</p>, ésta insertará un salto de línea
antes y después del texto insertando en su interior.
- El uso de títulos en la web es muy importante para organizar y clasificar el contenido se-
gún la importancia. Disponemos de diferentes niveles de títulos, siendo de mayor a menor
<h1><h2><h3><h4><h5><h6>.
- Podemos usar listas ordenadas <ol> como no ordenadas <ul>. Los ítems de cada lísta se han
de definir con la etiqueta <li>. Éstas tienen diferentes atributos que podemos usar, además
de poder entremezclarlas entre sí.
- Con la etiqueta <blockquote> podemos agregar citas a nuestra web, ésta agregará un salto
de línea antes y otra después. También podemos usar la etiqueta <q> para crear citas, pero
en este caso serían en línea, sin agregar ningún salto de línea.
- Se pueden agregar diferentes formatos o estilos a los textos de nuestra web, para ello usare-
mos <b> para texto en negrita, <i> para texto en cursiva. Para agregar saltos de línea usare-
mos la etiqueta <br> y para agregar líneas de separación usaremos <hr>, ésta última también
agrega un salto de línea antes y después.
- En todas las páginas usaremos enlaces de diferentes tipos usando la etiqueta <a>. Común-
mente se llaman hipervínculos y nos pueden enlazar tanto con una página local a nuestra
web, a una página web externa, secciones concreta de la misma página, direcciones de
correo o archivos para que el usuario se descargue. En HTML5 también se pueden hacer
enlaces a elementos de bloque para posteriormente agregarles los efectos que deseemos.
- Para el uso de elementos multimedia en la web, tenemos la etiqueta <audio> para agregar
audio y <video> para agregar nuestros vídeos. A veces será necesario la conversión a dife-
rentes formatos para dar soporte a más navegadores.
- Para el uso de tablas, usaremos la etiqueta <table>, donde definiremos las filas como <tr> y
las columnas con <td>. Existen otras etiquetas como son <th> para indicar celda cabecera o
<caption> para agregar un texto a la tabla.
- Los formularios son unos elementos web que usaremos a través de la etiqueta <form>, don-
de agregaremos elementos en su interior de diferentes tipos para que el usuario introduzca
datos para su posterior procesado en la URL indicada en el action.
….
….
</select>
<button type="submit">texto</button>
M1.HTML5
<button type="reset">texto</button>
135
Unidad 3. Elementos avanzados con
HTML5
En esta unidad vamos a ver algunos elementos que son totalmente nuevos y otros que
se han mantenido en HTML5 ya que su utilidad era realmente necesaria. Este es el caso de las
etiquetas <script></script><noscript></noscript>.
136 Debemos saber que un script son trozos de código de programación que realizan una
función determinada, en HTML y HTML5 siempre que hablamos de script nos referimos a trozos
de código realizado en JavaScript. Por ejemplo, si queremos sacar una ventana cuando pulsa-
mos sobre un texto, deberíamos agregar este texto entre el <head> del documento:
<script type="text/javascript">
function muestraVentana() {
</script>
<script type="text/javascript">
function muestraVentana() {
Una function o función es aquella que realiza unas acciones determinadas, puede reci-
bir unos parámetros de entrada para procesarlos posteriormente y además nos puede devolver
M1. HTML5
el resultado o la acción que deseemos. En este caso nos creamos una función muestraVenta-
na(), la cual no va a tener ningún parámetro de entrada, podría tener por ejemplo un texto de
entrada y sea ése texto el que muestra la ventana, y nos abrirá una ventana en el navegador.
Un detalle muy importante respecto a las funciones es que podremos llamarlas las veces
que deseemos dentro del código, pues siempre debemos intentar reutilizar el código, ya que
éste nos facilitará el mantenimiento web, reducirá y simplificará la página. Las siguientes líneas
que tengamos a partir de la llave de la función serán las acciones a realizar, en este caso tene-
mos:
En esta función vamos a crear una ventana con un texto fijo. Por ejemplo ¡Soy una ven-
tana! Pero podríamos hacer muchas otras funciones: sumar parámetros de entrada y devolver el
resultado, restar, modificar el contenido web, etc. Lo único que tenemos que tener en cuenta es
que todas estas funciones se hacen del lado del cliente, es decir, quien realizaría la suma es el
navegador del cliente, y no nuestro servidor web.
} 137
Con esta llave cerramos la función e indicamos al navegador que ya hemos terminado de
hacer nuestras acciones. Todo este tipo de sintaxis es obligatoria y no se puede omitir, ya que
sino no funcionará correctamente, y encontrar errores a posteriori puede ser difícil.
</script>
Como en la mayoría de las etiquetas o tag HTML, debemos agregar la etiqueta de cierre
para comunicar que ahí finaliza. Es obligatoria ya que si no puede transformar el código html y
hacer pensar al navegador que toda nuestra página es de tipo script, lo que generaría errores en
nuestra web.
Ahora lo que nos hace falta es "llamar" a esa función para que realice las acciones per-
tinentes, una forma de hacerlo sería así:
Le hemos añadido el evento onclick para decirle al navegador, cuando el usuario pulse
sobre mí (haga click sobre mí), que llame a la función muestraVentana();".
<!DOCTYPE html>
<html lang="es">
<head>
<title>Script en HTML5</title>
<script type="text/javascript">
function muestraVentana() {
</script>
</head>
138 <body>
<section>
</section>
</body>
</html>
El resultado sería éste, aparece el texto y al pulsar sobre él, llamaremos a la función
muestraVentana(), realizará las acciones que corresponda, en este caso mostrar una alerta con
un texto concreto:
Como hemos comentado existen muchos script posibles y acciones a desarrollar que
puede ser que nuestro navegador, sobre todo si es muy antiguo, no las soporte. Todo esto es
M1. HTML5
Otro problema que nos podemos encontrar es que el usuario tenga bloqueados los
script en su navegador, por lo que no podrá ejecutarlos. Si hemos basado parte del desarrollo de
nuestra web en ellos, es vital comprobar si el usuario va a poder leer o no los script. Para ello
se creó la etiqueta <noscript>, un ejemplo de uso puede ser:
<script type="text/javascript">
function muestraVentana() {
</script>
<noscript>
<hr>
<p>Estimado usuario</p>
<p>Hemos detectado que nuestra página no se va a ver correctamente en tu navegador porque tienes des-
139
activado JavaScript </p>
<p>La prueba es que si pulsas sobre el texto anterior no se abrirá ninguna ventana</p>
<hr>
</noscript>
En Windows 7, nos vamos al enlace de Google Chrome, botón derecho sobre él, y botón
derecho nuevamente sobre el enlace Google Chrome y seleccionamos propiedades:
Nos abrirá una ventana con la configuración del acceso directo, buscamos la ruta y le
añadimos al final el parámetro -disable-javascript después de la comilla, dándole un espacio
entre ambos, quedando de la siguiente forma:
Aula Mentor
140
¡Ojo! Debemos ejecutar ese acceso directo y no cualquier otro que haya en el ordenador,
ya que sólo hemos modificado éste, y posteriormente escribir en la barra de direcciones del
navegador que se ha abierto: http://localhost . Por ejemplo si se hace desde el propio Wamp, no
funcionará ya que es un acceso diferente al que acabamos de modificar.
Otra forma de hacerlo es a través del propio navegador, para ello nos vamos a las prefe-
rencias del navegador:
M1. HTML5
141
Además de usar la etiqueta <noscript> podemos detectar más información del navegador
y mostrar información más personalizada, informando al usuario de la necesidad de actualiza-
ción, sobre todo con las versiones antiguas de Internet Explorer, para ello podríamos hacer:
Aula Mentor
<!--[if IE 6]>
<SCRIPT LANGUAGE="JavaScript">
</SCRIPT>
<![endif]-->
<!--[if IE 7]>
<SCRIPT LANGUAGE="JavaScript">
</SCRIPT>
<![endif]-->
<!--[if IE 8]>
<SCRIPT LANGUAGE="JavaScript">
</SCRIPT>
<![endif]-->
Practica intentando imitar el resultado sin usar el código del archivo ejemplo01-noscript.html.
HTML5 da un gran paso con esta funcionalidad y se adapta a los nuevos dispositivos tác-
tiles, ya que permite que podamos hacer dinámica nuestra web y podamos arrastrar y soltar
(drag and drop) elementos a través de ella.
Para poder usar este elemento antiguamente se solía usar Adobe Flash Player, debido a
las posibilidades que nos facilitaba, pero con poco código hoy en día podemos añadir muchas
funcionalidades a nuestra web, y tendrán un efecto muy llamativo, además darán soporte a
Smartphone, Tablet y dispositivos táctiles en general.
1) Lo primero que necesitamos es un elemento a desplazar, lo más usual es una imagen. Por
ejemplo, voy a escoger la imagen de HTML5 y CSS3, le voy a poner de nombre logo_html5_css3.
jpg y la voy a guardar en mi carpeta images dentro de la carpeta web de mi servidor.
M1. HTML5
2) Lo siguiente es un elemento donde vaya a encajar esa imagen. Tenemos que pensar que ini-
cialmente estará en una ubicación y cuando la seleccionemos y arrastremos necesitaremos un
sitio donde soltarla. Para ello, adelantándome un poco a CSS3 vamos a usar una etiqueta que
se llama <div>. Pensemos de forma resumida, que con la etiqueta <div> voy a crear una capa/
caja contenedora, y ahí es donde voy a soltar mi imagen. Le voy a poner un borde (border) y
un tamaño para que se vea donde se insertaría, pero toda la parte del estilo no sería necesaria.
143
<!DOCTYPE HTML>
<html lang="es">
<head>
<style>
</style>
<script>
function allowDrop(ev)
{
Aula Mentor
ev.preventDefault();
function drag(ev)
ev.dataTransfer.setData("Text",ev.target.id);
function drop(ev)
ev.preventDefault();
var data=ev.dataTransfer.getData("Text");
ev.target.appendChild(document.getElementById(data));
144 </script>
</head>
<body>
<br>
</body>
</html>
Practica intentando imitar el resultado sin usar el código del archivo ejemplo02-drag-and-drop.
html
<!DOCTYPE HTML>
<html lang="es">
<head>
Aquí no hay nada nuevo, declaramos nuestras etiquetas y preparamos el archivo como
hemos realizado en otras ocasiones:
<style>
</style>
Esta parte pertenece a CSS3 ya que se refiere a estilos, la hemos usado para hacer una
caja de 160px de ancho por 100px de alto. Le hemos puesto de nombre al divisor cajarecep-
tora. Le hemos agregado un espaciado de 10px y un border de 1px de tipo solido con el color
#aaaaaa, lo único realmente obligatorio de esta parte sería crearnos el divisor #cajareceptora,
darle un ancho (width) y un alto (height).
Ahora, voy a explicar cómo hemos definido la imagen, así entenderemos mejor cómo
funciona el drag and drop: 145
1) Hemos creado una imagen con identificador (id) = "elementomovil" para poder recuperarla
luego.
2) Seleccionamos la ruta donde va a estar nuestra imagen en nuestro servidor, en nuestro caso
sería: src="images/logo_html5_css3.png".
3) Luego le decimos al navegador que este objeto va a ser de tipo draggable, para que pueda
ser arrastrado, lo hacemos con: draggable="true".
4) Le vamos a decir la función que vamos a usar cuando se esté arrastrando: ondragstart="drag(event)"
y a su vez llamamos a la función drag(event) de nuestro script. Si nos fijamos está declarada en
el head dentro del script:
function drag(ev)
ev.dataTransfer.setData("Text",ev.target.id);
}
Aula Mentor
En este caso, el tipo de datos es "texto" y el valor es el id del elemento arrastrado ("ele-
mentomovil"). Y por último le damos un tamaño, ancho y alto, a la imagen que ha de ser inferior
al que hemos declarado en la caja.
Con esto ya tendríamos definido lo que vamos a mover. Ahora nos tocaría definir donde
lo vamos a insertar o soltar:
Para ello, volvemos a asignarle un identificador a nuestra caja, en este caso "cajareceptora" y le
añadimos los siguientes atributos:
Y cada vez que queramos coger una imagen, la podemos arrastrar en el recuadro que
deseemos.
M1. HTML5
Revísalo e intenta imitar el resultado por ti mismo. Si te ha costado un poco entender esta
parte, conforme vayamos avanzando en el curso irás cogiendo soltura, no te preocupes. Debes
pensar que con pocas líneas puedes hacer un juego para tus usuarios, es decir, puedes coger
varias imágenes que correspondan a un paisaje y divídelas, coger varias cajas contenedoras y un
mensaje que diga: "ordena las fotografías correctamente".
Otra de las funcionalidades más potentes de HTML5 es la integración del diseño 2D,
como si se tratara de un lienzo en un espacio web podremos crear diseños sobre él. Para ello
se usa la etiqueta <canvas> que está asociada a la API Canvas. Se podrían visualizar gráficos de
estadística directamente, crear formas geométricas, líneas, textos y dibujos propios. El diseño 2D
en HTML5 es el comienzo y se está trabajando para realizar 3D, lo que daría al programador de
webs total libertad para hacer lo que desee sin tener que usar ningún software externo.
Para empezar a usar el diseño en 2D lo primero que tenemos que hacer es delimitar el
espacio de trabajo, es decir, asignar un ancho y alto dentro de nuestra web, por ejemplo si qui-
siéramos un lienzo de 350 x 350, deberíamos poner:
En caso de no indicar ningún tamaño nos crearía uno por defecto de 350px de ancho
por 150px, aunque la mayoría de las veces ese tamaño no será suficiente, todo dependerá del
proyecto que vayamos a abordar. 147
Al igual que en el apartado anterior vamos agregarle un borde a nuestro canvas, ya que
sino no podremos apreciarlo. Por ejemplo, un borde de un 1px y de color azul:
Eso nos crearía un recuadro en nuestra web, y en él podremos empezar a crear nuestros
diseños:
dentro de la misma página es bueno asignarle un identificador para poder acceder a él en caso
que sea necesario. Para comprobar si lee la etiqueta debemos escribir texto dentro de la etiqueta
<canvas>texto</canvas> indicando al usuario la información, por ejemplo una forma podría
ser:
Hemos detectado que tu navegador no soporta la etiqueta canvas, le recomendamos que actualice la versión
de su navegador para disfrutar totalmente de esta web….
</canvas>
148 Además se podrían dotar de más configuración de aspecto, pero al disponer de CSS3
siempre es mejor utilizarlo para independizar el código y la semántica del diseño. Una vez de-
clarado nuestro lienzo podemos pasar a escribir el código que generará nuestro gráfico en 2D.
Para ello vamos a usar nuevamente JavaScript, realizando las acciones que deseemos dentro de
las etiquetas <script type="text/javascript"></script>.
Para trazar una línea dentro de nuestro lienzo debemos saber dos puntos, el punto de
inicio y el punto final. Para facilitar esto existe una función llamada lineTo(x, y) que partiría des-
de el último punto e iría hasta las coordenadas indicadas en x e y de la función. Es decir, debe
existir alguna forma de indicar el punto inicial o desplazarnos a unas coordenadas concretas,
para ello disponemos de la función moveTo(x, y). Para trazar una línea horizontal, tendríamos
que hacer lo siguiente:
1) Seleccionar el canvas y su contexto. Imagina en la vida real que cogemos el cuaderno y ele-
gimos en que página o trozo de página vamos a dibujar.
//Nos creamos otra variable var para almacenar el contexto del lienzo
//Iniciamos el lienzo
contexto.beginPath();
2) Situamos el punto de inicio, para ello voy a elegir el punto (0,0) y vamos a elegir las coorde-
nadas x=0 e y=0 para que sepamos desde donde parte nuestro gráfico, aunque podríamos haber
elegido otra cualquiera:
contexto.moveTo(0,0);
3) Ahora vamos a dibujar una línea hasta dentro de nuestro lienzo, como es de 350px de ancho
y 350px de alto, el centro estará en x=175, y=175.
contexto.lineTo(175,175);
4) Pintamos o realizamos la traza que hemos preparado. Para ello debemos acabar el comando
stroke(). 149
contexto.stroke();
Hemos detectado que tu navegador no soporta la etiqueta canvas, le recomendamos que actualice la versión
de su navegador para disfrutar totalmente de esta web….
</canvas>
<script type="text/javascript">
contexto.beginPath();
Aula Mentor
contexto.moveTo(0,0);
contexto.lineTo(175,175);
contexto.stroke();
</script>
Y el resultado sería:
150
Bueno, a lo mejor te esperabas un resultado parecido a este:
contexto.moveTo(0,350);
contexto.lineTo(150,150);
Por lo que se puede deducir que el lienzo tiene el punto con x=0 e y=0 (0,0) en la parte
superior izquierda, y el punto con x=350 e y=350 será la parte inferior derecha, para aclarar este
concepto añadamos una línea más con el fin de que vaya al punto x=350 e y=350:
M1. HTML5
contexto.moveTo(0,350);
contexto.lineTo(150,150);
contexto.lineTo(350,350);
contexto.stroke();
Y el resultado sería:
151
En verdad los valores x e y los tenemos que tomar como la separación desde la parte
superior respecto del eje de ordenadas y de abscisas. Supongamos un lienzo de 10px por 10 px,
y queremos dibujar una línea desde el (3,8) al (8,2). En la imagen siguiente se puede apreciar
cómo es realmente:
Hemos detectado que tu navegador no soporta la etiqueta canvas, le recomendamos que actualice la versión
de su navegador para disfrutar totalmente de esta web….
</canvas>
<script type="text/javascript">
contexto.beginPath();
contexto.moveTo(3,8);
contexto.lineTo(8,2);
152
//Agregamos la "tinta a nuestro dibujo
contexto.stroke();
</script>
Si pruebas este código veras que dibujas una línea exactamente tal y como hemos defini-
do, eso sí, demasiado pequeña porque 10px es muy poco en una pantalla, si multiplicamos los
valores por 10 o 20 o 30, etc. (x e y) tanto del lienzo como de los elementos se apreciará que
efectivamente la forma de trabajar y nombrar las coordenadas del canvas es de la forma antes
descrita.
Supongo que te estarás preguntando si podemos agregarle color a las trazas, por ejemplo
usar un color fijo o un color definido con RGB. Si queremos cambiar el color de la traza pode-
mos usar la siguiente función.
contexto.strokeStyle = "red";
contexto.strokeStyle = "rgba(255,0,0,1)";
// Color indicando además la transparencia, el cuarto valor es un número entre 0 y 1. Por ejemplo 0
sería totalmente transparente, 1 sería totalmente opaco y 0.5 sería una transparencia al 50%, es decir,
mitad opaco mitad transparente.
Para el ancho de la línea también disponemos de otra función, en este caso deberíamos
usar lineWidth y el valor en píxeles del ancho de la línea, por ejemplo para una línea de 3
píxeles, deberíamos usar:
contexto.lineWidth = "3";
Además podemos modificar la terminación de la línea, para ello usamos en este caso la
función lineCap, que puede tomar los siguientes valores:
- Butt. Valor por defecto. La línea acaba donde indica el valor de la línea.
- Round. Agrega medio círculo en el extremo de la línea, por lo que sobresaldría del valor de-
finido como terminación. El radio de este valor será la mitad del grosor de la línea.
- Square. Añade un borde cuadrado del mismo ancho que la línea y de alto como la mitad del
grosor de la línea.
153
¡Ojo! Para que se agregue el valor debemos forzar el pintado, e iniciar el trazo con con-
texto.beginPath() y finalizar con contexto.stroke(). Si no se aplicaría el último valor definido
en el lineCap a todos los trazos. El código correspondiente a este gráfico se puede ver a conti-
nuación:
contexto.beginPath();
contexto.moveTo(100,100);
contexto.strokeStyle = "blue";
contexto.lineWidth= 30;
contexto.lineCap= "butt";
contexto.lineTo(300,100);
Aula Mentor
contexto.stroke();
contexto.beginPath();
contexto.moveTo(100,200);
contexto.strokeStyle = "blue";
contexto.lineWidth= 30;
contexto.lineCap= "round";
contexto.lineTo(300,200);
contexto.stroke();
contexto.beginPath();
contexto.moveTo(100,300);
contexto.lineWidth= 30;
contexto.lineCap= "square";
contexto.lineTo(300,300);
contexto.stroke();
También podemos definir cómo se unen las líneas entre sí, para ello tenemos la propie-
dad lineJoin y puede tomar tres valores también:
- Miter. Valor por defecto. Prolonga las líneas para que converjan en un único punto.
- Round. Redondea las esquinas de la forma. El grosor de la parte redondeada sería en este caso
igual al grosor de la línea.
miter
round
bevel
Si nos fijamos, la última línea está en el fin del marco del lienzo, pero debemos sacar
dos conclusiones, siendo el canvas de 400px de ancho por 400px de alto: la primera sería que
las líneas de un ancho de 30px, en este caso, estando ajustadas al final (400px) nos llevaría al
centro exacto de la línea (15px), el resto sería grosor, es decir, crece desde el centro hacia fuera
½ del tamaño de la línea. Y otro detalle que era de esperar es que aunque pintemos fuera del
canvas, no se mostrará, por lo que uno de los fallos típicos es escribir en coordenadas que no
corresponden a la "ventana" o al lienzo de existente.
Practica intentando imitar el resultado sin usar el código del archivo ejemplo08-canvas-linea4.
html.
Para trazar un rectángulo, con los conocimientos que ya tenemos podemos hacerlo rea- 155
lizando cuatro líneas:
contexto.moveTo(100,100);
contexto.lineTo(300,100);
contexto.lineTo(300,300);
contexto.lineTo(100,300);
contexto.lineTo(100,100);
Aula Mentor
Así podríamos crear las figuras geométricas que quisiéramos, cuadrados, triángulos, etc.
También existe otra forma de realizar ésto con una sola función, aunque muchas veces es nece-
saria la combinación de estas técnicas para realizar nuestro diseño. La función es strokeRect(x,
y, width, height).
contexto.fillRect(100,50,200,120);
Como hemos visto con una sola función, hemos realizado un rectángulo del tamaño pre-
visto y relleno, ahora si quisiéramos quitar relleno y por ejemplo dejarlo con un borde de 5px,
tendríamos que usar la función clearRect(x, y, width, height) y hacer lo siguiente:
Debemos pensar que tenemos que dibujar otro rectángulo dentro del mismo, pero real- 157
mente lo que estamos haciendo es hacer trasparente esa parte del dibujo:
Para usar otro color al definido por defecto (negro) podemos usar la función
fillStyle="color" al igual que lo usábamos con las trazas. Por ejemplo si queremos añadir color
a este rectángulo debemos usar:
Aula Mentor
contexto.fillStyle = "red";
Podemos usar también la notación usando transparencia al igual que con la función
fillStroke, siendo el valor comprendido entre 0 y 1.
Con todo lo que hemos visto hasta ahora estamos preparados para dibujar el siguiente
gráfico. Aunque tienes el código resuelto en los ejemplos del curso, intenta por ti mismo reali-
zarlo para ir cogiéndole soltura al diseño con canvas 2D.
158
radio: Radio del círculo o arco en radianes (no en grados). Recordemos que:
159
sentidoInverso: Valor booleano que indica el sentido del arco. Con valor = false el
sentido de las agujas del reloj, con valor = true en orden inverso.
Veamos un ejemplo: para trazar en un canvas de 400 x 400 un círculo de radio 150, de-
beremos fijar primero el centro a un valor: (200,200), el radio: (150) y si es un círculo completo,
debemos añadir de ángulo inicial cualquiera: (0) y de final: (360), lo que es 2*Math.PI, y el sen-
tido daría igual en este caso, por lo que lo pondríamos a true.
Aula Mentor
contexto.lineWidth = 2;
contexto.beginPath();
160
//Definimos nuestro círculo
contexto.arc(200,200,150,0,2*Math.PI, true);
contexto.stroke();
Ahora nos plantemos una pregunta, ¿y si quisiéramos rellenar el círculo y utilizar un co-
lor concreto para el exterior? Podemos realizarlo sin ningún problema, si quisiéramos llenar el
interior del color #aabbcc podemos usar la función fill() y para el trazo de color rojo, tendremos
que añadirle las propiedades de antes de realizarlo:
contexto.lineWidth = 2;
contexto.strokeStyle = "red";
contexto.fillStyle = "#aabbcc"
contexto.beginPath();
contexto.arc(200,200,150,0,2*Math.PI, true);
contexto.fill();
contexto.stroke();
161
Si por ejemplo quisiéramos hacer solo la parte superior o la inferior del círculo, es decir
desde los grados "0", hasta "270" en el sentido inverso de las agujas del reloj, simulando la puesta
de sol tendríamos:
sentidoInverso=true sentidoInverso=false
Debemos comprender que podemos hacer todas las configuraciones que queramos para
obtener aquel resultado que tenemos pensado. Siempre debemos tener claro los parámetros que
nos da la función arc y usarla correctamente.
Aula Mentor
Existe la posibilidad de realizar formas más complejas como son las curvas de Bézier,
quadraticCurveTo y bezierCurveTo. Para poder usarlas debemos tener conocimientos avan-
zados sobre matemáticas y las curvas de Bézier, en los recursos se pueden ver dos ejemplos y a
continuación se muestran los resultados, dejamos de tu parte profundizar en este tema ya que
es una parte muy potente, amplia y a la vez bonita, aunque se aleja de los objetivos del curso:
http://www.geogebratube.org/student/m39087
o en:
http://resources.arcgis.com/es/help/main/10.1/index.html#//01m80000000w000000
Estas funciones soportan tres parámetros para poder adaptarse a nuestras necesidades:
M1. HTML5
Propiedad Descripción
font Tipo de letra que vamos a usar, asignando un
tamaño y un tipo de letra en concreto, por
defecto el tipo de letra es sans-serif.
textAlign Nos indica la alineación del texto que puede
tener varios parámetros:
163
Por ejemplo, para agregar texto a nuestro canvas lo podemos hacer de la siguiente ma-
nera:
contexto.texBaseline = "alphabetic";
contexto.textAlign = "left";
contexto.strokeText("Aprendiendo HTML5",20,200);
Y el resultado sería el siguiente, nótese que hemos usado la misma fuente pero una fun-
164 ción diferente en cada caso:
Una función muy utilizada últimamente en las web, es usar sombreados de textos y lí-
neas. En HTML5 podemos añadir tanto sombreados a nuestros gráficos, como a nuestros textos.
Para ello disponemos de cuatro propiedades que vamos a ver a continuación:
M1. HTML5
Propiedad Descripción
shadowOffsetX Indica el margen de sombra respecto del eje
X. El valor puede ser positivo o negativo, des-
plazándose por el eje hacia la izquierda o de-
recha.
shadowOffsetY Indica el margen de sombra respecto del eje Y.
El valor puede ser positivo o negativo, despla-
zándose por el eje hacia arriba o hacia abajo.
shadowBlur Indica el efecto de dispersión de la sombra, el
valor por defecto es 0.
shadowColor Indica el color del efecto sombreado, por de-
fecto es negro y la notación es similar al estilo
CSS3 que veremos en el siguiente módulo.
165
contexto.texBaseline = "alphabetic";
contexto.textAlign = "left";
contexto.shadowOffsetX = 5;
contexto.shadowOffsetY = 5;
Aula Mentor
contexto.shadowBlur = 5;
contexto.shadowColor = "red";
contexto.moveTo (20,102);
contexto.lineTo (380,102);
contexto.stroke ();
contexto.moveTo (20,202);
contexto.lineTo (380,202);
contexto.stroke ();
contexto.lineWidth = 2;
contexto.fillStyle = "#aabbcc"
contexto.beginPath();
contexto.arc(200,300,70,0,2*Math.PI, true);
contexto.stroke();
Como era de esperar, además de figuras dibujadas por nosotros mismos, podemos agre-
gar imágenes a nuestro canvas, con esta funcionalidad podemos hacer unos gráficos muy poten-
tes, ya que por ejemplo podemos agregar una fotografía y agregarle marcos distintos (dibujando
rectángulo del tamaño de la imagen), agregarle encima de la fotografía cualquier figura que
hemos visto anteriormente.
• Al no poder agregar la imagen como tal directamente en el canvas <img src=…, a lo mejor
en versiones futuras de HTML5, debemos pasar la imagen a un objeto JavaScript. Para ello
primero debemos agregar la imagen a nuestro archivo html con <img src…, ocultarla para
que no se vea inicialmente y cargarla como objeto JavaScript, para ello debemos usar las
siguientes funciones:
//1º debemos agregar dentro del body el <canvas …> y la imagen oculta <img.. 167
//una función que será la que cargue la imagen a nuestro canvas mediante JavaScript
//Nos declaramos una variable que contendrá la imagen para poder procesarla
Img.src = 'ruta_imagen.extension_imagen.png'
Veamos un ejemplo, teniendo un canvas (área de dibujo) de 400 x 400 px y una imagen
de 67 x 85 px, queremos insertarla a 50px de la parte superior y otros 50px de la parte izquierda,
debemos escribir el siguiente código:
Aula Mentor
<!DOCTYPE HTML>
<html lang="es">
<head>
<title>Canvas en HTML5</title>
<script type="text/javascript">
function midiseño(){
//Nos declaramos una variable que contendrá la imagen para poder procesarla
img.src = 'images/logo_html5.png'
contexto.drawImage(img,50,50);
</script>
M1. HTML5
</head>
<body onload="midiseño()">
Hemos detectado que tu navegador no soporta la etiqueta canvas, le recomendamos que actualice la versión
de su navegador para disfrutar totalmente de esta web….
</canvas>
</body>
</html>
Y el resultado sería:
169
Cuando veamos jQuery estaremos más acostumbrado a las funciones JavaScript y a cómo
se desenvuelve sobre los elementos de la página o DOM. De todas formas, llegado a este punto
creo que es importante usar una herramienta que disponemos en Google Chrome para detectar
errores en nuestro código, por ejemplo modifica la línea correspondiente a la ruta de la imagen
por esta:
img.src = 'RUTAERRONEA/logo_html5.png'
Si vuelves a ejecutar el archivo (guardar el archivo en Sublime Text 2 y pulsas F5: actua-
lizar) verás que no te sale ninguna imagen, pero no sabes qué ha pasado, dónde está el error o
si es problema del navegador o de tu código. Para ello, podemos depurar el programa usando la
consola de depuración de Google Chrome, concretamente pulsando la tecla F12. Nos aparecerá
una ventana en la parte inferior con varias opciones, realmente nos está mostrando el navegador
cómo está entendiendo el código, lo que nos da mucha información. Por ahora, nos vamos a la
opción Console y veremos que sale algo parecido a ésto:
Aula Mentor
Si nos fijamos, nos está dando información muy concreta, Fail to load resource (fallo
cargando el recurso) y donde ha fallado concretamente a la derecha nos aparece la ruta:
http://localhost/MOD1.HTML5/U3/RUTAERRONEA/logo_html5.png
170
Que nos vuelve a decir lo mismo, pero al ser una etiqueta propia del código HTML5,
nos dice incluso la línea, la 37 (en mi caso): Ejemplo20-canvas-imagen.html:37 y nos dice que
ha sido un error usando el GET del recurso, ya que la información normalmente se usa GET o
POST, y nos comenta la ruta también que ha fallado. Pero nos da aún más datos, si pulsamos en
la pestaña Network nos da una información muy completa de los recursos:
Lo primero donde debemos fijarnos es en la zona que está en rojo, vemos que nos vuel-
ve a dar la información que antes sabíamos, pero además nos dice que por ejemplo el recurso
logo_html5.png sí está correctamente en el script, pero en la línea 37, 404 not found, que es
un mensaje típico de internet para indicar el servidor que no ha encontrado el recurso. Además,
nos da información del tiempo que ha tardado, el estado, etc. Por ahora debemos usarlo para
detectar errores cuando nuestro código nos dé problemas, la mayoría de las veces suelen ser
errores sintácticos. Hay que decir de paso, que este método no es infalible, pero nos va a servir
de gran ayuda cuando estemos desarrollando nuestras web.
Ahora vamos a agregar a modo de prueba una imagen y posteriormente unas líneas en-
cima de él, por ejemplo usemos una imagen de René Magritte, en su obra el hijo del hombre,
donde se ve un hombre con una manzana en la cara. Vamos a agregarle, con el respeto al autor
y para afianzar el conocimiento de la materia de esta unidad, dos ojos, nariz y una sonrisa a la
M1. HTML5
manzana:
……..
<script type="text/javascript">
function midiseño(){
//Nos declaramos una variable que contendrá la imagen para poder procesarla
img.src = 'images/TheSonOfMan.jpg';
//Centramos la imagen
contexto.drawImage(img,centroX,centroY);
contexto.strokeStyle = "white";
contexto.fillStyle = "white"
contexto.beginPath();
contexto.arc(198,155,5,0,2*Math.PI, true);
contexto.arc(217,155,5,0,2*Math.PI, true);
contexto.fill();
contexto.beginPath();
contexto.strokeStyle = "white";
contexto.lineWidth= 5;
contexto.moveTo(207,160);
contexto.lineTo(207,168);
contexto.stroke();
//dibujamos la sonrisa
contexto.beginPath();
M1. HTML5
contexto.fillStyle = "white"
contexto.arc(207,170,12,0,Math.PI, false);
contexto.fill();
} //fin de la función
</script>
</head>
<body onload="midiseño()">
Hemos detectado que tu navegador no soporta la etiqueta canvas, le recomendamos que actualice la versión 173
de su navegador para disfrutar totalmente de esta web….
</canvas>
……….
Si nos fijamos en el código hay una parte que usamos para centrar la imagen, esto nos es
muy útil porque así podemos centrar nuestras imágenes en el lienzo, justo en el centro, indepen-
dientemente del tamaño del lienzo y de la imagen, para ello, usamos las propiedades .width y
.height obteniendo los valores dados de los elementos y ya calculando lo que nosotros desee-
mos, en este caso, el centro:
//Centramos la imagen
1.3.7. Transformaciones.
Hasta ahora cuando hemos hablado de canvas, estamos pensando en un zona estática,
donde podemos agregar elementos (líneas, rectángulos, imágenes, etc) pero además, nos ofre-
cen funciones de gran potencia para trabajar sobre los propios elementos, haciendo dinámico
Aula Mentor
nuestro canvas, pudiendo aplicar transformaciones, creando zonas animadas y creando efectos
impactantes con poco código.
Las transformaciones que nos permite aplicar sobre los elementos son:
Translación: Desplazar elementos dentro del área de dibujo, desde el origen hasta un nuevo
punto indicado en coordenadas x e y. Para ello usamos la función:
translate(x, y)
Rotación: Pudiendo hacer giros sobre un elemento sobre su origen, expresando en radianes el
ángulo que va a girar y siempre en el sentido de las agujas del reloj:
rotate(ángulo)
Escala: Podemos aumentar o disminuir el tamaño de los elementos del área de dibujo. Para ello
debemos pasar dos parámetros: "x", que sería el factor de escala en la dirección horizontal, e "y"
el de la dirección vertical. Estos valores siempre han de ser positivos. Los valores posibles son:
scale(x, y)
Veamos todos estos ejemplos aplicados a una imagen dada. Para translaciones:
Translate
contexto.translate(150,150);
M1. HTML5
Para rotaciones:
Rotate
contexto.drawImage(img,centroX,centroY);
contexto.rotate(15*Math.PI/180);
contexto.drawImage(img,centroX,centroY);
Como podemos apreciar, lo que ha pasado es que ha girado todo el canvas 15º. No solo
ha girado la imagen, sino también otro punto que hemos puesto de testigo, realmente es como
si giráramos el papel sobre el que hemos dibujado. Para poder corregir ésto, es necesario hacer
modificaciones con translaciones para compensar el giro. Pero cuando hemos realizado varias
transformaciones sobre el mismo lienzo y queremos que no intercedan uno y el otro, que sean
independientes, debemos usar las funciones: 175
.save() y .restore().
Recuerda que se podrían compensar con translaciones cada rotación, compensando así
el giro de cada imagen.
Aula Mentor
Recuerda que para pasar de grados a radianes debes usar la siguiente fórmula:
Radianes 0 π6 π4 π3 π2 π 3π2 2π
Para escalados:
TRANSLATE
SCALE
176
Como hemos visto anteriormente cuando se realiza escalados también es necesario com-
pensar con translaciones, ya que realmente lo que hace es expandir el área de dibujo desde la
parte superior izquierda, hacia la parte inferior derecha. Por eso hemos tenido que compensar
con una translación del área de dibujo hacia la parte superior izquierda.
1.4. Geo-localización.
1.4.1. Introducción.
Además de la creación de una web para mostrar productos de una empresa o cualquier
otro uso, debemos ver la web como un gran potencial estadístico y promocional, con la geo-
localización podemos por ejemplo:
- Sacar estadísticas de ver qué usuarios o zonas suelen visitar más en nuestra web, para ver
el impacto que la imagen de la empresa tiene en la vida real. Si por ejemplo sacamos una
promoción sobre una temática concreta, podemos ver qué zonas son las que más impacto ha
tenido, para hacer más hincapié o reforzar aquellas que no han tenido una buena acogida.
M1. HTML5
- Promocionar las tiendas o comercios, más próximos a mi ubicación, por ejemplo si mi web
se refiere al control de gasolineras y el usuario me está pidiendo una gasolinera, automáti-
camente le mostraré aquella que esté más cerca al usuario.
- Las redes sociales también buscan y usan la ubicación para buscar personas o perfiles afines
cercanos, para esto también necesitamos saber la ubicación actual.
Para conocer la ubicación del usuario necesitamos tener un indicador que nos muestre a
través de su conexión el navegador web, ya que está con nuestra página web abierta, para coger
los datos. Esta información viene dada de la siguiente forma:
Smartphone
Los Smartphone y algunas Tablet tienen conexión de datos de una o varias compañías
para poder usar voz y datos. Estos dispositivos se conectan a través de las antenas de la com-
pañía (torres, centrales o edificios) y están constantemente recibiendo datos de las antenas, para
saber cuál está más cerca, cuál tiene más potencia, y si estoy en movimiento, a qué antena me
debo conectar en el siguiente paso, etc. Esta acción se llama hand-over y es el paso que hace
una antena de comunicaciones a otra, y cuando nos quedamos sin cobertura es porque o no
hay antena para dar el salto siguiente, o está mal calculado y tienen una avería la compañía en
ese momento. 177
Con todos estos datos y al ser la posición de las torres de telefonía estática, se puede
triangular la posición aproximada de la ubicación del dispositivo. Han existido muchos casos de
pérdida de personas o vehículos y gracias a esta información han podido acercarse a la última
ubicación leída por el teléfono.
Aula Mentor
Ordenadores personales
Al igual que los equipos móviles, podemos obtener la información de la ubicación del
usuario a través de la IP del ordenador, ya que como vimos en las primeras unidades es el
"DNI" de nuestra conexión, y éste nos la da nuestro ISP (Proveedor de Servicios de Internet) más
cercano. Eso sí, no es tan fiable como las de los Smartphone ya que cada ISP tiene su propia
red y estructura interna, y puede darnos un valor muy erróneo y muy lejos de la realidad. Pero
la mayoría de las veces nos puede ser útil para utilizar al menos el idioma o hacernos una idea
aproximada de la ubicación del usuario.
También se puede sacar a través de la Wi-fi del usuario (dirección MAC), existen base
de datos que dan información de las redes Wi-fi y su localización; Google Street View aprove-
chó y fue cogiendo las MAC de las Wi-fi y las fue ubicando. Así, si te vas a una plaza, parque
con Wi-fi, o a una red Wi-fi de una universidad, ayuntamiento o la del vecino si coincide, y
Google añade esa MAC a su base de datos, te puede dar un posicionamiento muy cercano de la
ubicación de tu ubicación, pudiendo a partir de ahí usar esa información de tantas formas
como hemos comentado anteriormente.
http://www.w3.org/TR/2010/CR-geolocation-API-20100907/
La información que se trasmite siempre es cifrada para intentar evitar que terceros re-
ciban esa información. De todas formas, siempre nos debe preguntar el navegador si damos el
consentimiento para compartir nuestra localización:
Y google también nos da soporte de cómo activar/desactivar esta función en los diferen-
tes navegadores:
https://support.google.com/plus/answer/2998354?hl=es
M1. HTML5
1.4.3. Coordenadas.
179
En nuestras aplicaciones tenemos una función que nos da la información del dispositivo:
Función en caso de éxito: será aquella que llamemos cuando va todo bien. Esta fun-
ción la podemos crear fuera como una función más o agregarla directamente en el propio códi-
go, ya que en JavaScript se pueden crear funciones en línea.
Función en caso fallido (opcional): función que se usará en caso que el método
haya encontrado algún error y no se haya podido ejecutar.
Y debemos crearnos nuestras funciones aparte, una para verDatos, otra para errorDa-
tos, y pasarle un array con los parámetros opciones que le vayamos a pasar. Un ejemplo igual-
mente válido sería el siguiente:
navigator.geolocation.getCurrentPosition(
function(position) {console.log(position.coords);},
);
Si nunca has visto JavaScript, verás que a la función .getCurrentPosition le hemos pa-
sado como parámetro otra función. Esto es porque se le pueden pasar directamente; podríamos
tener function suma(a=4 , b=7) que nos sumaría a y b; pero también función suma(function
dameA(){ return 4;}, function dameB(){ return 7;}), etc. poco a poco nos iremos introduciendo
en este tipo de programación. Veamos un ejemplo concreto en el cual al pulsar sobre un botón,
nos da las coordenadas actuales:
180
navigator.geolocation
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(verCoordenadas, mostrarError);
M1. HTML5
} else {
Hemos usado para mostrar los mensajes el método innerHTML, más adelante lo ve-
remos más detenidamente, pero a modo de introducción, podemos añadir texto HTML direc-
tamente desde el código JavaScript. Para este caso también se podía haber usado una etiqueta
<p> asociarla con un id, buscar el elemento por id y añadir el texto que necesitemos en cada
momento.
Para mostrar los datos, nos hemos creado una función donde nos cargarán los datos de
las coordenadas, pero ¿cómo se rescatan y qué opciones hay? Para rescatar los parámetros nos
crea un objeto position donde almacena las coordenadas coords. Estos parámetros son de sólo
lectura, por lo que sólo podremos leer los datos, pero no modificarlos.
Parámetro Descripción
position.coords.longitude Valor devuelto del valor de la longitud leída.
position.coords.latitude Valor devuelto del valor de la latitud leída.
position.coords.altitude Valor devuelto del valor de la altitud leída.
position.coords.accuracy Indica la precisión de las coordenadas. 181
position.coords.altitudeAccuracy Indica la precisión de la altitud.
position.coords.heading Indica la posición en grados respecto del nor-
te.
position.coords.speed La velocidad del usuario tomando como valor
la última posición tomada.
No todos los navegadores dan la información de todos los parámetros, pero la tendencia
es ir dotando cada vez más al navegador la interacción con el posicionamiento del usuario. Un
ejemplo completo podría ser el siguiente (dentro del body):
<script>
var x = document.getElementById("getLocation");
function getLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(verCoordenadas, datosErroneos);
Aula Mentor
} else {
function verCoordenadas(position) {
</script>
Si nos fijamos, no nos ha dado todos los datos, pero dependiendo del navegador, el dis-
positivo y la ubicación, los valores que nos devuelva serán otros. Otro detalle a tener en cuenta
sería controlar los valores devueltos de la función positionError, cuando da error la función. En
este caso tendríamos otros parámetros:
M1. HTML5
Parámetro Descripción
PERMISSION_DENIED Nos indica que nuestro documento no ha te-
nido acceso a la API de geo localización. Nor-
malmente es por permisos, cuando nos pre-
gunta el navegador y el usuario ha contestado
que no da permiso a nuestra aplicación. Valor
devuelto = 1.
POSITION_UNAVAILABLE Valor devuelto cuando no ha sido posible ob-
tener ningún valor, por ejemplo si no tiene
GPS o acceso a las redes en ese momento.
Valor devuelto = 2.
TIMEOUT Valor devuelto cuando se ha excedido el tiem-
po de ejecución de adquisición de datos. Valor
devuelto = 3.
var mapurl='http://maps.google.com/maps/api/staticmap?center='+posicion.coords.latitude+','+
posicion.coords.longitude+'&zoom=16&size=400x400&sensor=false&markers='+posicion.coords.latitude+
','+posicion.coords.longitude;
Parámetros de ubicación
center (obligatorio si no hay marcadores presentes): define el centro del mapa, equidis-
tante de todos los bordes de éste. Este parámetro toma una ubicación como un par separado por
comas {latitud, longitud}, por ejemplo "40.714728, -73.998672", o como una dirección de cadena,
por ejemplo "ayuntamiento, nueva york, ny", identificando una ubicación única en la superficie
de la Tierra.
zoom (obligatorio si no hay marcadores presentes): define el nivel de zoom del mapa,
que determina su nivel de ampliación. Este parámetro toma un valor numérico correspondiente
al nivel de zoom de la región deseada. Para obtener más información, consulta la sección sobre
niveles de zoom más adelante.
Aula Mentor
Parámetros de mapa
size (obligatorio): define las dimensiones rectangulares de la imagen del mapa. Este pa-
rámetro adopta la forma de una cadena {horizontal_value}x{vertical_value}. Por ejemplo, 500x400
define un mapa de 500 píxeles de ancho por 400 de alto. En los mapas cuyo ancho sea inferior
a 180 píxeles se mostrará un logotipo reducido de Google. Este parámetro se ve afectado por el
parámetro scale, que se describe a continuación. El tamaño final de salida será el producto de
los valores de escala y tamaño.
scale (opcional): afecta al número de píxeles que se muestran. scale=2: muestra el doble
de píxeles que scale=1, pero mantiene la misma área de cobertura y el mismo grado de detalle,
es decir, el contenido del mapa no cambia. Es de utilidad al desarrollar un mapa que se vaya a
ver con una alta resolución o al crear mapas que se vayan a imprimir. El valor predeterminado es
1. Los valores aceptados son 2 y 4 (4 solo está disponible para clientes del API de Google Maps
for Business). Para obtener más información, consulta los valores de escala.
maptype (opcional): define el tipo de mapa que se va a generar. Hay varios valores de
tipo de mapa posibles, incluidos roadmap, satellite, hybrid y terrain. Para obtener más informa-
184 ción, consulta la sección sobre tipos de mapas del API de Google Static Maps que aparece más
adelante.
language (opcional): define el idioma que se debe utilizar para mostrar las etiquetas de
los mosaicos de mapas. Ten en cuenta que este parámetro sólo es compatible con algunos mo-
saicos de países, por lo que si el idioma específico solicitado no es compatible con el conjunto
de mosaicos, se utilizará el idioma predeterminado de ese conjunto.
region (opcional): define los límites apropiados que se deben mostrar en función de
determinados factores geográficos y políticos. Acepta un código de región especificado como un
valor ccTLD de dos caracteres ("dominio de nivel superior").
Parámetros de recurso
path (opcional): define una única ruta de dos o más puntos conectados para superpo-
nerla en la imagen en ubicaciones especificadas. Este parámetro toma una cadena de defini-
ciones de puntos separadas por plecas ( | ). Puedes proporcionar rutas adicionales si añades
parámetros path complementarios. Ten en cuenta que si suministras una ruta para un mapa, no
M1. HTML5
tendrás que especificar los parámetros center ni zoom, que normalmente son necesarios. Para
obtener más información, consulta la sección sobre rutas de mapas estáticos que aparece más
adelante.
visible (opcional): especifica una o varias ubicaciones que deben estar visibles en el
mapa, aunque no se muestre ningún marcador o ningún indicador. Utiliza este parámetro para
asegurarte de que se muestren determinados recursos o ubicaciones de mapas en el mapa está-
tico.
Parámetros de notificación
Comentar que Google ha limitado el uso de esta herramienta a 25.000 solicitudes gratui-
tas diarias de mapas estáticos por aplicación. Cuando se llegue a ese valor, nuestra aplicación
fallaría y tendríamos que pasar a la opción de pago. 185
Puedes ver el código resuelto en los recursos del curso, y el resultado debe ser algo si-
milar a éste, claro está, mostrando tu ubicación:
Otra forma es usar el servicio web de Google, para ello podríamos tener el siguiente
ejemplo completo, los puntos importantes son casi idénticos sólo varía la forma de llamar al
mapa:
Aula Mentor
<Html>
<Head>
<meta charset="utf-8">
<style>
height: 100%;
margin: 0px;
padding: 0px
186 </style>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script>
<script>
var map;
function initialize() {
var mapOptions = {
zoom: 16
};
mapOptions);
M1. HTML5
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
position.coords.longitude);
map: map,
position: pos,
});
map.setCenter(pos);
}, function() { 187
handleNoGeolocation(true);
});
} else {
handleNoGeolocation(false);
function handleNoGeolocation(errorFlag) {
if (errorFlag) {
Aula Mentor
} else {
var options = {
map: map,
content: content
};
188 map.setCenter(options.position);
</script>
</head>
<body>
<div id="map-canvas"></div>
</body>
</html>
El resultado sería que nos abre directamente en nuestra página web el Google Map con
la ubicación que ha calculado, y además nos proporciona la opción de usar Street View. Al igual
que en el otro método podemos agregarle varios parámetros.
Existen varias formas de integrar mapas en nuestra web, y google nos proporciona mu-
chas formas y métodos. Dependiendo de la forma que uses tendrás que generar una KEY en
M1. HTML5
google y darte de alta en el servicio. Si estás interesado en aprender más, te aconsejo que leas
los siguientes artículos que nos proporciona google:
Manual:
https://developers.google.com/maps/documentation/javascript/tutorial
https://developers.google.com/maps/documentation/javascript
Más Ejemplos:
https://developers.google.com/maps/documentation/javascript/examples/
Limitaciones y licencias:
https://developers.google.com/maps/licensing
189
Para ello se utiliza la función watchPosition, que devuelve el valor del usuario en inter-
valos regulares, ésta al ejecutarse en segundo plano en el dispositivo para eliminarla necesitare-
mos usar la función clearWatch. La función nos devuelve un whatch ID con los intervalos mar-
cados, y éste será el valor que tenemos que usar para eliminar mediante la función clearWatch.
Ponemos la variable enableHighAccuracy para obtener una mayor precisión.
Aula Mentor
function startWatch(){
if (navigator.geolocation) {
var optn = {
enableHighAccuracy : true,
timeout : Infinity,
maximumAge : 0
};
} else {
190 }
function stopWatch() {
if (watchId) {
navigator.geolocation.clearWatch(watchId);
watchId = null;
Esta forma nueva de actuar nos abre una nueva forma de trabajar para datos no superio-
res a 5MB, que en formato texto se considera una gran cantidad de información, no se descarta
que conforme se vaya necesitando más capacidad ésta se vaya ampliando, ya que el tamaño del
almacén depende del propio navegador pues hay algunos que soportan 10MB y lo normal es
M1. HTML5
Uno de los puntos más importantes de poder almacenar los datos offline en el navega-
dor, es para los dispositivos móviles, los cuales almacenarán también los datos dentro del nave-
gador, y bajarán considerablemente la tasa de transmisión de datos, punto a controlar cuando
desarrollamos aplicaciones web para móviles.
Los datos se van a guardar en parejas Clave - Valor Clave, por ejemplo podríamos crear
los siguientes valores de prueba:
Como vimos en la parte de los formularios, podemos crearnos un formulario que se lla-
mara a sí mismo, e ir introduciendo los datos que quisiéramos:
Aula Mentor
<!DOCTYPE html>
<html lang="es">
<head>
</head>
<body>
<section id="cajaformulario">
<form name="formulario">
</form>
</section>
<section id="datosGuardados">
</section>
</body>
</html>
Ahora nos debemos fijar que en la parte inferior, si seleccionamos la pestaña Resources
nos aparecen mucha información importante, ahora nos vamos a fijar donde nos indica ses-
sionStorage y vamos abrir nuestra hoja, en este caso para localhost.
M1. HTML5
Debemos fijarnos que tenemos una tabla, por ahora vacía, donde las cabeceras son
key y Value, como habíamos comentado anteriormente, y podremos ir insertando ítem según
necesitemos. Ahora nos debemos concentrar en la parte de interactuar con los datos, para ello
tendremos los siguientes métodos:
Método Acción
sessionStorage.setItem(clave,valor) Inserta un ítem del tipo valor - clave en nues-
tro.
sessionStorage.getItem(clave) Recupera el valor de la clave guardada pre-
viamente.
sessionStorage.removeItem(clave) Elimina el ítem que corresponde a la clave
dada.
sessionStorage.clear() Elimina todos los ítems insertados anterior-
mente.
sessionStorage.legth Nos devuelve el número de registros que te-
nemos almacenados. 193
sessionStorage.key(índice) Nos devuelve el orden de inserción que ocupa
en el registro el índice dado. Empieza en 0 el
primer valor hasta n registros por lo que es
sólo numérico.
function nuevoitem(){
var clave=document.getElementById('clave').value;
var valor=document.getElementById('valorClave').value;
sessionStorage.setItem(clave,valor);
}
Aula Mentor
function borraitem(){
var clave=document.getElementById('borraItem').value;
sessionStorage.removeItem(clave);
function borratodo(){
194
var valor=sessionStorage.clear();
}
Podíamos pensar que deberíamos de agregar un método más que fuera MODIFICAR,
pero en principio a efectos prácticos no es necesario porque para modificar un dato, sólo debe-
mos insertarlo de nuevo con la misma clave. Este punto lo tenemos que tener muy en cuenta,
porque si no nos damos cuenta e insertamos en diferentes sitios del código la variable con el
mismo key y un valor distinto, estaríamos modificando este valor y podríamos tener resultados
no esperados.
Tienes el código fuente en los recursos del curso, pruébalo e intenta reproducirlo nue-
vamente por tu cuenta. Existen partes que a lo mejor no comprendes porque son un poco avan-
zadas, te las explico a continuación:
function iniciar(){
var botonInsertar=document.getElementById('insertarDatos');
var botonBorrarItem=document.getElementById('borrarDato');
var botonBorrarTodo=document.getElementById('borrarTodo');
A partir de ahí, en cada función lo que hago es coger el contenido que ha rellenado el
usuario en el campo de entrada; el campo clave y el campo valorClave, obtengo su valor .va-
lue, y voy asignándolo a una variable, para poder trabajar con él, por ejemplo para la function
insertar lo que hago es lo siguiente:
function nuevoitem(){
var clave=document.getElementById('clave').value;
var valor=document.getElementById('valorClave').value;
sessionStorage.setItem(clave,valor);
var informarUsuario=document.getElementById('informarUsuario');
var valor=sessionStorage.getItem(clave);
Lo que hacemos es rescatar los valores que ha introducido el usuario en los campos
antes de llamar a sessionStorage.setItem(clave,valor):
var clave=document.getElementById('clave').value;
var valor=document.getElementById('valorClave').value;
Posteriormente ya solo aplico los métodos de sessionStorage en cada caso, para hacer
una acción u otra (añadir, modificar, borrar o borrar todo). Por ejemplo para insertar el elemento
recordemos que era con:
sessionStorage.setItem(clave,valor);
Es muy importante que te encuentres cómodo en esta forma de programar, por un lado
nuestra estructura (etiquetas HTML), por otro lado nuestras acciones sobre los elementos (ya sea
con JavaScript o jQuery) y por último, la parte del diseño que veremos en el siguiente módulo.
Por lo que te recomiendo que intentes hacerte un esquema con toda la secuencia y no avances
hasta que entiendas muy bien todo este ejercicio.
1.5.2. Persistente.
Para almacenar los datos persistentemente en el navegador del cliente, vamos a usar en
este caso localStorage, que se usa de forma muy parecida al método anterior, es más, si nos
fijamos en la captura de pantalla cuando hemos activado las herramientas de desarrollo o de-
puración, pulsando la tecla F12 podemos ver que en la parte superior nos aparece también la
opción LocalStorage.
Método Acción
localStorage.setItem(clave,valor) Inserta un ítem del tipo valor - clave en nues-
tro.
localStorage.getItem(clave) Recupera el valor de la clave guardada pre-
viamente.
localStorage.removeItem(clave) Elimina el ítem que corresponde a la clave
dada.
localStorage.clear() Elimina todos los ítems insertados anterior-
mente.
localStorage.legth Nos devuelve el número de registros que te-
nemos almacenados.
localStorage.key(índice) Nos devuelve el orden de inserción que ocupa
en el registro el índice dado. Empieza en 0 el
primer valor hasta n registros por lo que es
sólo numérico.
Veamos el mismo ejemplo del apartado anterior, solo cambiando el nombre de session
por local, tendríamos los siguientes datos sin insertar ningún dato, a no ser que el navegador
haya guardado algún dato anteriormente. Vemos que es similar a cuando usábamos SessionSto-
rage, teniendo nuestras parejas de key, value.
198
Si insertamos los mismos datos que en el almacenamiento temporal, usando los métodos
correspondientes, obtendremos el siguiente resultado:
Cada página web tiene sus propias variables, y tenemos que tener cuidado qué vamos a
almacenar, qué valores voy a guardar y tener en cuenta que los datos siempre van a permanecer
aun cuando el cliente apague el ordenador. Debemos evitar guardar datos importantes y estruc-
turales de nuestra web, por ejemplo nunca guardar datos de contraseñas suyas, ni de acceso a
nuestro servidor, base de datos, etc.
Si se pueden guardar otro tipo de datos que nos sea útil para nosotros, en que página
está ahora mismo y los datos que tenía guardados, por ejemplo el carrito de la compra, si tenía
tres elementos agregados y se va la corriente eléctrica, cuando el cliente se identifique, buscar
los datos en su navegador y proponerle a cargar esos datos, por donde iba en el carrito, por el
minuto que estaba escuchando tu vídeo, etc.
//El bloque try es donde voy hacer la acción que vaya a realizar
try{
localStorage.setItem(contador1,contador2);
} catch (e) {
console.error(e.message);
if (e.name == "QuotaExceededError") {
alert('Ha superado el tamaño en su almacén, no se podrá insertar el item o su navegador tiene deshabi-
litado el Almacenamiento: Storage');
Aula Mentor
200
Sería conveniente que siempre que realicemos inserciones usando los mecanismos ses-
sionStorage o localStorage comprobemos si tenemos acceso y si no hemos superado la cuota.
M1. HTML5
2. Resumen.
- Para detectar si el navegador tiene activado JavaScript podemos usar la etiqueta <noscript>.
Lo usaremos siempre que nuestra aplicación dependa de JavaScript o jQuery, ya que éste
último está basado en JavaScript.
- Con HTML5 se pueden arrastrar y soltar (drag and drop) elementos en la pantalla. Para usar-
lo necesitaremos básicamente un elemento el cual arrastraremos y otro elemento que será el
que recogerá el elemento donde lo soltaremos.
- Podemos usar diseño 2D a través de canvas. Éste será el lienzo en el que realizaremos nues-
tros gráficos. Se pueden realizar las siguientes acciones:
• Trazar rectángulos. Se puede hacer dibujando las líneas una por una o usando el método:
• Trazar formas geométricas. Para realizar formas geométricas usamos el siguiente método:
• Sombreados: Para los sombreados tenemos diferentes métodos que debemos usar:
• Imágenes: Podemos agregar imágenes al canvas, para ello nos apoyaremos de JavaScript.
Tenemos que agregar dentro del body el canvas y la imagen oculta, posteriormente en el
head dentro del script nos declaramos una función que será la que cargue la imagen a nues-
tro canvas, nos declaramos una variable que contendrá la imagen para poder procesarla y
enlazamos nuestra variable con la ruta donde está la imagen y por último agregamos en el
inicio del body la función.
Translación: translate(x, y)
Rotación: rotate(ángulo)
Escala: scale(x, y)
• Una de las ventajas de usar HTML5 es el uso del geo posicionamiento, con él podemos
localizar la ubicación del usuario a través de su dispositivo. Para realizar ésta localización
usaremos coordenadas decimales.
• Podemos agregar mapas a nuestras web o con la Static Maps API o con Google Maps API
JavaScript v3. Con estos métodos podremos interactuar con él y trabajar con la posición
leída por el dispositivo.
• Podemos realizar también seguimientos de los desplazamientos con unos intervalos a tra-
vés de la función watchPosition. En el caso que queramos borrar los mismos, usaremos
clearWatch.
• Los datos insertados con sessionStorage se eliminarán cuando el usuario cierre la ventana
del navegador.
• Si queremos ver los datos que estamos usando actualmente en nuestro navegador, ten-
dremos que usar el modo depurador/desarrollador del mismo y buscar las opciones de
sessionStorage o localStorage en cada caso. También podremos a través de él agregar/modi-
ficar/eliminar datos.