Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Desarrollo de Aplicaciones Web Multiplat
Desarrollo de Aplicaciones Web Multiplat
de Educación, Cultura
y Deporte
Aplicaciones Web
Multiplataforma
COLECCIÓN AULA MENTOR SERIE PROGRAMACIÓN
CamSp SGALV
Desarrollo de Aplicaciones
Web Multiplataforma
Aula Mentor
Catálogo de publicaciones del Ministerio: www.educacion.gob.es
Catálogo general de publicaciones oficiales: www.publicacionesoficiales.boe.es
Autores
Miguel Ángel Contreras Castañeda
Coordinación pedagógica
Rocío de la Bandera Berlanga
NIPO: 030-15-106-6
ISBN: 978-84-369-5623-8
ÍNDICE
Pág.
Módulo 0. Introducción.........................................................19
Unidad 0. Introducción..........................................................................................20
1. ¿Por qué realizar este curso?............................................................................................20
3. Curva de aprendizaje.......................................................................................................22
Módulo 1. HTML5.................................................................25
Unidad 1. Introducción e instalación del entorno de trabajo...............................26
1. Introducción e Historia de la www................................................................................26
4. Resumen.......................................................................................................................63
1.2. Párrafos...............................................................................................................75
1.3. Títulos..................................................................................................................76
1.4. Listas...................................................................................................................77
1.5. Citas....................................................................................................................84
2. Multimedia e imágenes......................................................................................................102
3. Tablas y formularios.........................................................................................................111
3.1. Tablas.......................................................................................................................111
3.2. Formularios.............................................................................................................117
4. Resumen.......................................................................................................................133
1.3.7. Transformaciones......................................................................................173
1.4. Geo-localización..................................................................................................176
1.4.1. Introducción...............................................................................................176
1.4.3. Coordenadas..............................................................................................179
1.5.2. Persistente........................................................................................................197
2. Resumen..............................................................................................................................201
Módulo 2. CSS3.....................................................................203
Unidad 4: Estructura, estilos, selectores y jerarquías en CSS3...............................204
1. Introducción a CSS3..........................................................................................................204
3. Estilos.................................................................................................................................208
3.1. En línea...................................................................................................................208
3.3. Externos...................................................................................................................210
4. Jerarquía..............................................................................................................................211
6. Resumen.............................................................................................................................223
1.3. Colores...............................................................................................................229
1.4. Textos.................................................................................................................232
1.4.1. Tipo.............................................................................................................233
1.4.2. Tamaño......................................................................................................237
1.4.3. Estilo...........................................................................................................238
1.4.4. Grosor........................................................................................................239
1.4.6. Sombras......................................................................................................241
1.4.7. Transformaciones.......................................................................................241
1.4.8. Indentación................................................................................................242
1.4.9. Espaciados.................................................................................................242
1.4.10. Alineación................................................................................................243
1.6.1. Bordes........................................................................................................250
1.6.2. Fuentes.......................................................................................................251
1.6.3. Background................................................................................................252
1.6.5. Listas...........................................................................................................253
2. Elementos flotantes......................................................................................................254
2.1. Float.........................................................................................................................256
2.2. Clear.........................................................................................................................257
2.3. Overflow..................................................................................................................258
3.2. Relativo....................................................................................................................261
3.3. Absoluto..................................................................................................................262
3.4. Fijo...........................................................................................................................263
3.5. Visibilidad................................................................................................................264
3.6. Profundidad.............................................................................................................265
4. Selectores avanzados........................................................................................................266
4.5. Pseudo-clases..........................................................................................................271
4.5.1. De selección....................................................................................................271
4.5.2. De enlace........................................................................................................273
6. Ejemplos prácticos............................................................................................................282
6.1. Posicionamiento de elementos..........................................................................282
7.2. Transformaciones..............................................................................................296
7.2.1. Rotaciones..................................................................................................296
7.2.2. Escalado.....................................................................................................298
7.2.4. Desplazamiento.........................................................................................299
7.2.5. Transiciones...............................................................................................300
8. Resumen.......................................................................................................................307
Módulo 3. JQUERY...........................................................309
Unidad 6: Introducción e historia a jQuery.......................................................310
1. Introducción.................................................................................................................310
2. JavaScript y jQuery......................................................................................................311
3.1. Definición..........................................................................................................312
3.2. Variables.............................................................................................................313
3.3. Funciones...........................................................................................................314
3.4. Operadores básicos................................................................................................315
3.8. Arrays......................................................................................................................324
3.9. Objetos....................................................................................................................324
6. Eventos...............................................................................................................................343
7. Atributos.......................................................................................................................406
7.2. Leer....................................................................................................................412
7.3. Editar..................................................................................................................413
7.4. Añadir.................................................................................................................414
7.5. Eliminar..............................................................................................................416
8. Resumen.......................................................................................................................417
2. CSS3..............................................................................................................................438
3. AJAX...................................................................................................................................446
3.1. Introducción............................................................................................................447
3.2. Preámbulo................................................................................................................449
3.2.3. Sincronismo/Asincronismo.............................................................................450
3.2.4.1. $.get().......................................................................................................450
3.2.4.2. $.post().....................................................................................................451
3.2.4.3. $getScript()...............................................................................................451
3.2.4.4. $.ajax().....................................................................................................452
4. Efectos................................................................................................................................454
4.2. Fundidos..................................................................................................................459
4.3. Desplazamientos.....................................................................................................462
4.4. Animaciones............................................................................................................464
5. Resumen............................................................................................................................474
Unidad 8. jQuery UI y Plugins..........................................................................475
1. jQuery UI.....................................................................................................................475
1.2. Acordeón...........................................................................................................478
1.3. Autocompletar...................................................................................................482
1.4. Botones..............................................................................................................485
1.5. Calendario..........................................................................................................487
1.6. Diálogos.............................................................................................................488
1.7. Menús................................................................................................................489
1.10. Slider.................................................................................................................496
1.11. Spinner.............................................................................................................498
1.12. Tabs..................................................................................................................501
1.13. Tooltip..............................................................................................................503
3. Resumen.......................................................................................................................510
3. Estructura básica...............................................................................................................520
3.1. Roles........................................................................................................................525
3.2. Temas......................................................................................................................527
4. Botones..............................................................................................................................534
5. Iconos personalizados......................................................................................................539
6. Columnas...........................................................................................................................543
7. Listas..................................................................................................................................544
7.5.4. Contadores......................................................................................................555
8. Tab.....................................................................................................................................557
9. Formularios...................................................................................................................562
9.1. Etiquetas.............................................................................................................564
9.2. Contenedores.....................................................................................................564
9.5. Conmutadores...................................................................................................567
9.6. Deslizadores/Slider............................................................................................567
11. Transiciones...............................................................................................................582
14. Resumen.....................................................................................................................599
5. Limitaciones y tendencias...........................................................................................609
Módulo 0. Introducción.
Unidad 0. Introducción.
Unidad 0. Introducción
El perfil actual del programador Web ha cambiado debido a la rápida expansión de los
dispositivos móviles, y otros nuevos dispositivos que se están desarrollando en este mismo mo-
20
mento. Cuando un programador realiza una web, ya sea personal o para una empresa, se da por
entendido que se puede ver desde cualquier navegador.
Con los diferentes tamaños de pantallas existentes entre Smartphone, SmartTv, Tablet y
dispositivos móviles en general, es necesario crear una versión específica, y reducida para ellos,
así el usuario podrá disfrutar de una forma más amigable de los contenidos.
Además con la fragmentación existente hoy en día y diferentes dispositivos, cada vez es
más difícil dar soporte como programador a las diferentes marcas y vertientes, y si quisiéramos
abarcar todos los campos, deberíamos:
Otros.
cuidando la estética, el usuario no distinguirá entre una aplicación nativa y una basada en Web.
Todo el software que vamos a usar en el curso no tiene licencias de pago, y en caso de
mencionarse alguno, siempre se referenciarán a las webs oficiales por si algún alumno lo quiere
utilizar en su forma Trial o Demo.
Iremos construyendo una aplicación Web, ampliando los conocimientos en cada módulo
hasta posteriormente tener una web multiplataforma, teniendo diferentes entradas, para PC´s o
para dispositivos móviles. Cuando finalicemos habremos adquirido los siguientes conocimien-
tos: 21
Aula Mentor
22
3. Curva de aprendizaje.
En este curso vamos a ver unos contenidos bastante amplios y de diferentes ámbitos,
por lo que existirán algunas partes que notaremos que avanzamos más que otras, por ello es
importante saber en qué fase estás en cada momento y la dificultad que puede tener cada una.
El gráfico siguiente muestra la curva de aprendizaje para un alumno que tenga unos
conocimientos avanzados del manejo de su ordenador y disponga del tiempo suficiente para
realizarlo, cada uno puede tener una curva totalmente diferente. Debido a los conocimientos
previos de cada uno, existirán módulos en los que avances más rápido; lo importante que debes
comprender es que los módulos se van entrelazando entre sí para que finalmente tengas unos
conocimientos bastante amplios para desarrollar aplicaciones web multiplataforma con un nivel
avanzado, además adquirirás uno de los perfiles más demandados hoy en día en programación.
M0. Introducción
Como se puede observar en el gráfico, los dos primeros módulos tienen una curva de
aprendizaje bastante rápida y luego se hace más lenta cuando llega al módulo de JQuery, pero
¿qué pasa en este módulo? Bueno realmente esta curva representa el peor de los casos, ya que 23
vamos a ver programación, aunque todo se explica desde cero, puede ser que vayas más rápido
o más lento dependiendo de tu perfil. Aunque la sintaxis de JQuery es mucho más sencilla que
JavaScript, sigue siendo un poco difícil en la primera toma de contacto. Posteriormente cuando
comprendas la base, verás que es muy sencillo y notarás que tienes un gran control sobre todos
los elementos de la web.
Todo esto no es para que temas al módulo de JQuery, sino todo lo contrario primero
hacerte ver que si tardas un poco más en el módulo, es lo normal y tendrás que dedicarle más
atención, JQuery es una de las herramientas con más potencia que disponemos hoy en día en
la web, puede hacer efectos y manejo de la web con poco código, sustituyendo y no siendo
necesario usar en la mayoría de los casos Adobe Flash, teniendo en cuenta la dependencia que
obliga al dispositivo a poder visualizar animaciones con Adobe Flash Player, por ejemplo en los
dispositivos móviles de Apple.
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 instalació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.
Aula Mentor
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
f=”
ctos
.ht
”em
co
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 po-
demos 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-
mail@otrodominio.com 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
forma@gmail.com?subject=Email recibido desde mi página web&cc=otroemail@otrodominio.com”>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 a
117
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 cuando el usuario en-
víe el formulario, estas acciones pueden ir desde
enviar mail (action=”mailto:nombrecorreo@
nombredominio), de forma interna con
(action=””), o si tenemos un archivo ya
sea local o en internet, podríamos po-
ner: (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ía-
mos 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 <button
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 co-
sas 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) {
“<br>Latitud: “ + position.coords.latitude +
“<br>Altidud: “ + position.coords.altitude +
“<br>Velocidad: “ + position.coords.speed;
</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
M1. HTML5
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
que vaya en aumento.
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.
Módulo 2. CSS3.
1. Introducción a CSS3.
En HTML5 nos hacíamos cargo de la semántica de la web y de los elementos que la iban
a integrar. En esta última versión se ha intentado separar la parte de la semántica de la parte
del diseño, es decir, una aplicación web que tenga una estructura y una funcionalidad concreta
puede tener un aspecto totalmente diferente sólo con cambiar solo un archivo (css) y lo más
importante, sin tener que modificar nada en los archivos html que habíamos creado inicialmente.
Esto nos trae muchas ventajas, en las que podemos destacar total independencia del
204
equipo de diseño y del de desarrollo; eso no quita que trabajen conjuntamente, sino que se
puedan dividir el trabajo. Renovar la apariencia de una web estéticamente creando un efecto
totalmente diferente, sin cambiar una letra del contenido.
Un ejemplo sencillo: imaginemos que hemos escrito un menú superior con una lista,
como vimos en las primeras unidades. Algo parecido a esto:
Como toma de contacto no estaría mal, pero ¿y si pudiéramos poner en un sitio diferente
algo distinto? como:
miarchivo.css
.menuinicio{
texto: azul;
fondo: amarillo;
}
M2. CSS3
Esos no serían los comandos exactos, pero si muy parecidos, la mayoría sería una simple
traducción. Obtendríamos un resultado muy parecido a éste:
Bueno, ha cambiado un poco el menú y la verdad que hoy en día podemos encontrar
muchos ejemplos de menús realizados así. Lo importante como hemos dicho anteriormente, es
que si la empresa que nos pidió el diseño decide cambiar los colores de la marca, no es necesa-
rio cambiar todo, archivo por archivo: inicio.html, productos.html, etc, solo nos tendríamos que
ir a nuestro archivo miarchivo.css y modificarlo y el cambio se aplicará a todos los archivos
existentes. Imaginemos que la marca ha cambiado los colores de amarillo y azul, por azul y
blanco:
miarchivo.css
.menuinicio{
texto: blanco;
fondo: azul;
205
}
Como podréis ver, tenemos un menú totalmente diferente, cambiando sólo “algo” en un
sitio, ésto es porque hemos independizado totalmente el diseño de la parte semántica de la web.
Existe una web donde podremos ver muchos más ejemplos de ésto:
http://www.csszengarden.com/
Si seleccionas, view all design verás que hay muchos diseños diferentes pero si te fijas
en el contenido, apreciarás que es el mismo; ésta es la idea en la que tenemos que pensar siem-
pre que desarrollemos nuestra aplicación web, ya que nos facilitará muchísimo el mantenimien-
to, además de agilizar las modificaciones respecto al diseño.
el código las hojas de estilo necesarias. En este curso se ha decidido añadir el estilo después,
para comprender aún más la independencia de ellos, y ver que el diseño puede ir totalmente
independiente del código en HTML5. En el siguiente apartado veremos las formas de agregar las
hojas de estilo a nuestros ficheros en HTML5.
Debemos recordar que un navegador web se encarga de ir leyendo etiqueta por etiqueta
nuestra página y entenderá solo dos tipos de elementos:
Elementos de bloque (block). Serán tratados como una estructura que se van posicio-
nando uno sobre otros, creciendo hacia abajo de nuestra web, y aunque pusiéramos las etique-
tas en línea, una seguida de la otra, aparecerá como si fueran dos bloques diferentes, ésto pasa
con la mayoría de las etiquetas: <header><section><aside><footer><p>, etc. Veamos un ejemplo:
Como verás, están todas las etiquetas seguidas una de otra, forma no aconsejada para un
mantenimiento efectivo, pero si como una forma de dificultar a un tercero cómo se ha realizado
la web. Pero si ejecutamos el archivo en el navegador veremos el siguiente resultado:
206
Elementos en línea (in line). En este caso los elementos se posicionan uno al lado del
otro, no crecen hacia abajo ni insertan ningún salto de línea a no ser que ya no haya más espacio
en la web.
M2. CSS3
Pero antes de continuar y llegados a este punto debemos conocer en qué consiste el
modelo de cajas y para qué nos sirve en la creación de nuestras aplicaciones web. El navega-
dor entiende cada etiqueta HTML como una caja, y cada caja tiene unas propiedades definidas,
según las cuales las ubicarán en un sitio y forma concreta. Si recordamos cuando usamos el
modo desarrollador de nuestra web, nos vamos a la pestaña Element y abrimos una web que
ya hayamos realizado, por ejemplo voy a usar la página del ejemplo2.
Podemos ver que hay varios elementos, pero si vamos pasando el ratón por encima de
ellos y vamos desplegando los elementos, al seleccionar el enlace que teníamos creado llamado 207
empresa, lo primero que nos muestra es donde está seleccionado en el código; cosa muy útil
cuando cogemos código de terceros para el mantenimiento y estamos un poco perdidos.
Aula Mentor
También debemos fijarnos que a la derecha aparece una caja con unas propiedades del
elemento, padding, border, margin, etc y si vamos moviéndonos por ella, observaremos a qué se
refiere cada punto. Como ya veremos más adelante todo esto es muy importante. Además, nos
comenta qué estilo está usando por defecto el navegador, si subimos con el scroll vertical, entre
otras cosas podemos ver en la zona Styles esa información, el estilo que está usando el propio
navegador para ese código en concreto:
3. Estilos.
Hemos hablado de estilos y que hay que aplicarlos en nuestros archivos, y cuando el
navegador los lea, los irá interpretando y comprobará si tiene que modificar las propiedades de
la etiqueta en concreto, pero ¿dónde le digo exactamente al navegador donde están mis estilos?
208 Existen varias formas donde podemos insertar nuestros diseños:
- En línea.
- Internos.
- Externos.
Es importante saber que se pueden usar de varias formas, porque dependiendo de cada
necesidad, usaremos una forma, otra o la combinación de varias.
3.1. En línea.
Nosotros podemos aplicar estilos directamente sobre el propio elemento una vez esta-
mos declarando la etiqueta de apertura, independiente de la etiqueta que sea:
Cuando existan más de una propiedad, estas deberán ir separadas por punto y coma “ ;
“ . style=”propiedad1: valorPropiedad1; propiedad2: valorPropiedad2;”>
<p style=”mis propiedades”>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
Podemos usar como ejemplo los siguientes estilos. Para aplicar un tamaño de letra de 22
pixeles y un estilo cursivo (italic) tendríamos que agregar:
M2. CSS3
Por ahora debemos fijarnos en la forma de declarar las propiedades, las propiedades
que estamos viendo son a modo de ejemplo para que puedas verlo gráficamente, y veas un
resultado. Tienes en los recursos del curso el ejercicio con el código utilizado, revísalo e intenta
reproducirlo cambiándole por ejemplo el tamaño en font-size de 22px por uno 10px, luego por
30px o cualquier otro. Recuerda que siempre que realices algún cambio, deberás guardar y ac-
tualizar el navegador, sino el cambio producido no lo mostrará.
3.2. Internos.
Además de definir nuestros estilos en la propia etiqueta, en línea, podemos hacerlo in-
ternamente en la cabecera de la página actual. Es decir, si quiero aplicar a toda la página un
estilo concreto podemos hacerlo declarándolo dentro del <head></head> como vimos en un
ejemplo del módulo anterior.
209
Para ello debemos imaginarnos que queremos usar para todos los párrafos <p> un estilo
concreto, por ejemplo “font-size: 22px;” tamaño de letra 22px y estilo de texto en cursiva font-
style: italic. Vamos a coger el mismo ejemplo anterior y agregar el siguiente texto en el <head>
de la página:
....
....
<head>
<style>
p { font-size: 22px;
font-style: italic;
</style>
Aula Mentor
</head>
....
....
3.3. Externos.
210
En la mayoría de los proyectos de gran embergadura, será necesario trabajar con varios
archivos a la vez, y cada uno de ellos deberá hacer su función, tendremos por tanto:
- Un archivo HTML5, (extensión .html) donde tendremos nuestras etiquetas: texto, formula-
rios, tablas, la semántica de la web, etc.
- Un archivo CSS3, (extensión .css) donde tendremos las reglas de estilo referidas a las eti-
quetas con nuestro diseño.
Además, sería conveniente ir organizando nuestro sitio web, teniendo carpetas para te-
ner los contenidos mejor estructurados. Un ejemplo puede ser el siguiente, no tiene por qué ser
el mismo nombre, es más, cada cual puede organizar y nombrar las carpetas según le interese,
pero a modo de ejemplo:
Respecto al archivo HTML5 y CSS3 hay una forma de relacionarlo, que debemos incluir
en nuestro fichero html dentro del head usando la etiqueta:
M2. CSS3
Prueba a ejecutar el ejemplo 4/index.html y verás que el resultado es el mismo que ha-
ciéndolo directamente en el <head>:
Es posible que ahora mismo no le veas mucha utilidad, pero lo normal es que el archivo
de diseño ocupe cientos de líneas solo con el diseño, y es mucho más claro tenerlo todo en un
fichero aparte, sino tendría que estar todo el código dentro del head del documento.
4. Jerarquía.
Como hemos visto, podemos definir estilos en diferentes sitios, entonces ¿cuál es el sitio
predilecto por el navegador? ¿Qué estilo va a poner el navegador finalmente cuando vea el estilo
de esta etiqueta?
Aula Mentor
Como era de esperar, siempre el navegador va a dar más prioridad al estilo que esté más
cercano a la etiqueta. Esto nos viene muy bien también porque si por ejemplo ponemos toda
la web concreta con un estilo concreto, por ejemplo fondo azul, y queremos en un apartado en
concreto poner un fondo amarillo, podemos dejar el fichero inicial tal cual y modificar sólo el
archivo en cuestión. Pero veamos un ejemplo donde pongamos ésto de manifiesto:
miestilo.css
212
index.html
¿Por qué no se ha aplicado el estilo externo (rojo) en el fichero? Porque había uno más
cercano a la etiqueta indicando otra definición. Por eso, debemos recordar que cuando el diseño
sea externo no quiere decir que tenga menos valor, si por ejemplo nos equivocamos y cambia-
mos el orden, poniendo la definición justo después de la otra definición, veremos que la cosa
cambia.
….
<head>
<style>
p{
color:blue;
</style>
</head>
….
En este caso, ya si aparece el color Rojo, pero desaparece el color Azul, tendríamos el
siguiente efecto en nuestra aplicación web:
213
Ésto es porque realmente cuando hacemos una llamada a un fichero externo, el navega-
dor lo que hace es agregarlo a continuación, y como está más cerca de la etiqueta, es el último
que tiene en su caché, es el que va a usar, por lo que uno de los fallos más típicos cuando se
trabajan con ficheros externos es el orden de los mismos, haciendo efectos que no esperamos
cuando se trabaja sobre la misma etiqueta. En este ejemplo tenemos que pensar que el navega-
dor ha agregado a continuación del estilo, el contenido del fichero como tipo “text/css”:
También podríamos utilizar unas propiedades de diseño en los ficheros externos, otros
en los internos y otros distintos en línea, se puede hacer las mezclas que se nos ocurra, pero
siempre debemos comprender que el último estilo aplicado a la etiqueta HTML es el que el na-
vegador mostrará, es como si existe una cascada y diferentes niveles, siempre recibirás el agua
de fuente inmediatamente superior, de ahí viene el nombre de Cascading Style Sheets, hojas de
estilo en cascada.
Al igual que en una cascada, si en alguna altura una etiqueta recibe una propiedad, las
que estén dentro de ella la heredarán, recibirán ese color, si además se le aplicará un estilo a esta
segunda, todas las etiquetas de este tercer nivel, heredarán las propiedades del primer nivel, más
las del segundo, más las propias, y así se podría repetir indefinidas veces. Veamos un ejemplo:
Nivel 1. Tenemos un artículo <article> que tiene como estilo la letra de color Azul.
Nivel 2. Tenemos un párrafo <p> en su interior que va a tener la letra tamaño 22.
<article style=”color:blue”>
<article style=”font-size:32px;”>
<p>Texto de nivel 2
214
<article style=”font-style:Italic;”>
<p>Texto de nivel 3
</article>
</article>
</article>
El texto de nivel inferior se irá impregnando de las etiquetas superiores que hay por
encima, teniendo el nivel 3, en este caso color azul, tamaño 32 y cursiva.
He realizado mucho hincapié en esto porque la mayoría de los errores que hay con las
hojas de estilo es seguir correctamente el orden, prioridad de las etiquetas, la jerarquía y la he-
rencia. Todo ésto, conforme se vayan realizando ejercicios se irá dominando cada vez más, así
que ¡ánimo y prueba por ti mismo todos estos ejercicios!
- Selectores de elemento.
- Selectores de ID.
- Selectores de Clase.
Un selector de elemento nos va a permitir aplicar una regla de estilo sobre un tipo de
elemento concreto de HTML. Para ello tenemos que poner el tag o etiqueta seguido de los pares 215
de propiedad: valor, separadas por “;”, todo ello cerrado entre corchetes. Es muy importante
seguir estrictamente el formato porque si no tendremos errores difíciles de detectar.
/* Podemos añadir comentarios opcionalmente, y pueden ocupar una o varias líneas. Estos comentarios los
verá un usuario avanzado, por lo que no se debe poner información transcendental.
*/
etiquetaHTML {
propiedad1: valor1;
propiedad2: valor2;
propiedad3: valor3;
Por ejemplo si queremos aplicar a la etiqueta <h3> el color Azul y a la etiqueta de párrafo
<p>, el color Rojo y cursiva tendremos que escribir lo siguiente:
Aula Mentor
miestilo.css
Los selectores de ID, seleccionarán aquellas etiquetas que coincidan con el identificador
asociado id=”nombre_identificador”. Estas etiquetas serán distinguidas en el fichero o estilo
CSS, porque les preceden una #, usándose de la siguiente forma:
/*
En este caso seleccionamos todos los elementos que hay en documento que corresponde al identificador
dado. Solo se puede usar una vez en el documento CSS y debe ser declarado una única vez en el CSS. Por
lo que se suele usar para secciones bien diferenciadas, tipo menú superior, contenido, barra lateral,
etc. Aunque se puede usar para cualquier otra etiqueta como párrafos, títulos, tablas, etc.
*/
#nombre_identificador {
propiedad1: valor1;
propiedad2: valor2;
propiedad3: valor3;
M2. CSS3
Veamos un ejemplo, imaginemos que vamos a tener dos identificadores, uno para el
menu_superior y otro para el menu_inferior, y en el menú superior vamos a poner un texto
más grande para destacarlo junto con otras propiedades, y en el inferior un texto más pequeño
y otras propiedades distintas.
…..
<nav id=”menu_superior”>
</nav>
…..
…..
<footer id=”menu_inferior”>
</footer>
217
…..
…..
/*####################################*/
/*SELECTORES DE ID */
/*####################################*/
#menu_superior{
font-size: 40px;
font-style: italic;
Aula Mentor
color: red;
#menu_inferior{
font-size: 20px;
font-style: normal;
color: blue;
/*####################################*/
/*####################################*/
h3 {
color: blue;
p{
color: red;
font-style: italic;
}
Veamos un ejemplo, siguiendo con el apartado anterior, vamos a añadir dos clases, tex-
to_actual y texto_antiguo, y con algunas propiedades para distinguirlos, más adelante veremos
que hace cada una de las propiedades, pero ahora debemos centrarnos en cómo seleccionar los
elementos de nuestra página.
/*
*/
.nombre_clase {
propiedad1: valor1;
propiedad2: valor2;
Aula Mentor
propiedad3: valor3;
...
/*####################################*/
/*SELECTORES DE CLASE*/
/*####################################*/
.texto_actual{
text-decoration: underline;
220 .texto_antiguo{
text-decoration: line-through;
...
….
<section>
<article>
</article>
….
<article>
</article>
</section> 221
through; para el estilo antiguo, insertando una línea en el centro y text-decoration: underline;
para poner el texto subrayado.
Una vez visto las diferentes formas de seleccionar los elementos, nos podemos realizar
la siguiente pregunta, ¿cuál tiene prioridad respecto a las demás en caso de duda sobre una eti-
queta? En la siguiente tabla podemos ver el orden de prioridad:
1º Selector de ID
2º Selector de Clase
3º Selector de Elemento
<p class=”desdeClase” id=”desdeID”>¿De qué color soy?, tengo ID= azul, Clase= rojo y elemento = verde.
Solución= AZUL</p>
<p class=”desdeClase”>¿De qué color soy?, No tengo ID, Clase= rojo y Elemento = verde. Solución=
ROJO</p>
222
<p>¿De qué color soy?, No tengo ID ni Clase pero si Elemento = verde. Solución= VERDE</p>
/*SELECTORES DE ID */
#desdeID{
color: blue;
/*SELECTORES DE CLASE*/
.desdeClase{
color: red;
M2. CSS3
/*SELECTORES DE ELEMENTO */
p{
color: green;
El resultado sería:
223
Puedes visitar el ejemplo10-selectores-jerarquia/
6. Resumen.
- Las hojas de estilo en cascada (CSS - Cascading Style Sheets) contienen las definiciones de
estilo y diseño de los documentos HTML5.
- Las etiquetas de HTML serán de dos tipos: elementos de bloque y elemento en línea. Depen-
diendo del diseño que vayamos a realizar tendremos que tener en cuenta esto para obtener
el resultado deseado.
- Para definir nuestras propiedades sobre el documento podemos realizarla de tres formas
diferentes.
• En línea.
• Internos.
• Externos.
- Las hojas de estilo tiene una jerarquía que dependiendo de la proximidad de la etiqueta se
usará un estilo u otro. Por norma general el orden de mayor a menor: en línea, internos y
externos. Aunque debemos tener cuidado en el orden de la definición de éstos dos últimos.
Aula Mentor
- En caso de duda, por existir varias definiciones del mismo nivel sobre la misma etiqueta,
usamos a continuación de la propiedad !important, indicando al navegador que ésta es la
que prevalece sobre las demás.
- En los documentos existen muchas etiquetas y la mayoría se repiten. Para concretar y se-
leccionar más eficazmente a qué etiquetas les queremos aplicar los estilos, tendremos tres
formas básicas:
• Selector de ID. Crea unos identificadores únicos y se selecciona a través del identifi-
cador creado.
• Selector de Clase. Crea unas clases y se podrán usar varias veces en el mismo documen-
to, seleccionando en tal caso todas las etiquetas que correspondan a esa clase.
- La jerarquía entre selectores será el diseño que decidirá el navegador en caso de duda ante
varias selecciones sobre la misma etiqueta.
1º - Selector de ID.
2º - Selector de Clase.
3º - Selector de elemento.
224
Unidad 5: Propiedades, elementos
flotantes y posicionamiento
1. Propiedades CSS3.
Medidas en pc (picas). Define el tamaño en picas, y cada pica equivale a 12 puntos, es decir,
unos 4.23 milímetros. No muy extendida.
Este tipo de medida es más dinámico que el anterior y están referidas a un valor por otra
variable, por lo que no en cada momento va a depender del otro parámetro. Aunque pueda ser
más difícil su manejo, es de los más usados en la web, sobre todo cuando queramos adaptarnos
a diferentes dispositivos de pantalla y resoluciones.
Aula Mentor
Medidas en px (píxeles). Es muy usual usar esta medida al menos para algunas zonas,
para fijar un tamaño concreto e indicar el número de píxeles en pantalla que va a ocupar.
Por ejemplo, cuando dijimos con la propiedad font-size: 32px; estamos diciendo que el texto va
a ocupar 32 píxeles de nuestra pantalla. Esta medida algunos autores la toman también como
absoluta, ya que define un valor fijo, aunque realmente va a depender de la resolución de la
pantalla del usuario.
Medidas en em. Esta unidad de medida es útil cuando queremos tener en cuenta la con-
figuración del tamaño de letra en el ordenador de usuario, por ejemplo para aplicaciones para
discapacitados visuales. Ya que esta medida es relativa al tamaño de letra pre configurado del
usuario en su navegador. El nombre de EM está relacionado con la letra M. Originalmente, la
unidad se deriva de la anchura de la letra mayúscula “M” en el tipo de letra dado. Esta unidad
es la misma para todas las fuentes en un tamaño de punto dado.
Medidas en %. Esta es la más recomendada, está basada en aplicar una unidad relativa a
otro elemento definido en la página. Si por ejemplo queremos que el ancho de una capa sea la
mitad de su contenedor padre, podemos indicar width: 50%.
Podemos usar tanto las medidas absolutas como las relativas conjuntamente, siempre
y cuando la usemos con un objetivo concreto. Siempre es obligatorio indicar las unidades de
medida a continuación del valor que estamos utilizando, salvo que indiquemos que el valor de
una propiedad es 0.
Veamos varios ejemplos con el texto, aunque usar la medida en % se aplica a contene-
dores o div y no a textos como tal:
226
<p style=”font-size:10pt;”>Texto con valor = 10pt<p>
Puedes ver el resultado en los recursos de la Unidad 5, apreciarás una gran diferencia en
cada caso, por lo que debemos prestar mucha atención a los valores que ponemos.
web, este contenedor deberá tener un valor de anchura o altura. En caso de no indicarse, el
navegador, entenderá que si necesita crecer el interior del elemento crecerá en el valor que no
se ha indicado.
Para ello, disponemos de una etiqueta para fijar la anchura (width) y otra para fijar la
altura (height). Imaginemos que vamos a crear varios contenedores y queremos darle un tama-
ño concreto, en el archivo HTML5 tendríamos:
<section id=”deportes”>
<article>
<div id=”caja1”></div>
</article>
</section>
<section id=”sucesos”>
<article>
<div id=”caja2”></div>
227
</article>
</section>
Y en el fichero CSS3 tendríamos lo siguiente (nótese que hemos usado una propiedad
para agregarle un fondo background-color y poder distinguir visualmente qué es lo que mostra-
ría nuestro navegador):
#deportes{
width: 200px;
height: 200px;
background-color: green;
#sucesos{
width: 100px;
Aula Mentor
height: 100px;
background-color: red;
#caja1{
width: 50px;
height: 50px;
background-color: blue;
#caja2{
width: 20px;
height: 20px;
El resultado sería:
Debes prestar atención a la forma que ha usado el navegador para mostrar cada com-
ponente, y qué elemento está dentro de cuál, cómo y dónde se han ubicado. Comprender todo
ésto te facilitará en un futuro la organización de contenidos en tu aplicación web.
M2. CSS3
1.3. Colores.
Para expresar los colores en CSS3 existen varias formas, dependiendo de la necesidad
usaremos una u otra:
Color en Inglés:
Se puede escribir el nombre del color en inglés, esta forma nos mostraría un número
limitado de colores. Por ejemplo: red, white, yellow, green, etc.
Se puede expresar el color en valor hexadecimal indicando el valor de tinte en los colo-
res primarios R (Red), G (Green) y B (Blue). Siendo el valor menor el 00 y el valor máximo el
FF. Los valores en Hexadecimal serían los siguientes:
#RRGGBB
Por ejemplo, si queremos poner el color rojo con esta definición, pondríamos el rojo RR con
229
valor FF y el resto con 00:
#FF0000
#990000
Podemos expresar la intensidad del color de forma numérica, siendo más precisa que
la forma anterior, ya que en vez de usar 16 valores para definir el tinte del color usamos 255,
siendo 0 el valor inferior y 255 el valor máximo. No acepta negativos en caso de asignarse por
equivocación se tomará el 0. Para ello tenemos el método:
Para el caso que queramos sacar el color violeta (5 partes de azul y 2 de rojo) podríamos
usar la siguiente combinación:
rgb(20,0,100);
Al igual que en el apartado anterior, podemos indicar los colores usando el método rgb,
pero en este caso en vez de indicar un valor entre el 0 y 255, se usará entre el 0% del color y el
Aula Mentor
Si queremos crear un color que tenga un 30% de rojo, un 60% de verde y un 80% de azul,
tendríamos que indicar:
contexto.strokeStyle = “rgba(255,0,0,1)”;
En la siguiente tabla podemos ver los nombres en inglés más estándares en la web:
Respecto a los colores también se pueden usar otros métodos, como son el HLS (hue-
saturation-lightness) y definir muchos más colores con el nombre en inglés; pero con los méto-
dos vistos hasta ahora se puede representar la mayoría de los colores existente y si te interesa
mucho los formatos y definición de los colores, siempre puedes ampliar la información en la
documentación oficial en:
http://www.w3.org/TR/css3-color/#numerical
M2. CSS3
Propiedades de color
Para la definición del color en sí, hemos visto antes varias etiquetas, pero existen algu-
nas propiedades distintas que también están relacionadas con los colores de nuestra aplicación
web, estas son: color (color del texto), background-color (color de fondo) y border-color
(color del borde) y box-shadow (sombra).
Veamos un ejemplo, imaginemos una sección que va a tener un color de texto concreto
(blanco), color de fondo (azul), un borde (verde) y un sombreado (naranja). Podríamos escribir:
#miseccion{
width: 600px;
height: 300px;
color: white;
background-color: blue;
border-width: 4px;
border-style: solid;
231
border-color: black;
filter:progid:DXImageTransform.Microsoft.Shadow(color=’#FFA500’,
Direction=135, Strength=12);}
Aula Mentor
El resultado sería:
Para el sombreado tenemos varios parámetros para poder configurar la dirección, el ta-
maño, intensidad y color de la sombra. Éstas son:
FORMATO DESCRIPCIÓN
box-shadow: x y z color X: margen de la sombra hacia la derecha.
1.4. Textos.
Una de las partes más importantes en las páginas web es el tratamiento de texto y las
propiedades que podemos hacer. Podemos aplicar diferentes propiedades a nuestros textos,
entre las más destacadas tendríamos:
1.4.1. Tipo.
1.4.2. Tamaño.
1.4.3. Estilo.
1.4.4. Grosor.
1.4.6. Sombras.
1.4.7. Transformaciones.
M2. CSS3
1.4.8. Indentación.
1.4.9. Espaciados.
1.4.10. Alineación.
1.4.1. Tipo.
Con CSS3 podemos usar diferentes tipos de letra y fuentes predefinidas o incluso con las
nuevas versiones podemos incorporar nuestros propios tipos de fuente, incluso si el usuario no
tiene instalada esa fuente. Para esto tenemos la siguiente etiqueta:
Es posible añadir varios tipos de letra y si ése no existiera cogerá el siguiente, y en caso
que el navegador no encontrase el tipo de letra asociado al texto, escogerá el que tenga él por
defecto.
.opcion1{
} 233
.opcion2{
.opcion3{
.opcion4{
font-family: Erronea;
}
Aula Mentor
Si nos fijamos hay dos características que no debemos dejar escapar, la primera es que
cuando el tipo de letra tiene más de una palabra, ésta ha de ir encerrada entre comillas. Y la
segunda, el último tipo de letra ha sido inventado, y he puesto tipo de fuente errónea, y me ha
escrito el texto en un formato concreto, ¿cuál? Debemos recordar que el modo desarrollador de
nuestro navegador (F12) es nuestro mejor aliado, por ejemplo en Firefox si nos vamos al ele-
mento en concreto, veremos que nos indica el tipo de fuente elegida, en este caso al no existir
el tipo Errónea, ha cogido la suya por defecto que es Times New Roman:
234
- Ve pasando el ratón por cada uno de los textos y las opciones y confirma que se ha ido
aplicando los estilos que hemos ido definiendo.
Imaginemos que las fuentes existentes no nos satisfacen o queremos usar un tipo de
fuente que no me detecta el navegador y la apariencia de mi web va a depender mucho de la
tipografía existente, deberíamos usar la siguiente sintaxis:
@font-face {
font-family: nombredemifuente;
src: url(rutadelafuente);
}
M2. CSS3
…..
font-family: nombredemifuente;
…..
@font-face
font-family: “mitipografia”;
src: url(‘../font/waltographUI.ttf’);
Recuerda que si tenemos el archivo .CSS en una carpeta de distinto nivel, debemos usar
“..” para acceder al padre, y a partir de ahí a la carpeta donde estén las fuentes, en este caso font.
235
Podemos hacer nuestras propias fuentes, existen programas específicos donde te las
pueden diseñar, pero también podemos descargarnos otras gratuitas en otros sitios; bien de va-
rios recursos de internet o las que nos facilitan Google Fonts.
http://www.google.com/fonts/#
Se nos abrirá una ventana con las diferentes opciones del tipo de fuente y la forma de
usarla en nuestra web:
@import url(http://fonts.googleapis.com/css?family=Lobster);
- Mediante JavaScript.
<script type=”text/javascript”>
WebFontConfig = {
};
(function() {
var wf = document.createElement(‘script’);
‘://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js’;
M2. CSS3
wf.type = ‘text/javascript’;
wf.async = ‘true’;
var s = document.getElementsByTagName(‘script’)[0];
s.parentNode.insertBefore(wf, s);
})(); </script>
Te recomiendo que pruebes a descargarte alguna fuente que te guste, y si tuvieras alguna
duda, puedes ver un ejemplo completo con todos estos ejemplos:
1.4.2. Tamaño.
Para variar el tamaño de letra tenemos la propiedad que ya hemos usado anteriormente:
font-size: valor;
FORMATO DESCRIPCIÓN
Absoluta Un palabra clave que asigna un valor concre-
to:
{ larger | smaller }
font-size: 1.7em;
Porcentaje Indicamos el valor en % teniendo como base
la que tenga por defecto el navegador.
238
Valores ab- xx-small x-small small medium large x-large xx-large
solutos
Factor de 3/5 ¾ 8/9 1 6/5 3/2 2/1 3/1
escala
HTML títulos h6 h5 h4 h3 h2 h1
HTML ta- 1 2 3 4 5 6 7
maños de
fuente
1.4.3. Estilo.
También podemos agregarle varias propiedades para modificar el estilo de texto, para
ello, usamos la propiedad:
font-style: valor;
VALOR DESCRIPCIÓN
normal Es el estilo por defecto del navegador, no es
necesario especificarlo mientras no haya una
propiedad padre aplicando otro estilo:
1.4.4. Grosor.
Otra forma de destacar nuestro texto es agregarle un grosor concreto, poner por ejemplo
el texto en negrita ayuda mucho a la lectura de texto que queramos destacar. Para ello CSS3 nos
proporciona la siguiente etiqueta:
VALOR DESCRIPCIÓN
Numérico Existen diferente grosores predefinidos, y de-
pende de la fuente, el navegador y el tamaño
{100 – 900} se apreciará más o menos. 239
•100 - Thin
•300 - Light
•400 - Normal
•500 - Medium
•700 - Bold
text-decoration: valor;
VALOR DESCRIPCIÓN
none Elimina cualquier apariencia que tenga defi-
nida, ya venga de un elemento jerárquico su-
perior.
Estas propiedades al igual que muchas otras se pueden combinar aplicándose simultá-
neamente mientras no sea restrictiva una de la otra. Serían factibles por ejemplo, agregar a un
texto una línea superior y una inferior.
1.4.6. Sombras.
text-shadow: valores;
FORMATO DESCRIPCIÓN
text-shadow: x y z color X: margen de la sombra hacia la derecha.
Estas propiedades al igual que pasa con box-shadow, otras en HTML5 y CSS3 son sopor-
tadas por las últimas versiones de los navegadores.
241
1.4.7. Transformaciones.
En muchas ocasiones nuestra aplicación web tendrá que realizar transformaciones sobre
el texto, ya sea porque reciba los datos de una base de datos en bruto, un formulario web o
porque nos queramos asegurar que el texto tenga un formato en concreto. Para ello tenemos la
siguiente propiedad:
text-transform: valor;
VALOR DESCRIPCIÓN
Escribe la primera letra de cada palabra en
mayúsculas.
capitalize
Ejemplo: text-transform: capitalize;
Escribe todas la letras en mayúsculas.
1.4.8. Indentación.
Al igual que la propiedad anterior, cuando estemos rellenando texto de otras fuentes,
o escribiendo directamente el texto en nuestra web, es necesario indentar nuestro texto (dar
espacios al inicio de la primera línea de cada párrafo). Para ello disponemos de la siguiente
propiedad:
text-indent: valor;
242
En este caso el valor se puede expresar en un valor estático o variable en porcentaje res-
pecto al ancho del párrafo, en caso de que el usuario reduzca o amplíe el tamaño de la ventana,
este % se calculará automáticamente. También se le puede aplicar un valor inherit (valor que
viene heredado de los padres del elemento). Puedes ver unos ejemplos en el Ejemplo08-texto-
indent.
1.4.9. Espaciados.
Podemos asignar un valor concreto de espaciado tanto en las letras como en las palabras
de nuestros párrafos de texto, al igual que el espacio entre líneas (interlineado). Para ello dispo-
nemos de las siguientes etiquetas:
PROPIEDAD DESCRIPCIÓN
letter-spacing: valor; Permite variar el espacio entre los caracteres
de cada palabra.
letter-spacing: -2px;
M2. CSS3
line-height: 85%;
white-space: valor; Permite controlar los espacios vacíos, sus va-
lores son pre (preserva los espacios escritos
en el HTML y los saltos de línea). nowrap (Im-
pide los saltos de línea automáticos por lo que
crecerá la web horizontalmente). normal (deja
que el navegador gestione los saltos de línea y
espacios múltiples).
white-space: nowrap;
243
white-space: normal;
Puedes ver varios ejemplos en el link anterior, prueba a realizar varias propiedades y
comprueba que funcionan tal y como dice la especificación.
1.4.10. Alineación.
ALINEACIÓN DESCRIPCIÓN
horizontal Alinea el texto de forma horizontal, aunque
dependiendo del caso no hace el efecto exac-
text-align: valor; to que esperábamos. Existen varios valores
posibles que puede coger esta propiedad:
Puedes ver ejemplos tanto de alineación en el siguiente ejemplo y recuerda realizar tus
propias alineaciones de texto y practicar con las propiedades en el ejemplo10-texto-alineacion/
Hemos visto hasta ahora las propiedades más importantes y que se utilizan en la mayo-
ría de las aplicaciones web aplicadas al texto. Si estás interesado sobre alguna propiedad más
específica y fuentes de CSS3 siempre podemos ver las actualizaciones e información completa
en:
http://www.w3.org/TR/css3-fonts/
Como habíamos comentado anteriormente, debemos ver nuestra web como un conjunto
de etiquetas HTML y estas etiquetas se comportan como un modelo de caja. Pensemos que cada
etiqueta va a ocupar un rectángulo y este rectángulo tiene unas propiedades: márgenes, bordes
y rellenos. Debes prestar mucha atención a los siguientes conceptos porque posteriormente te
facilitarán o dificultarán que lo que quieres representar en tu aplicación web sea realmente lo
que deseas:
245
PROPIEDAD DESCRIPCIÓN
margin Nos permite aplicar un margen (espaciado ex-
terno a nuestra caja) a un elemento HTML. Se
puede hacer de forma genérica aplicando el
mismo tamaño a toda la caja usando margin:
valor;. Por ejemplo margin: 50px; aplicaría un
margen de 50px a toda nuestra caja.
Veamos varios ejemplo sobre una caja de un tamaño fijo y cómo va interactúan las pro-
piedades vistas sobre las etiquetas de HTML5.
Ejemplo11-margin-padding/
Aquí no hemos aplicado nada, sólo he ido agregando cajas dentro de cajas, debéis pen-
sar que es como un puzzle donde tenemos varias cajas. En nuestro caso, una caja grande de
color verde, a continuación cajas de menor tamaño (100x100px). Si usamos el modo depurador
del navegador nos da esa información, muy interesante ya que puedo ver los elementos pasan-
do el ratón por encima de ellos, ésto nos ayudará porque además de indicarnos dónde está el
elemento en cuestión, nos dirá el área que entiende el navegador que va a tener para ubicar ese
elemento y las propiedades.
Y ahora imaginemos que aplicamos un margen de 10px a la caja justo del medio, ¿qué
crees que pasará? ¿Y si le aplicamos en vez de un margen un padding?
Queda puesto de manifiesto en los ejemplos anteriores el resultado de aplicar las di-
ferentes propiedades, y además de sacar la conclusión de el margin (da espacio exterior) y el
padding (da espacio interior). No obstante, no debemos dejar pasar por alto qué ha pasado
cuando hemos ampliado esas líneas y cómo han afectado a la posición de las cajas y ¿porqué la
caja 7 no se ha colocado justo debajo de la caja 4? En verdad es porque los elementos van flotan-
do al usar una propiedad que veremos más adelante y se han ido colocando e intentado meter
Aula Mentor
pero se ha topado con la caja 5 y no ha podido ir más allá, y ¿qué ha pasado con las siguientes?
Pues que ha intentado ponerse justo a la derecha de la caja 7 y no ha cogido tampoco, entonces
ha bajado e ido al siguiente hueco libre, justo debajo de todas. De todas formas del apartado 2
sobre los elementos flotantes y posicionamiento veremos más ejemplos.
Depuración en Firefox Imagen girada 90º para ver por qué la caja 7
Como ya hemos visto podemos aplicar border a nuestros diseños y este borde será exter-
nos a nuestra caja, por lo que ocupará de ancho: (ancho caja)+2*(ancho del borde). Para aplicar
248 bordes usamos las siguientes propiedades:
border-width: valor;
border-style:
valor;
Los diferentes valores que puede tomar border-style serían los siguientes:
Valor Descripción
none Valor por defecto, si está activa anula un bor-
de específico.
hidden Pone un borde oculto, depende del diseño es
posible que lo necesitemos en el caso de con-
flictos de bordes por ejemplo en elementos
de tabla.
dotted Pone un borde con relleno con puntos.
dashed Pone un borde relleno de rayas.
solid Pone un borde contiguo, con relleno sólido.
double Pone doble línea sólida.
groove Efecto 3D relieve incrustado en la página.
ridge Efecto 3D relieve saliendo de la página.
M2. CSS3
Cada navegador puede representar de una forma cada propiedad y podemos aplicar un
estilo diferente a cada propiedad, para ello podemos especificar el borde de dos formas:
Específicamente:
Propiedad Descripción
border-top-style Estilo del borde de la parte superior. 249
border-right-style Estilo del borde de la parte derecha.
border-bottom-style Estilo del borde de la parte inferior.
border-leftstyle Estilo del borde de la parte izquierda.
En línea:
border-style: (estilo borde superior) (estilo borde derecho) (estilo borde inferior) (es-
tilo borde izquierdo)
Ya vimos que en el apartado 1.3 que podíamos aplicar además colores a esos bordes con la
etiqueta:
border-color: valor;
Si quieres ver toda la documentación al repecto de los border puedes verlo en:
http://www.w3.org/TR/css3-background/#borders
Los “Shorthand” de CSS3, son la forma de aplicar una propiedad CSS de forma reducida,
lo que nos va a permitir hacer un código menos pesado y más eficiente.
1.6.1. Bordes.
250
Podemos usar todo en la misma línea:
border-left-width: 2px;
border-left-style: solid;
border-left-color: black;
border-right-width: 2px;
border-right-style: solid;
border-right-color: orange;
border-top-width: 2px;
border-top-style: solid;
border-top-color: blue;
border-bottom-style: solid;
border-bottom-color: red;
1.6.2. Fuentes.
Al igual que con los bordes podemos usar la notación shorthand, reduciendo y simplifi-
cando las especificaciones de nuestra propiedades.
font-weight: bold;
font-style: italic;
font-variant: small-caps;
font-size: 1.5em;
line-height: 200%;
font: bold italic small-caps 1.5em/200% Georgia, “Times New Roman”, serif;
1.6.3. Background.
En la mayoría de los casos usamos esta notación de forma normal o extendida, como por
ejemplo:
background-color: orange;
background-image: url(img/mi_imagen.gif);
252
background-repeat: no-repeat;
background-attachment: scroll;
Este ShorHand es muy útil también porque nos ahorraría muchas líneas, en el caso que
tuvieramos el siguiente ejemplo:
M2. CSS3
div.actual {
margin-top: 1em;
margin-right: 1.5em;
margin-bottom: 2em;
margin-left: 2.5em;
Podríamos usar:
Pasa igual con las otras propiedades: padding o outline. Al igual que nos pasaba con los
bordes, si sólo se indica dos parámetros:
list-style-type: circle;
list-style-position: inside;
list-style-image: url(../img/mi_imagen.jpg);
Puedes ver varios ejemplos sobre los bordes y la notación ShortHand en el ejemplo13-shorthand/
Varios autores fomentan el uso de la notación ShortHand por la simplificación del código y la
reducción del número de líneas de los archivos. Otros comentan que queda más claro y que me-
morizar las posiciones que corresponden dificulta el desarrollo. Ambas son igualmente válidas,
elige la que más se adapte a ti, y aunque al principio te resulte más incómodo esta notación, no
descartes la notación ShortHand, cuando estés continuamente trabajando con ella, no encontra-
rás excesivos problemas.
Aula Mentor
2. Elementos flotantes.
Como hemos podido comprobar en varias ocasiones los elementos que vamos inser-
tando en nuestra aplicaciones web se mueven y posicionan según unos patrones que debemos
controlar correctamente para no tener problemas posteriormente.
Este apartado es muy importante porque te ayudará o dificultará los diseños web cuan-
do estés en algún proyecto, la diferencia de entender estos conceptos o no, puede ser colocar
elementos y posicionarlos “a ojo” cambiando propiedades hasta que nos dé el resultado que
queremos (evitar a toda costa) o comprender el flujo de los elementos y cómo se posicionan
en la web, y anticiparse al resultado o en su defecto, en caso de error, comprender por qué ha
fallado y poder solucionarlo rápidamente.
Supongamos que nuestra web, va a mostrar siempre en la página inicial tres artículos,
para ello vamos a declararnos tres artículos en el html de la siguiente forma: archivo.html
….
<article id=”articuloI”>
<p>BLOQUE IZQUIERDO</p>
</article>
<p>BLOQUE CENTRAL</p>
</article>
<article id=”articuloD”>
<p>BLOQUE DERECHO</p>
</article>
….
archivo.css
#articuloI{
width: 200px;
height: 200px;
background-color: green;
text-align: center;
M2. CSS3
#articuloC{
width: 200px;
height: 200px;
background-color: red;
text-align: center;
#articuloD{
width: 200px;
height: 200px;
text-align: center;
2.1. Float.
float: valor;
Para poder usar esta propiedad, debemos tener obligatoriamente definida la pro-
pieda width del elemento. Esta propiedad admite los siguiente parámetros:
VALOR DESCRIPCIÓN
right Coloca al elemento de forma flotante a la de-
recha, dentro del contenedor padre.
left Coloca al elemento de forma flotante a la iz-
quierda dentro del contenedor padre.
none Decimos implícitamente que este elemento no
va a ser flotante.
256
Pero sin embargo si aplicamos la propiedad float:right; veríamos que los elementos se
nos han desplazado a la derecha y fíjate en el orden en el que aparecen los bloques:
1. Lee el primer bloque, lo saca del flujo y lo pone a la derecha del padre.
2. Lee el siguiente bloque, lo saca también del flujo y lo pone a la derecha del padre, como ya
hay otro elemento, lo pone a la derecha de él.
3. Lee el siguiente bloque, lo saca nuevamente del flujo y lo pone a la derecha del padre, como
ya hay otros elementos, lo pone a la derecha de ellos.
M2. CSS3
Por último si le agregamos la propiedad izquierda al bloque titulado como BLOQUE IZ-
QUIERDO y la propiedad derecha al bloque titulado como BLOQUE DERECHO, obtendremos el
siguiente resultado, el cual debes analizar con el modo desarrollador para ver qué ha realizado
exactamente. Para clarificar un poco más hemos reducido el tamaño de bloque IZQUIERDO de
200x200 a 150x150, sino lo taparía y no se puede apreciar, fíjate que al indicar float el elemento
bloque verde se ha salido del flujo, y se ha puesto a la izquierda de su padre, pero en el ele-
mento BLOQUE CENTRAL no hemos especificado nada por lo que él sigue en su flujo, que sería
el que hay por defecto. El bloque azul no se ha puesto justo arriba a la derecha, porque encima
al existir un elemento anterior que ha ocupado una posición del padre, éste elemento BLOQUE
CENTRAL al estar en formato de bloque ha ocupado su posición.
2.2. Clear.
Cuando tenemos elementos flotantes tenemos que tener alguna forma de indicar a nues-
tra aplicación que algunos de ellos no van a permitir elementos flotantes junto a él. Para ello
tenemos la siguiente propiedad:
clear:valor;
VALOR DESCRIPCIÓN
none Permite elementos flotantes a ambos lados.
left No permite elementos flotantes a su izquierda.
right No permite elementos flotantes a su derecha.
both El elemento no permite elementos flotantes a
ningún lado.
Se han puesto todos los elementos con float:left, para que se salten el flujo y se vayan
ordenando en el siguiente hueco libre del padre. Ahora si nos centramos en el bloque central y
le añadimos la propiedad clear: left; no permitirá que se ponga ningún elemento flotante a la
derecha.
258
¡Ojo! Este resultado será el mismo que si aplicarámos clear:both; Y a no ser que los
tres bloques estuvieran flotando hacia la derecha float:right; no podríamos probar la opción de
clear:rigth;
2.3. Overflow.
Imaginemos un supuesto en el que los tres bloques en vez de tener como elemento
padre todo el body de la web, tiene otro elemento padre, y éste no tiene definido ni el ancho
ni el alto, para que se adapte automáticamente al contenido, sin aplicar ninguna propiedad de
M2. CSS3
flotabilidad, tendríamos:
<div id=”padre”>
<div id=”articuloI”>
<p>BLOQUE IZQUIERDO</p>
</div>
<div id=”articuloC”>
<p>BLOQUE CENTRAL</p>
</div>
<div id=”articuloD”>
<p>BLOQUE DERECHO</p>
</div>
</div>
Si le ponemos los tres elementos de bloque como flotante float:left; veremos que el
padre se ha quedado apenas en nada, sólo en unos píxeles porque le he aplicado un borde para
que se aprecie, sino ni se vería, ¿por qué? Porque se ha salido del flujo del padre y como el padre
ahora no tiene ningún elemento (relleno) dentro no puede adaptarse, tendríamos la siguiente
situación:
Aula Mentor
La línea negra que se aprecia sería el elemento padre, para subsanar ésto tenemos la
propiedad:
overflow: valor;
VALOR DESCRIPCIÓN
visible Opción por defecto. El contenido no se re-
corta.
hidden El contenido oculto se recorta pero el nave-
gador no mostrará la barra de scroll, quedará
oculta.
auto El contenido oculto se recorta pero el navega-
dor no mostrará la barra de scroll a no ser que
260 sea necesario porque el hijo ocupe más del
espacio del padre.
scroll El contenido oculto se recorta pero el navega-
dor y mostrará la barra de scroll.
Inherit Toma el valor que venta por el elemento pa-
dre.
- 3.2. Relativo.
- 3.3. Absoluto.
- 3.4. Fijo.
Es el valor por defecto que usa el navegador, para los elementos de bloque es colocarse
uno debajo de otro. Y para los elementos en línea, uno detrás del otro mientras los elementos
entren en el elemento padre, en caso que el siguiente elemento no entre, se bajará a la siguiente
línea.
261
3.2. Relativo.
La posición relativa se refiere a la distancia dada respecto alguna referencia del elemen-
to conjunto, top, right, bottom o left. Para ello usamos previamente la propiedad: position:
relative; .Si cogemos y decimos en el ejemplo anterior que el bloque del medio (el de color
naranja) queremos que esté a 25px de la izquierdo y 25px de la parte superior, el efecto sería el
de la imagen siguiente, nótese que el elemento inferior no se ha desplazado, se ha quedado en
la misma posición:
Aula Mentor
position: relative;
left: 25px;
top: 25px;
262
Puedes visitar el ejemplo18-position-relative/
3.3. Absoluto.
Si queremos que esté a un valor concreto del elemento padre, tenemos que usar la pro-
piedad position: absolute; y además debemos usar como en el apartado anterior las indicacio-
nes con top, right, bottom o left. En este caso el elemento se sale del flujo y dejaría su hueco
libre, lo que provocaría desplazamientos indeseados sino lo tenemos en cuenta. Si usamos las
siguientes propiedades en el bloque del medio (el de color naranja):
position: absolute;
right: 25px;
M2. CSS3
- Se han reordenado los elementos inferiores, subiendose hacia arriba porque ha dejado el
hueco libre el bloque naranja.
3.4. Fijo.
El posicionamiento fijo nos va a servir para establecer una posición fija (inamovible) de
un elemento HTML en la Web. Para ello usamos la propiedad con el siguiente valor: position:
fixed; .Al igual que el posicionamiento absoluto, el posicionamiento fijo hace que el elemento
pierda el flujo normal del documento, y se posicionará mediante las mismas propiedades ante-
riores top, left, right y bottom.
263
Esta opción puede ser muy indicada para posicionar un elemento concreto en un sitio,
por ejemplo, para agregar los link de las redes sociales, o algún banner, etc. Aunque el ususario
haga scroll, este elemento o capa estará siempre visible al usuario.
Aula Mentor
3.5. Visibilidad.
Como hemos visto en los ejemplos anteriores, los elementos tienen unas características
propias definidas previamente, así por ejemplo, cuando usábamos un párrafo con la etiqueta
<p>, sabemos que tiene un valor de bloque, al igual que cuando usamos imágenes con la eti-
queta <img> son elementos en línea. Cuando necesitemos cambiar la forma de un elemento
respecto a ver como bloque o en línea, hemos de usar la siguiente propiedad:
display: valor
VALOR DESCRIPCIÓN
block La etiqueta se tratará como un elemento en
bloque.
Inline La etiqueta se tratará como un elemento en
línea.
none Retira al elemento del documento y la visuali-
zación de la página.
Veamos los siguientes ejemplos para comprender esta propiedad, supongamos que tene-
mos en nuestro fichero varios párrafos (elementos en bloque) y varias imágenes (elementos en
línea) y además queremos aplicar la propiedad none a la imagen que pone HTML5.
264
Si asignamos la propiedad inline a los elementos que serían por definición de bloque y
viceversa, obtendríamos el siguiente resultado:
visibility: valor;
Siendo los dos valores posibles, visible, cuando el elemento lo puede ver el usuario al
mostrarse en la página, o hidden, cuando queramos que el elemento permanezca oculto en la
página. Siguiendo el ejemplo anterior podríamos poner la imagen central que antes se veía con
visibility:hidden:
265
3.6. Profundidad.
Por último en posicionamiento vamos a ver un tema que seguro te has preguntado; en
el caso que tenga varios bloques y la estructura de la página lo requiera y existan unos encima
de otros, ¿cómo puedo ordenar todo esto?. Para ello usamos la siguiente propiedad:
z-index:número;
El numero ha de ser un número positivo y sólo se podrá aplicar sobre los elementos
que tiene la propiedad position como absoluta, relativa o fixed. El nombre de esta propie-
dad viene dada por “z”, por el eje z indicando la profundidad, e “index” por el valor que indica
su orden dentro del eje. Si tuvieramos varios bloques posicionados de forma relativa, y que el
index coincida con el valor de lectura del documento, tendríamos:
Aula Mentor
4. Selectores avanzados.
Como vimos en la unidad anterior, en el apartado 5, existen unos selectores que me
permiten elegir por medio de una clasificación previa los elementos de HTML a los que quiero
hacer referencia. En concreto existían elemento de clase, id y de elemento.
266
Además de esas herramientas, existen otras que podemos usar en nuestros diseños:
1. Selector descendente.
2. Selector de hijos.
3. Selector adyacente.
4. Selector de atributos.
El selector descendente nos va a permitir aplicar reglas de estilo sobre todos aquellos
elementos que estén contenidos dentro de otro, es decir, que sean descendientes. Como había-
mos visto anteriormente se van replicando las propiedades de un descendiente a otro.
Se entiende que es descendiente de otro siempre que la etiqueta esté dentro de otra, por
ejemplo, en el siguiente ejemplo veremos el selector descendiente:
M2. CSS3
/*################################*/
/*SELECTORES DESCENDIENTE*/
/*################################*/
Div{
color: blue;
Hemos de destacar que como hemos visto se ha aplicado la propiedad tanto a hijos,
nietos, hermanos, etc. Todo elemento que esté dentro del contenedor o padre.
En determinadas ocasiones necesitaremos que nuestra propiedad sólo afecte a los hijos
directos y no se propague más por sus descendientes, para ello se utiliza la siguiente notación: 267
/*################################*/
/*SELECTOR DE HIJOS*/
/*################################*/
ul>li{
color: orange;
Como podemos apreciar de una forma muy sencilla hemos seleccionado sólo los ele-
mentos hijos, independientemente de la profundida, esta propiedad solo ha afectado a los hijos
Aula Mentor
El selector adyacente nos permite aplicar reglas de estilo sobre elementos que van se-
guidos en el código y que tienen el mismo padre, es decir, sobre elementos “hermanos” y están
seguidos unos del otro. Para ello usamos la siguiente notación:
/*################################*/
/*SELECTORES DESCENDIENTE*/
/*################################*/
Div{
color: blue;
}
268
Puedes visitar el ejemplo24-selectores-avanzados/
Debes fijarte que se ha aplicado en los elementos nieto 1 hijo1 y nieto 1 hijo2 y que no
se ha aplicado la propiedad en el nieto 2 y 3 del Hijo 1 porque no van a continuación de las
etiquetas <li><p> ¿por qué? Porque no tiene la pareja li+p sino en ellas tendría p+p. Si tienes
dudas al respecto, veamos un ejemplo más, imaginemos que tenemos 5 párrafos, pero entre el
párrafo 4 y 5 hay una imagen, si aplicamos la siguiente propiedad p+p:
p+p{
color; blue;
Los selectores de atributos, nos van a permitir aplicar reglas de estilo sobre elementos
HTML en función de sus atributos. De esta forma podemos incidir aún más en los elementos que
deseemos, para ello podemos usar los siguientes esquemas:
M2. CSS3
Cojamos como base un ejemplo anterior donde ya teníamos definido una propiedad de
adyacencia sobre los párrafos (p+p{color: blue;}), pero queremos afinar aún más la selección y
buscar aquellos que tenga el atributo párrafo3 y párrafo4.
p[id=”parrafo3”]{
color: orange;
p[id=”parrafo5”]{
Presta atención a la potencia de este selector, ya que puede ser tan preciso como que-
ramos, además no ha interferido con los otros elementos como sucedía con los selectores adya-
centes.
class~=”menu”
Buscaría el atributo class, y después seleccionaría todos aquellos que su clase contenga
Aula Mentor
[class~=”menu”]{
color: lime;
p[class~=”menu”]{
color: lime;
En este caso, hemos añadido un – después de nombre menu; si usamos el ejemplo an-
terior, el resultado sería muy distinto:
[class~=”menu”]{
color: lime;
Y si usaramos la otra forma de seleccionar por atributo, el atributo empieza por un nom-
bre seguido de un guión “-”, obtendríamos el siguiente resultado.
[class|=”menu”]{
color: lime;
}
M2. CSS3
Esto nos pone de manifiesto que es necesario un buen análisis previo de lo que vas
a emplear en la página web, y elegir unos nombres adecuados para posteriormente llegar a
ellos fácilmente. Existen más formas de seleccionar atributos, aunque estas son las más usuales,
si quieres ver toda la información completa puedes hacerlo en:
http://www.w3.org/TR/selectors/
4.5. Pseudo-clases.
Podemos encontrarnos ocasiones que los elementos que queremos seleccionar no están
tan ligados al atributo, descendencia, adyacencia o seleccionar todos los hijos. En determinadas
ocasiones necesitaremos ser más concretos o referirnos a la relación parental o del estado de
la propia etiqueta, dato que almacena el navegador en su caché. Podrían ser ciertos elementos
no referenciados en la página, como por ejemplo, el primer párrafo, o cómo se muestra el link
cuando ha sido visitado, etc.
4.5.1. De selección.
Existen diferentes formas de elegir los elementos del documento a las antes vistas, éstas 271
se puede ver en la siguiente tabla:
VALOR DESCRIPCIÓN
:root Elemento raíz o el elemento en el nivel más
alto. P.e en HTML5 la etiqueta <html>
:empty Corresponde a los elementos vacíos y que no
tienen hijos.
:only-child Devuelve aquellos que tienen solo un único
hijo.
:first-child Selecciona el primer elemento hijo.
:last-child Selecciona el último elemento hijo.
:nth-child(n) Selecciona el elemento enésimo o bien las pa-
labras claves even (pares) y odd (impares).
:nth-last-child(n) Selecciona el enésimo hijo a partir del último
elemento.
:only-of-type Devuelve el único elemento de este tipo.
:first-of-type El primer elemento de este tipo.
:last-of-type El último elemento de este tipo.
:nth-of-type(n) El enésimo elemento de este tipo, donde n es
un número o las palabras claves: even (pares)
y odd(impares)
:nth-last-of-type(n) El enésimo elemento de este tipo partiendo
del último elemento.
Aula Mentor
Pseudo-clase :first-child
Por ejemplo, pensemos que tenemos un elemento HTML concreto, una lista, donde
queremos que el primer elemento de la lista (su primer hijo) aparezca de otro color. Para ello
usaríamos:
div p:first-child{
color:blue;
Pseudo-clase :first-letter
272
div p:first-letter{
color:blue;
font-size: 200%;
.letracapital:first-letter{
color:blue;
font-size: 200%;
Si tenemos muchas líneas y queremos resaltar la primera línea de un párrafo por el mo-
tivo que sea, también podemos seleccionar la primera línea con la propiedad:
Pseudo-clase :first-line
M2. CSS3
.primeralinea:first-line{
font-weight: bold;
font-style: italic;
color: blue;
Debes fijarte que cuando se utiliza esta psedo-clase, se aplica exclusivamente a la pri-
mera fila, por lo que si cambias el tamaño de la ventana, o dinámicamente crece el texto, el
navegador irá calculando automáticamente el texto a la primera fila en tiempo real.
4.5.2. De enlace.
Pseudo-clase Descripción
a:link Define la apariencia de un enlace que todavía
no ha sido seleccionado o navegado por el
usuario. Lo más normal es eliminar el subra-
yado y el color.
a:link{
text-decoration: none;
color: black;
}
Aula Mentor
a:visited{
text-decoration: none;
color: black;
}
a:active Define la apariencia de un enlace en el mo-
mento que el usuario hace click sobre él.
a:hover Define la apariencia de un enlace cuando el
274 usuario ha pasado el ratón por encima del en-
lace. Aquí usualmente sí se aplican más pro-
piedades o efectos combinados, por ejemplo
cambiar el tamaño, ponerla en negrita o cam-
biar el fondo.
a:hover{
text-decoration: none;
color: black;
font-size: 125%;
font-weight: bold;
background-color: blue;
}
M2. CSS3
<a href=”index.html”>Inicio</a> |
<a href=”productos.html”>Productos</a> |
<a href=”empresa.html”>Empresa</a> |
<a href=”contactar.html”>Contactar</a>
a:link{
text-decoration: none;
color: black;
275
}
Y el resultado sería:
Como hemos visto el usuario no tendría que saber qué es un enlace, a no ser que pase
el ratón por encima, además podemos aplicarle muchas más propiedades.
Normalmente siempre se hacen las declaraciones de a:link y a:visited ya que están muy
relacionadas entre sí, por ejemplo podríamos hacer las siguientes declaraciones:
a:link{
color:black;
text-decoration: none;
a:visited{
Aula Mentor
color:black;
text-decoration: none;
a:link,a:visited{
color:black;
text-decoration: none;
Ahora si queremos darle un énfasis al enlace cuando el usuario tenga activo el enlace,
por ejemplo ponerlo en negrita, de color blanco y ponerle un fondo a la etiqueta, podríamos
276 hacer:
a:active{
color: white;
background-color: blue;
font-weight: bold;
font-style: italic;
Si mantenemos el ratón haciendo click sobre el link, nos aparecerá el estado que tenía-
mos diseñado:
M2. CSS3
Si queremos aplicar nuestros diseños cuando el ratón pase por encima del link, por
ejemplo, que cambie el fondo y que además ponga el tamaño de letra un 150% más grande
tendríamos que hacer:
a:hover{
font-size: 150%;
font-weight: bold;
background-color: lime;
Y tal y como hemos definido, si hacemos click sobre el enlace, activamos a:active, vería-
mos que nos mantiene el tamaño de letra ya que la propiedad superior sólo nos difiere en que
277
es cursiva y el fondo de color azul:
Como podemos ver, es muy fácil aplicar varias propiedades o efectos cuando pasemos
el ratón por encima del link o el enlace, se podría usar como hemos visto aquí en un menú o
en cualquier otro tipo de enlace que tenga nuestra aplicación web.
Debemos tener presente que estas pseudo-clases referidas a los enlaces, tienen un orden
de defición exacto, ya que tiene algunas vinculaciones sobre las propiedades, sino obtendríamos
efectos no controlados, por tanto el orden correcto de definición:
- a:link
- a:visited
- a:hover
- a:active
Aula Mentor
Las pseudo-clases que hemos visto anteriormente, (hover, active) las podemos aplicar no
solo a los elementos de tipo enlace, existirán etiquetas que podamos crearle sus efectos y de-
pende de la etiqueta tendrá sentido unas mas que otras, como por ejemplo puede ser un botón
o un propio div. Pero además de eso tenemos otra propiedad añadida a las anteriores que es:
EtiquetaHTML : hover
EtiquetaHTML : active
EtiquetaHTML : focus
Que cambiará las propiedades de la etiqueta HTML cuando esta tenga el foco del nave-
gador, por ejemplo, en un formulario, cuando esté el foco en un campo de texto.
<form>
<br>
</form>
Y respecto al CSS:
.confocus:focus{
background-color: lime;
color:blue;
M2. CSS3
.miclick:active{
background-color: red;
color:lime;
font-size: 125%;
.pasadaraton:hover{
color:blue;
font-size: 125%;
Me he creado varias clases, aunque se podía aplicar a un elemento HTML o ID., etc. Le
he asignado varias propiedades dependiendo de cuál es la acción del usuario y seleccionado
algunos elementos del código. Así tendríamos los siguientes efectos, aunque debemos recordar
que depende del navegador éstos puede diferir o incluso no funcionar si es muy antiguo:
Aula Mentor
ORIGINAL
280
Como puedes ver, estas propiedades dan mucho poder al diseñador web para crear
efectos con la interacción del usuario. Ahora si recuerdas cuando navegas por internet en alguna
web y pasas el ratón por algunas zonas concretas, aparecen sin haber realizado nada un banner
con publicidad u otra página web emergente, éstas se activan con estos métodos.
M2. CSS3
http://modernizr.com/
Nos vamos a DOWNLOAD y selecionamos qué elementos queremos que soporte con el
código.
281
Hacemos click en las opciones que queremos que nuestro código HTML5 sea compati-
ble y después pulsamos en GENERATE!. Posteriormente en DOWNLOAD Custom Build.
Aula Mentor
Posteriormente en nuestro proyecto, en cada página que tengamos debemos añadir den-
tro del <head> </head> el enlace al archivo que hemos creado, en nuestro caso:
<head>
<script src=”js/compatibilidad.js”></script>
282 </head>
6. Ejemplos prácticos.
Vamos a ver varios ejemplos y opciones complejas para que podamos integrar nuestras
páginas web creadas con HTML5 con CSS3. Realmente ya tendrías la mayoría de los elementos
y conocimientos para poder realizar diseños por ti mismo, pero creo que es conveniente ver
algunos ejemplo completos para afianzar aún más los conceptos. En los recursos del curso se
irán añadiendo cada vez más ejemplos resueltos además de los resueltos aquí. Te recomiendo
encarecidamente que intentes resolverlos por tu cuenta antes de mirar la solución, así te au-
toexaminarás para saber si has comprendido los contenidos.
Una empresa nos pide un diseño concreto en el que van a estructurar sus productos
según unos parámetros, nos pasan su código HTML actual:
<body>
<div id=”cabecera”>
<div id=”logo”></div>
M2. CSS3
</div>
<div id=”contenido”>
<div id=”subcontenido”>
<div id=”subencabezado”>
<div class=”columna”></div>
<div class=”columna”></div>
</div>
</div>
<div class=”columna”></div>
283
<div class=”columna”></div>
<div class=”columna”></div>
</div>
<div id=”redes”></div>
<div id=”pie”></div>
</article>
</section>
</body>
Aula Mentor
Realmente este código sería más común de versiones anteriores de HTML, ya que HTML5
nos ofrece otras características, podríamos actualizárselo a HTML5 usando artículos, secciones,
pies y navegación. Te animo que una vez completes este ejercicio, actualices también el código
HTML5, en los recursos hay una versión pero por ahora, nos centraremos sólo en el diseño. Para
ello, nos han proporcionado el siguiente boceto, indicándonos cómo quieren la estructura de la
web:
6.2.1. Versión 1.
La misma empresa anterior, después del éxito que ha tenido nuestro trabajo, decide que
le hagamos un menú en la parte superior, éste ha de ser de texto plano y que se cargue a través
de una lista que nos pasen ellos, por ahora, nos han dado los siguientes datos:
<div id=”barraHorizontal”>
<ul class=”menuHorizontal”>
</ul>
</div>
6.2.2. Versión 2.
Otra empresa diferente no está contenta con el menú que tiene y nos pide que realice-
mos un menú lateral desplegable para mostrar sus categorías, los datos que nos pasan ahora son
los siguientes:
<ul id=”menu”>
<li>INICIO</li>
285
<li>Sección 1
<ul class=”submenu”>
<li>Elemento 1</li>
<li>Elemento 2</li>
<li>Elemento 3</li>
<li>Elemento 4</li>
</ul>
</li>
<li>Sección 2
<ul class=”submenu”>
<li>Elemento 1</li>
<li>Elemento 2</li>
Aula Mentor
<li>Elemento 3</li>
<li>Elemento 4</li>
</ul>
</li>
<li>Seccion 3
<ul class=”submenu”>
<li>Elemento 1</li>
<li>Elemento 2</li>
<li>Elemento 3</li>
<li>Elemento 4</li>
</ul>
</li>
286 <li>Seccion 4
<ul class=”submenu”>
<li>Elemento 1</li>
<li>Elemento 2</li>
<li>Elemento 3</li>
<li>Elemento 4</li>
</ul>
</li>
</ul>
Y queremos realizar un menú que tenga varias secciones y varios elementos dentro de
esas secciones, además conforme vamos pasando el ratón nos va apareciendo otro color dife-
rente al de la lista:
M2. CSS3
cursor:pointer;
Para cambiar el cursor cuando pase por encima y que no aparezca la flecha por defecto,
podemos consultar el siguiente enlace puesto que existen muchos más estilos:
http://www.w3.org/TR/SVG/interact.html#CursorProperty
Y list-style-type: none; para evitar que salte el icono indicando que es una lista como vimos
anteriormente.
6.2.3. Versión 3.
La misma empresa que nos pidió el diseño anterior, después de varios meses, deciden
cambiar nuevamente la web, y usando la misma estructura, quieren dar la impresión de que han 287
creado una web nueva. Para ello, quieren en vez de usar un menú vertical desplegable, desean
uno horizontal desplegable, que tenga una apariencia similar a ésta:
Aquí tenemos varias secciones y elementos, pero cuando ejecutemos el menú veremos
una cosa muy distinta que todavía no hemos visto, ¡tienen animaciones y efectos! Bien es la parte
más interesante que nos ha traído CSS3 que veremos en el siguiente apartado, antes para hacer
este tipo de menú debíamos usar flash.
Los ejemplos que hemos visto de menú, serían candidatos a tenerlos en tu snippet pro-
pio o hacerte tus propias plantillas estándar y cuando necesites hacer tu web, crear la estructura
rápidamente y posteriormente sólo tendrías que modificar los nombres de las secciones y los
elementos.
También he de decir que existen muchas web donde puedes ver y descargarte menús de
todo tipo: Apple, Explorador de Windows, animados, lisos, con efectos, sin efectos, horizontales,
verticales, inferiores, etc. No debes pensar que entonces todo lo visto no es necesario, ya que la
mayoría de las veces tendrás que adaptar, modificar y entender que estás realizando para sacarle
todo el partido a tu web.
Aula Mentor
Un recurso muy usado y con efectos muy importantes en las páginas web son los degra-
dados de color. Tendríamos por tanto dos tipos de degradados: lineales o circulares:
Degradados lineales. Para que los navegadores que utilicen el prefijo –webkit se defi-
nen según la propiedad:
Para soportar el máximo de navegadores debemos usar además los siguientes prefijos a
éste:
Prefijo Descripción
-ms- Internet Explorer 10
-moz- Firefox 3.6 y posteriores 16+ no necesita pre-
fijo
-webkit- Chorme 10+
-webkit- Safari 4
-o- Opera 11.1 y a partir de 12.1 sin prefijo
-webkit- iOS Safari 3.2+
-webkit- Android Browser 2.1+
M2. CSS3
Esta tabla no debemos perderla de vista ya que cuando queramos aplicar un diseño con-
creto a un navegador completo deberemos de usar esta clasificación. Además esta clasificación
también se hará para otras propiedades, como por ejemplo los sombreados.
/* IE 6 y 7 */
/* IE 8 y 9 */
-ms-filter: “progid:DXImageTransform.Microsoft.gradient(startColorstr=’#ff000000’,
endColorstr=’#77ff0000’, gradientType=’1’)”;
Un ejemplo típico donde aplicar los degradados sería para crear un efecto botón o efecto
de profundidad, veamos varios ejemplos de degradados donde vamos a intentar dar soporte a
la mayoría de navegadores.
...
289
<div class=”degradado1”></div>
<div class=”degradado2”></div>
<div class=”degradado3”></div>
<div class=”degradado4”></div>
<div class=”degradado5”></div>
<div class=”degradado6”></div>
<div class=”degradado7”></div>
<div class=”degradado8”></div>
...
Y en el css tenemos:
.degradado1 {
margin-top: 6px;
290
Si queremos usarlo el efecto para simular un botón sólo debemos cambiar el tamaño de
nuestra capa y dejar todo lo demás igual.
.degradado2 {
……
.degradado3 {
display: block;
height: 300px;
width: 300px;
padding-top: 6px;
M2. CSS3
margin-bottom: 12px;
margin-top: 12px;
text-align: center;
border-radius: 4px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
.degradado4 {
display: block;
height: 25px;
width: 300px;
……
292
Ahora apliquemos un degradado circular sin sombreado:
.degradado5 {
}
M2. CSS3
Ahora apliquemos el mismo degradado circular, pero con un tamaño inferior para simu-
lar un botón y con sombreado:
.degradado6 {
height: 25px;
width: 300px;
border-radius: 4px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
….
.degradado7 {
display: block;
height: 300px;
width: 300px;
margin-top: 12px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
Aula Mentor
294
Y por último otro degradado donde hemos agregado una imagen de fondo para aún
dar más soporte a los navegadores, el truco consiste en añadir una imagen de fondo al inicio
de la regla CSS para que todos aquellos navegadores que no soporten el degradado tengan una
imagen, para ello se utiliza una con el gradiente realizado y que se repita, esta opción es menos
eficiente ya que tendría que cargar una imagen y repetirla por todo el lienzo, pero se gana en
compatibilidad:
.degradado8{
height: 300px;
width: 300px;
margin-top: 12px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
295
Y la imagen que voy a usar para que en caso que el navegador no lo soporte es la si-
guiente:
Si has programado antes HTML seguro que has usado este truco para poner un fondo
de pantalla en modo mosaico y repetido por toda el fondo, reduciendo el archivo de fondo de
la página. Éste se repetirá por el eje x, de ahí la propiedad:
7.2. Transformaciones.
Uno de los puntos que ha incorporado CSS3 es las transformaciones sobre los elementos,
esta propiedad permite aplicar rotaciones, cambios de escala, zoom o deformaciones oblicuas.
transform:
- Rotaciones.
- Escalas.
- Deformación oblicua.
- Desplazamiento.
7.2.1. Rotaciones.
Veamos un ejemplo, aplicándolo por ejemplo a un texto, en este caso indicando que el
artículo en cuestión está vendido, sin entrar que ya vimos cómo usar tipos de fuentes y propie-
dades para dar la sensación de:
Aplicamos rotación, color rojo del texto, borde y fondo amarillo en el CSS
<section>
<article class=”articulo”>
<p class=”vendido”>VENDIDO</p>
</article>
</section>
.articulo{
width: 300px;
height: 300px;
.vendido{
297
width: 50%;
color: red;
font-size: 30px;
background-color: yellow;
text-align: center;
-moz-transform: rotate(-45deg);
-webkit-transform: rotate(-45deg);
-o-transform: rotate(-45deg);
transform: rotate(-45deg);
}
Aula Mentor
7.2.2. Escalado.
En algunas ocasiones vamos a querer escalar algún elemento HTML, tenemos que tener
en cuenta que el escalado puede ser positivo (realizan un zoomIN acercándose) o negativo
(realizan un ZoomOut). Si se define sólo un valor se aplica a los ejes X e Y por igual, si se espe-
cifican dando los dos datos, corresponderán al eje X e Y. Cuando se hace un escalado negativo
se realiza una reflexión sobre el elemento, el valor con escala 1:1 sería scale(1) entre ese valor
y el 0 iría disminuyendo y todos los valores menores que cero harían reflexión progresiva sobre
el elemento.
/*ESCALA*/
-moz-transform: scale(2);
-webkit-transform: scale(2);
-o-transform: scale(2);
transform: scale(2);
/*ROTACIONES*/
298
-moz-transform: rotate(-45deg);
-webkit-transform: rotate(-45deg);
-o-transform: rotate(-45deg);
transform: rotate(-45deg);
¡OJO! Este código anterior estaría mal porque si hiciéramos eso, dependiendo del nave-
gador sólo nos haría la última transformación, en este caso la rotación, y si estuviera ésta antes
que el escalado, sólo nos haría el escalado, ¿qué solución hay? Declararlo conjuntamente:
skew(ángulo)
Donde el ángulo, al igual que en las otras propiedades, se puede expresar en grados
(deg), radianes (rad) o gradientes (grad), además de valores positivos realizar la transformación
en el sentido de las agujas del reloj y los negativos en sentido contrario. Cuando se aplica sólo
un valor se aplica a los ejes X e Y, y si se define con dos valores el navegador entenderá que el
primer valor es el X y el segundo el Y.
7.2.4. Desplazamiento.
translate(logintud);
Donde la longitud puede estar definida en px, %, em, in, mm o cm. Los desplazamientos
serán hacia la derecha si se usan valores positivos en el eje de las X, y hacia la izquierda en caso
contrario. Para el eje de la Y, los valores positivos efectúan un desplazamiento hacia arriba y los
negativos hacia abajo. Al igual que pasa con las otras propiedades; si se aplica solo un valor, éste
se hará efectivo sobre ambos ejes a la vez, y cuando se especifique dos valores, se entiende que
el primer valor es el de la X y el segundo el de la Y.
7.2.5. Transiciones.
JavaScript podía hacer todo tipo de transiciones, pero ahora con la nueva definición de
CSS3 podemos aplicarlas directamente desde el diseño. Si nunca has visto transiciones, debes
saber que hay unas propiedades básicas que necesitamos dominar para hacer los efectos tal y
como queremos, estas son:
transition-property
Definimos la propiedad que vamos a animar, por ejemplo si vamos a cambiar el alto,
el ancho, el color, etc. Se pueden definir varias propiedades separadas por comas, indicando a
cuales van a ser aplicadas, sino se designa ninguna, por defecto (clave all) se usa todas las pro-
piedades asignables al elemento.
transition-duration
transition-timing-function
transition-delay
También se puede usar la propiedad de forma abreviada como hemos visto a lo largo del
curso con otras propiedades:
Ejemplo.
Para realizar este ejemplo, podríamos tener un fichero HTML parecido a ésto:
<!-- Omitimos el resto del archivo y nos centramos solo en el menu -->
<nav >
<div class=”menu_vertical”>
<ul>
<li>
<h3>Item 1</h3>
<div> 301
<ul class=”submenu_vertical”>
</ul>
</div>
</li>
<li>
<h3>Item 2</h3>
<div>
<ul class=”submenu_vertical”>
</ul>
</div>
</li>
<li>
<h3>Item 3</h3>
<div>
<ul class=”submenu_vertical”>
302 </ul>
</div>
</li>
<li>
<h3>Item 4</h3>
<div>
<ul class=”submenu_vertical”>
</ul>
</div>
</li>
</ul>
</div>
</nav>
<!-- Omitimos el resto del archivo y nos centramos solo en el menu -->
En el fichero CSS3 tenemos que tener las propiedades y los selectores correspondientes 303
a la clase menu_vertical y a la clase submenu_vertical.
.menu_vertical>ul {
margin: 0;
padding: 0;
list-style:none;
width: 280px;}
.menu_vertical>ul>li {
display:block;
overflow: hidden;
margin: 0;
padding: 0;
Aula Mentor
list-style:none;
height:30px;
width: 280px;
background-color: #196ded;
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
.menu_vertical>ul>li>h3 {
304 display:block;
margin: 0;
padding:10px;
height:19px;
font-size: 80%;
color: #fff;
background: #4486f7; }
.menu_vertical>ul>li>div {
M2. CSS3
margin:0;
overflow: auto;
padding:10px;
height:150px;}
.menu_vertical:hover>ul>li:hover>h3 {
color:#fff;
background: #196ded;
font-size: 80%;}
.submenu_vertical li {
padding:6px;
list-style:none;
color:black;
cursor:pointer;}
.submenu_vertical li:hover {
list-style:none;
color:#fff;
Aula Mentor
font-weight: bold;
cursor:pointer;
font-size: 22px;
margin-left: 45%;
.submenu_vertical a {
color:#fff;
text-decoration: none;}
306 ¡Ojo! Debes prestar atención a la definición de las transformaciones, ya que en muchas
ocasiones puedes tener efectos no esperados cuando haces combinaciones de ellas, por ejemplo
prueba el siguiente efecto:
¿Qué hay diferente? Depende de la transformación tendremos que guardar un orden para
que sea correcta y se produzca.
http://www.westciv.com/tools/transforms/
También no debes pasar por alto las definiciones que hemos realizado en el CSS, llegan-
do a los elementos exactos que nosotros queremos, como vimos en la sección de selección de
los selectores:
.menu_vertical>ul>li>h3:hover
- Voy aplicar las siguientes propiedades hagan :hover sobre el elemento siguiente.
Con esa definición en el CSS nos estamos refiriendo exactamente a estos elementos de-
finidos en el html en el mismo orden, cuando haga :hover sobre:
<div class=”menu_vertical”>
<ul>
<li>
<h3>Item 1</h3>
Si por ejemplo, cambiáramos cualquier etiqueta <h3> por <h1> o el orden de los ele-
mentos en esa definición no nos estaríamos refiriendo al mismo caso, y obtendríamos un resul-
tado totalmente diferente.
8. Resumen. 307
- Las hojas de estilo las definimos a través de propiedades. Estas propiedades se pueden referir
a varias transformaciones o cambios; tamaño tanto en anchura y altura, colores, márgenes,
bordes y rellenos.
- Unas de las propiedades a las que debemos darle importancia en nuestra aplicación web son
los textos. Pudiendo modificar el tipo de letra, tamaño, estilo, grosor, línea de decoración
(subrayado), indentación, alineación y espaciados.
- Las propiedades se pueden definir de una en una o conjuntamente en una notación corta. A
ésta se le llama ShortHand y si la usamos en todo el archivo nos podremos ahorrar un gran
número de líneas.
- Los elementos en la aplicación web se tratan como bloques o cajas que se van uniendo entre
sí hasta que forman la web que ve el usuario. Estas cajas según del tipo que sea tendrán un
comportamiento predefinido. Con las propiedades float, clear y overflow podemos mane-
jar orden de colocación de las mismas.
- Existen unos selectores distintos de los de elemento, id o clase. Estos selectores avanzados
juegan más con la semántica y posición de los elementos definidos en la web. Por tanto ten-
dremos selectores de elementos descendientes, de hijas, adyacentes y de atributos.
- Cuando queramos afinar aun más la selección de elementos, podemos fijarnos en su posi-
ción parental o del estado de la propia etiqueta. Se llaman pseudo-clases y podríamos definir
con ellas: :opcion, a:opcion, etiqueta:hover, etiqueta:active o etiqueta:focus.
Aula Mentor
- Además de las propiedades básicas, con CSS3 se pueden realizar desde degradados de color
(lineales, circulares) y transformaciones de los elementos (rotaciones, escalado, deformacio-
nes oblicuas, desplazamientos y transiciones).
308
Módulo 3. JQUERY.
1. Introducción.
Con los conocimientos de los módulos anteriores podríamos realizar nuestras aplicacio-
nes web, sabríamos usar los elementos HTML5 y le aplicaríamos un diseño concreto a nuestra
web, usando CSS3. Pero en determinadas ocasiones necesitamos realizar un procesamiento aún
más avanzado de las etiquetas de HTML y la aplicación web en general.
<script type=”text/javascript”>
function muestraVentana() {
</script>
Con JavaScript, suplíamos la interacción con el usuario gracias a que podemos procesar
mucha información en el navegador del cliente, para ello teníamos el DOM (Document Object
Model) que trabaja la página web como un conjunto de objetos (etiquetas) que se iban selec-
cionando y modificando. El problema que existía con este modelo, era que JavaScript no podía
interactuar con el servidor directamente, sino que en determinadas ocasiones teníamos que
mandar una petición al servidor, esperar que el servidor nos devuelva una respuesta y mostrar
los datos, por ejemplo para saber si un usuario y contraseña son correctos en el sistema. Debido
a que este tráfico generado no era muy eficiente, ya que el usuario que se ha logueado tiene
que cargar toda la página entera (con las imágenes, textos, etc), ¿qué se hacía? Se empezó a usar
AJAX (Asynchronous JavaScript and XML), que precisamente nos permitía hacer eso entre otras
muchas cosas.
Posteriormente a JavaScript y a AJAX nació jQuery, creado por John Resig, y el se centró
en la interacción entre el DOM, JavaScript, AJAX, HTML y CSS. Para ello creo un framework libre
M3. JQUERY
y Open Source.
2. JavaScript y jQuery.
JavaScript accedía a los elementos del DOM para interactuar con ellos, si teníamos la
siguiente etiqueta:
getElementById:
getElementByName:
getElementByTagName.
311
Cogeríamos el elemento con el nombre buscado, p.e. tag=”div”.
Como supongo habrás supuesto, depende del navegador puede ser que tenga una es-
tructura concreta del DOM, ya que cada browser ha intentado sacar novedades y modificacio-
nes, pero todos los navegadores deben respetar este diseño de DOM:
https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction
El problema surge cuando el diseñador quiere acceder mediante a JavaScript a los atri-
butos y otras propiedades de estilo, acción que con jQuery se puede acceder de una forma muy
sencilla a todo usando el selector correcto.
Aula Mentor
jQuery sería una versión avanzada para tratar las páginas web, usando como lenguaje
JavaScript, haciendo más dinámica la interacción con el documento, que además, gracias a todo
el desarrollo que hay detrás cada vez más jQuery se está volviendo más compatible con el resto
de navegadores.
3.1. Definición.
<head>
….
….
<script type=”text/javascript”>
312
// Código JavaScript
</script>
</head>
O también podemos hacer igual que hacíamos con nuestros archivos CSS y enlazarlos
(“linkarlos”) a un archivo externo donde estén los script de JavaScript, una buena forma sería
crearnos una carpeta llamada js y agregar en el interior nuestros script. Posteriormente debemos
recordar que debemos llamarlos desde el <head></head> de nuestro documento, por ejemplo
si el archivo que contiene nuestro script se llama miarchivo.js y está alojado dentro de la carpeta
js podíamos crear el siguiente enlace:
<head>
….
….
</head>
M3. JQUERY
3.2. Variables.
Cuando estamos programando vamos a necesitar poder definir variables, en ellas vamos
a definir diferentes formatos: un valor numérico entero (1, 2,3…) un valor numérico decimal o
float (1.2, 3.4, 5.5...etc), un valor de texto (“texto y palabras…”), un valor booleano (verdadero
o falso, true o false), otras variables, etc.
Para definir una variable en JavaScript no es necesario definir el tipo, ya que la misma
variable puede tomar en un momento dado del programa un valor numérico, otro de texto o
nulo. Las definiciones de variables se hacen así:
Ejemplos:
…etc.
Además, estas variables tendrán un nombre único, el cual debemos definir intentando
facilitar la comprensión del código. Por ejemplo si me creo una función que cada vez que el 313
usuario haga click en el ratón me salte un contador, y éste va incrementando en uno en cada
interacción, lo más normal sería llamar a esa variable declarada:
var contador = 1;
var a = 2;
var b = 5;
var c = 7;
var operacion1 = a + b * c;
var operacion2 = (a + b) * c;
3.3. Funciones.
Las funciones o function van a ser bloques de código que van a realizar alguna acción
y una vez finalice puede devolver un resultado o simplemente ejecutarse. Si recordamos en el
ejercicio 3 de la unidad 2 abríamos una ventana usando el siguiente código:
<script type=”text/javascript”>
function muestraVentana() {
</script>
<script type=”text/javascript”>
return miSuma;
</script>
return miSuma;
console.log(resultadoSuma(5,4));
En JavaScript podemos crear programas para resolver nuestro algoritmos, y para ello,
debemos pensar que al igual que nosotros si tuvieramos que usar un papel y un boli, tenemos
que tener unos signos para poder realizar operaciones matemáticas, éstos son los operadores
básicos que disponemos en JavaScript:
317
Es una forma muy simplificada de la metodología de la programación, pero para empe-
zar está bien. Analicemos este diagrama de flujo:
Inicio:
Cuando inicia el programa, puede ser cuando hacemos una llamada a la función.
Parámetros de entrada:
En algunas ocasiones tendremos 1 o varios parámetros de entrada con los que nuestro
algoritmo operará.
Sentencias condicional:
Cuando en el programa nos encontramos con una toma de decisiones según un pará-
metro usamos una sentencia if – else. En el ejemplo estaría representada por el rombo y la
pregunta, ¿es A=B?, y según si es verdad esta pregunta (true) o si es falsa (false) se tomará una
decisión u otra.
En programación es una de las sentencias más usadas, siempre se pregunta sobre los
parámetros o condiciones exactas del programas. En JavaScript al igual que en el 98% de los
lenguajes se realiza con las sentencias if - else:
Aula Mentor
if (condición){
}else{
También se pueden volver hacer nuevas preguntas y encadenar estas sentencias las ve-
ces que necesitemos, usando la sentencia else if por ejemplo:
if (condición1){
318
//Acciones a realizar si la condición es verdadera
}else if(condición2){
if(a=b){
}else if (a<b){
}else{
M3. JQUERY
Para ello JavaScript, y la mayoría de los lenguajes nos ofrecen tres formas de ejecutar un
código un número de veces:
for
//acciones a realizar
Si nos fijamos en nuestro ejemplo, tenemos una expresión incial que es varC = 10, ini-
ciamos a 10 el contador, posteriormente preguntamos si cumple la condición ¿es varC=0?, y 319
miestras que no sea 0 vamos haciendo nuestras acciones, en nuestro caso sumar el valor del
contador, más el valor de la variable varC. Ésto se podría representar de la siguiente forma:
varD+= varC
Este ejemplo iría restando varC hasta llegar a varC = 0, cuando se cumpla la condición,
dejaría de utilizarse y pasaría a la siguiente rama. Normalmente, si ves código fuente de algún
lenguage, verás que casi siempre utilizan una variable para hacer los bucles, i o j, el nombre
es realmente lo de menos, pero lo que si se hace es declarar un nombre que sea sólo para los
bucles y una vez termine el bucle se elimina automáticamente, ésto es por el ámbito de las va-
riables que veremos en el apartado siguiente:
//Decrementando el valor de i
varD+= varC
}
Aula Mentor
//Aumentando el valor de i
varD+= varC
//Hay que darse cuenta que usamos “ , “ para las expresión inicial y “ ; “ para el siguiente bloque.
varD+= varC
while
Los bucles while es similar a la anterior, es más, siempre podemos elegir for o while
mientras se elija bien las expresiones iniciales y las condiciones finales, para ello debemos de-
clarar la expresion incial antes de la condición, la traducción de while y el uso sería:
320 mientras(condición){
//Acciones a realizar
En determinadas situaciones va a ser más conveniente usar while, podríamos decir que
el for, leyendo la cabecera sabemos el número de veces que se va a ejecutar el bloque, y while
estaría más indicado cuando no sabemos cuántas veces se va a ejecutar pero sí sabes cuando va
a salir del bucle, por ejemplo:
mientras(temperatura != valorSalida){
//Acciones a realizar
sube_temperatura;
else
baja_temperatura;
M3. JQUERY
Si te fijas después del if no he usado las llaves para abrir “ { “ y cerrar “ } “ ya que cuando
sólo hay una sentencia se puede omitir, mi consejo, por ahora, usarlo siempre para evitar erro-
res, y conforme te encuentres más cómodo programando ve haciendo pruebas.
var varC=10;
varD+=varC;
do-while
Los bucles do-while son muy parecidos a los bucles while, sólo que con este tipo de
bucle nos aseguramos que al menos ejecutamos una vez nuestro conjunto de acciones ya que
la condición la comprobamos al final y no al inicio.
do{
//Acciones a realizar
}while(condicion) 321
var varC=0;
do{
alert(‘Hola voy abrir una ventana al inicio y si todo va bien no aparezco más’);
}while(varC > 0)
Si te fijas antes de ejecutar el bucle, sabíamos que la condicón ¿es varC >0? Era falsa, pero
independientemente se ha ejecutado las sentencias que había dentro.
Como hemos visto anteriormente en los programas muchas veces declaramos variables
sólo para unas acciones, un contador para un bucle, o una función. El ámbito de las variables,
también llamado scope pueden ser de dos formas.
Global: Serán válidas desde cualquier parte del código, para ello sólo tenemos que de-
finirlas fuera de las funciones, y éstas se podrán usar desde cualquier sitio.
function muestraNombre(){
alert(nombre);
function muestraNombre(){
alert(nombre);
}
322
muestraNombre();
alert(nombre);
function muestraNombre(){
alert(nombre);
muestraNombre();
alert(nombre);
En este caso, la variable nombre está siendo visible y accesible desde dentro de la fun-
ción, aunque no hayamos declarado, como fuera de la misma.
Un ejemplo más para poner de manifiesto las variables globales y locales, usando los dos
ámbitos sería el siguiente:
M3. JQUERY
function muestraNombre(){
alert(nombre);
alert(nombre);
muestraNombre();
alert(nombre);
Mi nombre es Antonio
Aunque se defina una variable local con el mismo nombre, siempre prevalecerá la varia- 323
ble local a la global, por lo que debes tener cuidado ya que puedes tener un resultado totalmen-
te diferente, sólo por haber puesto var delante de la variable nombre dentro la función (error
común).
function muestraNombre(){
alert(nombre);
alert(nombre);
muestraNombre();
alert(nombre);
Mi nombre es Antonio
Aula Mentor
Mi nombre es Antonio
3.8. Arrays.
Los array son listas donde vamos almacenar elementos, por ejemplo, los nombres de los
alumnos de una clase, numerándolos desde el índice 0, pero ¡ojo!, no empiezan en el 1, sino el
0. Si queremos un arrays con 5 elementos, tendríamos que el primer elemento sería el 0 y último
en el 4:
0 Luis
1 María
2 Francisco
3 Emilio
4 Antonio
Para definir nuestro array/lista en JavaScript tendríamos que usar la siguiente sintaxis:
alert(miLista[3]);
3.9. Objetos.
[Objeto = Prototípo]{
[ Propiedad = Variable ]
M3. JQUERY
[ Método = Funcion ]
// Codigo
};
/* Codigo*/
this.nombre = nombre;
this.apellidos = apellidos;
this.edad = edad;
this.colorOjos = colorOjos;
Ya hemos creado un modelo para nuestra aplicación web que va a ser Persona, la cual va
a tener un nombre, apellidos y edad concreta, se podrían añadir todas las propiedades que qui-
sieramos. Si nos fijamos hemos usado this.propiedad, con ésto nos estamos refiriendo a este
elemento en concreto. Ahora para poder crearnos objetos de ese tipo, podemos usar la palabra
reservada new y el objeto que vamos a crear:
Y ya podemos hacer con la nueva Persona Antonio lo que quisieramos, mostrar mensaje,
calcular otros datos o por ejemplo mostrarlo por pantalla, para ello, nos creamos un párrafo con
un id llamada “textoSalida” y le agregamos los datos hemos creado:
Aula Mentor
document.getElementById(“textoSalida”).innerHTML =
“<br>Nombre : “+Antonio.nombre +
“<br>Apellidos : “ + Antonio.apellidos +
“<br>Edad : “+Antonio.edad +
Otro punto importante de usar objetos es que pueden contener cualquier tipo de valor:
un número, una cadena, un array, una función o incluso otro objeto. Podemos crear por tanto
en la definción del objeto todo lo que necesitemos para en un futuro poder usarlo, por ejemplo
vamos agregarle un método a nuestro objeto Persona donde nos devuelva el nombre completo,
el nombre más los apellidos:
this.nombre = nombre;
326
this.apellidos = apellidos;
this.edad = edad;
this.colorOjos = colorOjos;
function nombreCompletoPersona(){
this.nombreCompleto = nombreCompletoPersona();
document.getElementById(“textoSalida”).innerHTML =
“<br>Nombre : “+Antonio.nombre +
M3. JQUERY
“<br>Apellidos : “ + Antonio.apellidos +
“<br>Edad : “+Antonio.edad +
Antonio.nombreCompletoPersona();
Nos dará un error el script entero y si accedemos en modo depurador del navegador F12,
dentro de la pestaña Consola, tendremos el siguiente error:
327
Uncaught TypeError: undefined is not a function
Otra forma que también permite sería usar dentro del objeto la siguiente definición:
this.nombreCompleto2 = function () {
};
Y para acceder debemos usar corchetes en este caso, porque estaríamos accediendo a la
función y no a la propiedad:
Antonio.nombreCompleto2();
Este error es difícil de detectar y aunque a veces el navegador en modo depurador nos
da información si pulsamos en la pestaña consola, otras veces hay que revisar y ser muy metó-
dico en la programación, sino en grandes proyectos será muy difícil detectar donde se ha pro-
ducido el error.
Persona.prototype.nombreCompleto3 = function () {
};
Y para acceder a ella, podemos hacerlo como en el caso anterior con el doble corchete
después del nombre asignado ().
Antonio.nombreCompleto3();
Pero no sólo podemos agregar métodos a nuestros objetos creados, podemos hacerlo
también a funciones propias de JavaScript, como por ejemplo:
Array.prototype.contarRepetidos = function(palabraBuscada){
var contador = 0;
if(this[i] == palabraBuscada)
328 contador++;
};
return contador;
document.getElementById(“textoSalida2”).innerHTML = “Lista : “;
document.getElementById(“textoSalida2”).innerHTML+= miLista[i];
document.getElementById(“textoSalida2”).innerHT-
ML+=” , “;
};
M3. JQUERY
document.getElementById(“textoSalida2”).innerHTML+=
http://www.netmarketshare.com/browser-market-share.aspx?qprid=2&qpcustomd=0
En el gráfico se muestra que a día de hoy, sigue siendo el navegador más usado y no hay
ningún navegador que supere la cuota de éste y más de un 20% sobre el mercado creo que es
importante como para tenerlo en cuenta, y lo que es peor, un navegador tan antiguo como es
Internet Explorer 6.0 tiene una cuota del 4.08% que es muy superior a otros navegadores más
actuales como es FireFox.
Se ha decidido por tanto basarnos todo el curso en la última versión que soporta a esos
navegadores lo máximo posible la 1.11.1, pero ¡ojo! lo máximo posible, puede ser que haya ca-
sos excepcionales que tengamos problemas.
De todas formas, a lo largo del curso iremos haciendo pruebas con la última versión
y veremos los resultados obtenidos. Y si han sacado alguna versión posterior a la 1.11.1 en la
sección de recursos del curso tendrás la misma versión para que no tengas problemas.
Esta versión está pensada para programadores, y por eso está uncompressed, ya que esta
versión viene con documentación, comentarios de código, y está tabulada para su fácil lectura. Si
elegimos la versión compressed estaría sin ningún comentario, ni tabulada y ocuparía lo mínimo
posible para agilizar nuestro navegador, esta versión es la que debemos descargar cuando vaya-
mos a poner online nuestra web, y mientras trabajamos, por si tenemos alguna duda, usamos la
versión de desarrollador o descomprimida.
331
Versión tabulada y comentada. Etc. Tamaño 277KB
Para poder usar este archivo jQuery sólo tenemos que añadirlo a nuestro archivo HTML
en el <head></head> pero para enlazarlo usaremos la siguiente sentencia, si el archivo que nos
hemos bajado se llama jquery-1.11.1.js:
Pensamos que queremos hacer una aplicación donde vamos a tener tres botones y que
dependiendo de donde haga click el usuario nos muestre un texto u otro.
Aula Mentor
¿Cómo harías esto con HTML5 y CSS3? Este es un ejemplo muy sencillo y aunque haya-
mos usado funciones de JavaScript, realmente por si solo, no podríamos hacer ésto. Tienes la
solución en el siguiente link:
<!DOCTYPE html>
<html lang=”es”>
<head>
</head>
<body>
<header>
</header>
<nav>
</nav>
<section>
<article>
</article>
<article>
<form>
</form>
<article>
</section>
<footer>
</footer>
</body>
333
</html>
¿Qué hay de nuevo en este código? Bueno, asignar un id a un párrafo, lo hemos reali-
zado muchas veces, le hemos asignado al párrafo un texto cualquiera para mostrar que se está
iniciando:
Y posteriormente lo que vamos hacer es que cuando el usuario haga onclick sobre el
botón, voy a usar la función html() y le voy a pasar un texto, en concreto con la opción que ha
elegido.
334
Volviendo al código del ejercicio, analicemos un poco más la sentencia que hemos usa-
do:
$(‘#mensaje’)
Posteriormente vamos a usar una función que puede agregar texto HTML en donde esté
la etiqueta, por ejemplo si usamos .html(textoHtml), añadiremos al párrafo en este caso, el
texto que hemos seleccionado, html(‘Ha elegido la opción …’) por eso, sustituye el texto que
había antes en la etiqueta y nos muestra el que hemos seleccionado con la función.
M3. JQUERY
Si no has entendido muy bien este último párrafo no te preocupes, se ha usado para que
podamos probar nuestro primer ejercicio de jQuery, y corresponde algunas funciones a leccio-
nes futuras, se ha usado para poder ver cómo interactuamos con el documento. Ahora lo que
importa es que sepas cómo debes llamar a tu fichero jquery desde tu fichero HTML y más ade-
lante iremos viendo más ejercicios y volveremos a retomar la edición del texto dinámicamente
entre otras muchas cosas más.
Si recuerdas en JavaScript vimos unos métodos para acceder a los elementos del docu-
mento (DOM), getElementById Y getElementByTagName, etc. Con jQuery se han transformado
para poder acceder a los mismos elementos pero de una forma más sencilla, por tanto tendría-
mos los siguientes selectores:
Al igual que en CSS3 cuando queremos acceder al identificador podemos hacerlo lla-
mándo directamente sobre las etiquetas que queremos actuar:
335
$(“etiqueta”)
Por ejemplo si queremos acceder a la etiqueta lista, seleccionando todas las etiquetas del
documento que sean listas no ordenadas, podíamos usar la siguiente sintaxis:
$(“ul”)
Para seleccionar los identificadores de nuestra web, podemos usar el caracter #, y al igual
que pasaba en CSS3 debes recordar que debe existir sólo una definición del identificador, en
caso que existan más, no se aplicarán a todas, sino como vimos en CSS3 a la primera etiqueta
que encuentre al leer el documento.
$(“#identificador”)
Imagina que has creado un identificador llamado miboton, tendremos que usar la si-
guiente sintaxis para seleccionarlo:
$(“#miboton”)
Para seleccionar nuestra clases definidas en nuestro documento podemos usar el selector
de clase de jQuery, y éste si puede estar definido en varios sitios del documento:
Aula Mentor
$(“.clase”)
Si tenemos una clase que se llama ocultarme y queremos seleccionar todos los elemen-
tos que tengan esa clase, podremos usar:
$(“.ocultarme”)
<p>Dependiendo de que botón eligas, se ocultarán varios o todos los elementos de la lista </p>
<ul>
<li>Elemento 2</li>
</ul>
Clase: ocultame
Veamos un ejemplo completo y sólo adelantaremos una propiedad que podemos usar
sobre las etiquetas HTML que es para ocultar una etiqueta seleccion.hide() o para mostrar selec-
cion.show(). Más adelante veremos muchos más métodos y eventos; ahora centrémonos en la
selección de elementos.
1. <script type=”text/javascript”>
2. $(document).ready(function(){
3.
4. $(“#muestraLista”).click(function(){
M3. JQUERY
5. $(“ul”).show();
6. $(“.ocultame”).show();
7. });
8. $(“#ocultaLista”).click(function(){
9. $(“ul”).hide();
10. });
11. $(“#ocultaItems”).click(function(){
12. $(“ul”).show();
13. $(“.ocultame”).hide();
14. });
15.
16. });
Las líneas 1 y 17 es la forma de decir al navegador que vamos a insertar texto de tipo
javascript o jQuery, aunque se puede omitir y dejar exclusivamente con <script></script>.
La línea dos es una de las principales y más importantes de jQuery, ya que en ella, esta-
mos diciendo que hasta que no se lea el documento no esté accesible el script, ésto es porque si
una página no ha terminado de cargar los elementos y nosotros en nuestro script, seleccionamos
una etiqueta que no está, y a lo mejor toda nuestra aplicación o parte depende de ese elemento
o etiqueta, fallará y el usuario no comprenderá que ha pasado.
Esta forma de llamar al documento, se puede decir de varias formas, por si en algún ma-
nual o documentación lo encuentras definido de otra forma, ten presente que son otras formas
de decir lo mismo:
$(function(){
});
Pruébalo y ya verás como cuando termine de cargar el documento aparece una ventana
emergente indicándote el mensaje. De todas formas, aún existiendo esta función abreviada, te
recomiendo que al inicio uses la otra denominación.
Aula Mentor
En las líneas 4, 8 y 11 estamos usando el selector de identificador (ID) que hemos asig-
nado a cada botón, y una vez que lo hemos seleccionado podemos interactuar con él, en este
caso, hemos aplicado el evento .click y creamos una función para ocultar o mostrar el elemento
según me interese.
En las líneas 5,9 y 12 estamos usando un selector de etiqueta, en este caso el de la lista
<ul> y dependiendo de nuestro programa, mostramos o ocultamos el contenido.
En las líneas 6 y 13 estamos usando un selector de clase, llamando a todos los elementos
que tiene esa clase asignada, como son los ítems 1 y 3 de la lista definida en el HTML.
Bien, ahora es cuando tenemos que hacer nuestro algoritmo para interactuar con los
elementos web según queramos. ¿Qué queremos hacer? ¿Cómo nos planteamos el ejercicio?. El
80% de todo el trabajo en los algoritmos es el análisis del programa, los parámetros de entrada
que vamos a tener y cuál es la mejor forma de procesar los datos y hacer sobre todo lo que
tengamos planeado. El resto, es como se suele decir en el argot “teclear código”.
Una vez entendido la idea de que son los selectores, y habíendonos parado en los más
comunes, entendiendo que es una forma de filtrar, seleccionar las etiquetas y elementos de un
documento html, vamos a exponer los selectores más comunes en jQuery y aunque se repiten
las tres iniciales, los adjuntos todos en una tabla y seguidos para que los tengas todos centrados
y te sea fácil buscar el selector o filtro que necesites en cada situación:
338
Selector Ejemplo Conjunto de elementos o
acción
* $(“*”) Todos los elementos
#id $(“#identificador”) El elemento con identificador
id=”identificador”
.class $(“.miclase”) Todos los elementos con
que pertenezcan a la clase
class=”miclase”
.class,.class $(“.miclase1,.miclase2”) Todos los elementos con la
clase “miclase1” o “miclase2”
element $(“p”) Todas los elementos de la eti-
queta HTML <p>
el1,el2,el3 $(“h1,div,p”) Todos los elementos que ten-
gan las siguiente etiquetas
<h1>, <div> y <p>
parent > child $(“div > p”) Todos los elementos <p> que
son un hijo directo de un ele-
mento <div>
parent descendant $(“div p”) Todos los elementos <p> que
son descendientes de un ele-
mento <div>
element + next $(“div + p”) El elemento <p> que están al
lado de cada uno de los ele-
mentos <div>
Aula Mentor
$(“:root”).css(“background-
color”,”blue”);
:lang(language) $(“p:lang(es)”) Todos los elementos <p> con
un valor de atributo lang co-
menzando con “es”
342 Como puedes ver, hay muchas formas de seleccionar y cambiar los elementos de forma
masiva, selectiva o jerárquica. Como ya hemos visto en CSS3 una vez que tenemos el elemento
correcto aplicamos las propiedades que queremos a ese elemento, aquí podemos hacer exac-
tamente lo mismo e incluso como veremos en apartados posteriores aplicar estilos CSS desde
jQuery. Eso no quiere decir que lo sustituye, en absoluto, lo complementa, al poder modificar
las propiedades dinámicamente, podrías por ejemplo cambiar de fondo o de color de letra cada
segundo, ocultar elementos o mostrar elemento como en el ejemplo 4 de la lista.
Existen muchos selectores que están indicados, o mejor dicho, se suelen usar para deter-
minados componentes de la web, uno muy útil es el de los formularios, donde tenemos acceso
a <input type=”text”… type=”button”…etc, con él podemos seleccionar todos los elementos y
tratar dinámicamente el texto que está introducciendo. Otros elementos están muy indicados
para las tablas, :first, :last, :even, :odd, que podríamos decir: la primer fila de la tabla (cabecera),
la última (resumen de tabla), las filas pares de un color y las filas impares de otro.
Hay un punto muy importante que poco a poco debes de ir comprendiendo, para sa-
carle realmente el partido a HTML5, CSS3 y jQuery; has de hacer un estudio y diseño previo
concienzudo, es más, incluso no debemos dejar de lado usar eficazme los nombres, y me refiero
a nombres lógicos que en un futuro me pueden ayudar, por ejemplo:
Tenemos un menu horizontal, un menu lateral y un menu inferior, si usamos los nombres
de clase o identificador, por ejemplo, en vez de usar:
<div id=”horizontal”>…</div>
Y si estamos usando un tipo de letra concreto para los menús, o un estilo concreto, po-
dríamos hacer uso del selector $(“[div|=’menu’]”) y podemos acceder de golpe a los elementos
anteriores y una vez seleccionados aplicar las propiedades o acciones que tengamos pensadas.
Si el nombre no hubiera sido precedido por la palabra menu, se podría hacer, pero tendríamos
que ir uno por uno, que al final es más líneas de código, más complejo, más posibilidad de error
y peor para futuros cambios.
6. Eventos.
El usuario tiene varias formas de interactuar con las aplicaciones web, y jQuery tiene
muchos mecanismos para facilitar que sean dinámicas y respondan a cierto eventos. También se
podría usar JavaScript, como hemos dicho anteriormente, jQuery es un motor que usa en defini-
tiva JavaScript sólo que remodelado para facilitar el trabajo al desarrollador. Veamos los eventos
que disponemos en jQuery, para ello vamos a ver eventos referidos a varios actores respecto a
nuestro documento:
343
Evento .click()
Descripción Enlaza un controlador de eventos para el
evento “click” con JavaScript o desencadena
ese evento en un elemento.
Ejemplo $(“miseleccion”).click(function(){
//Mis acciones
});
Evento .dblclick()
Descripción Enlaza un controlador de eventos para el
evento “dobleclick” con JavaScript o desenca-
dena ese evento en un elemento.
Ejemplo $(“miseleccion”).dblclick(function(){
//Mis acciones
});
Aula Mentor
Evento .focusout()
Descripción Enlaza un controlador de eventos al evento
“focusOut” de JavaScript. Este evento se dis-
para cuando el elemento pierde el foco, por
ejemplo en un formulario cuando estamos en
un campo y le damos al tabulador para pasar
al siguiente campo, este llamaría al evento .fo-
cusout.
Ejemplo $(“miseleccion”).focusout(function() {
//Mis acciones
})
Evento .hover()
Descripción Enlaza uno o dos controladores a los elemen-
tos coincidentes, y se ejecutará cuando el pun-
tero del ratón entra y sale de los elementos.
Ejemplo $(“miseleccion”).hover(function() {
//Mis acciones
344
})
Evento .mouseup()
Descripción Enlaza un controlador de eventos al even-
to “mouseup” de JavaScript. Este se activará
cuando se ha presionado el ratón al soltar la
presión sobre el ratón.
Ejemplo Bind an event handler to the “mouseup” JavaS-
cript event, or trigger that event on an element.
Evento .mousedown()
Descripción Enlaza un controlador de eventos al evento
“mousedown” de JavaScript. Este se activará
cuando se ha presionado el ratón hasta llegar
a activar el click del ratón, (sin tener que soltar
la presión sobre el ratón este se activará).
M3. JQUERY
Ejemplo $(“miseleccion”).mousedown(function() {
//Mis acciones
})
Evento .mouseenter()
Descripción Enlazar un controlador de eventos para ser
disparado cuando el ratón entra en un ele-
mento, es muy similar al evento .hover, pero
no son iguales.
Ejemplo $(“miseleccion”). mouseenter(function() {
//Mis acciones
})
Evento .mouseleave()
Descripción Enlaza un controlador de eventos para ser dis-
parado cuando el ratón sale de un elemento.
Ejemplo $(“miseleccion”). mouseleave(function() {
})
Evento .mouseout()
Descripción Enlaza un controlador de eventos al evento
“mouseout” de JavaScript. Se activa cuando el
ratón sale fuera del elemento.
Ejemplo $(“miseleccion”). mouseout(function() {
//Mis acciones
})
Evento .mouseover()
Descripción Enlaza un controlador de eventos para el
evento “mouseover” de JavaScript. Se activa
cuando el ratón pasa por encima del elemento
Ejemplo $(“miseleccion”). mouseover (function() {
//Mis acciones
})
Aula Mentor
Evento .mousemove()
Descripción Enlaza un controlador de eventos al evento
“mousemove” de JavaScript. Se activa cuando
el ratón se mueve, además podemos sacar las
coordenadas del mismo.
})
Este evento asocia una función al evento “click” del ratón sobre los elementos de la
selección. Normalmente esta asociado a botones, pero pueden ser otros elementos ya que en
nuestra web muchas veces no todo es lo que parece y lo que parece que sea un botón, puede
ser una lista con unas propiedades determinadas, como vimos en los ejemplos de los menús.
Una forma para depurar errores, ya que suele ser muy común escribir el nombre equi-
vocado o no aplicarle el evento correcto es utilizar el modo depurador del navegador F12, pero
esta vez, si usamos Google Chrome, en la pestaña Elements, en el apartado de la derecha pin-
chamos en EventListener (Escuchadores de eventos) podremos comprobar que tenemos activo
M3. JQUERY
...
<article>
<ul>
<li>Elemento 1</li>
347
<li>Elemento 2</li>
<li>Elemento 3</li>
</ul>
</article>
...
Parte de jQuery
<script type=”text/javascript”>
$(document).ready(function(){
$(“#muestraLista”).click(function(){
$(“ul”).show();
Aula Mentor
});
$(“#ocultaLista”).click(function(){
$(“ul”).hide();
});
$(“.cambiacolor”).click(function(){
$(“.cambiacolor”).css(“color”,”blue”);
else
348 $(“.cambiacolor”).css(“color”,”red”);
});
</script>
<style type=”text/css”>
.cambiacolor{
color: red;
</style>
Conforme vayamos haciendo click en el párrafo, obtendremos un color, rojo o azul, se-
gún el color actual del texto.
M3. JQUERY
Podemos capturar el evento “doble click” sobre algún elemento HTML, similar a click,
pero esta vez tendremos que usar dos click seguidos, siguiendo con el ejemplo anterior podría-
mos tener:
<hr>
<p class=”cambiacolor2”>Soy un párrafo y si haces dos clicks sobre mí cambio de color </p>
Código jQuery
$(document).ready(function(){
$(“.cambiacolor2”).dblclick(function(){
(“.cambiacolor2”).css(“color”,”blue”);
else
$(“.cambiacolor2”).css(“color”,”red”);
});
});
Puede resultar un poco confusa las definiciones sobre los eventos del ratón que hemos
comentado anteriormente. Para aclarar ésto, puedes usar el siguiente ejemplo para entender
cómo se comporta nuestra aplicación con los eventos del ratón, aunque agregaré el código, te
recomiendo que empieces por ejecutar el archivo en tu ordenador y posteriormente leer el có-
digo.
En el html tendríamos:
….
350
<article>
<br><hr><br>
<br><hr><br>
<p>Mueve tu ratón</p>
<p>0</p>
</div>
<p>Mueve tu ratón</p>
M3. JQUERY
<p>0</p>
</div>
</article>
….
Y en el jQuery:
var i = 0;
$(“div.overout”)
.mouseover(function() {
})
351
.mouseout(function() {
});
var n = 0;
$( “div.enterleave” )
.mouseenter(function() {
})
.mouseleave(function() {
});
Aula Mentor
Con este evento capturamos la posición exacta del usuario de nuestro ratón y podemos
obtener los valores numéricos respecto al documento y la ventana del cliente. Supongamos que
tenemos una caja donde vamos a detectar la posición exacta del ratón:
<p>EVENTO: mousemove, fíjate que los valores even.page y even.client no coincide, reduce el tamaño de
la ventana y comprueba como afectan los valores</p>
<br><hr><br>
<p>
<span> </span>
</p>
<div id=”detectaRaton”></div>
...
En el fichero CSS:
#detectaRaton {
width: 400px;
M3. JQUERY
height: 400px;
background: blue;
En el jQuery tendríamos:
...
$(“#detectaRaton”).mousemove(function( event ) {
});
...
Otro evento que podemos capturar del usuario de nuestra web es cuando en un click ha
pulsado y soltado la tecla. Debemos pensar que cuando hacemos click en cualquier link real-
mente ocurren dos eventos:
...
<br><hr><br>
<br><hr><br>
<p class=”textoMouseUpDown”>Haz click sobre este cuadrado y comprueba en qué momento esta el “click”
del ratón</p>
<div id=”controlClick”></div>
...
#controlClick{
width: 200px;
height: 200px;
354
background-color: blue;
...
});
});
...
M3. JQUERY
Evento .focusout()
Descripción Enlaza un controlador de eventos al evento
“focusOut” de JavaScript. Este evento se dis-
para cuando el elemento pierde el foco, por
ejemplo en un formulario cuando estamos en
un campo y le damos al tabulador para pasar
al siguiente campo, éste llamaría al evento .fo-
cusout.
Ejemplo $(“miseleccion”). focusout(function() {
//Mis acciones
})
Evento .keydown()
Descripción Enlaza un controlador de eventos al evento
“keydown” de JavaScript, parecido al evento
.mousedown pero esta vez en el teclado.
Ejemplo $(“miseleccion”). keydown(function() {
//Mis acciones
355
})
Evento . keyup()
Descripción Enlaza un controlador de eventos al even-
to “keyup” de JavaScript, parecido al evento
.mouseup pero esta vez en el teclado.
Ejemplo $(“miseleccion”). keyup(function() {
//Mis acciones
})
Evento . keypress()
Descripción Enlaza un controlador de eventos al evento
“keypress” de JavaScript. Este evento se acti-
vará cuando ocurra el keyup y keydown en el
mismo evento, por ejemplo, si pulsamos una
tecla en un campo de un formulario y nos va-
mos a otro campo con el ratón (sin soltar la
tecla y si no repite la tecla en tiempo) no se
llamará a este evento.
Aula Mentor
//Mis acciones
})
Ejemplo .focusout()
356
Tendríamos en el html:
...
<div class=”unaCaja”>
<h3>.focusout()</h3>
<h5>Ve pasando de un a otro campo ya sea con el TAB o con el ratón y captura el evento
.focusout()</h5>
<label>Nombre</label>
<label>Apellidos</label>
<label>Teléfono</label>
</div>
...
En el CSS:
.unaCaja{
width: 250px;
height: 250px;
border-width: 1px;
border-style: solid;
text-align: right;
h3, h5{
text-align: center;
$(document).ready(function(){
var focus = 0;
$( “.misInput” )
.focusout(function() {
focus++;
});
<div class=”unaCaja”>
<h3>.keypress(),.keyup(),.keydown()</h3>
<h5>Escribe una letra o varias, pero observa el Orden y el número de veces que se
activa.</h5>
<label>Nombre</label>
<label>Apellidos</label>
<label>Teléfono</label>
</div>
...
$(document).ready(function(){
var keypress = 0;
var keydown = 0;
var keyup = 0;
var posicion = 0;
$( “.misInput” )
.keydown(function() {
posicion++;
keydown++;
359
})
.keypress(function() {
posicion++;
keypress++;
})
.keyup(function() {
posicion++;
keyup++;
Debes fijarte que podemos “escuchar” diferentes eventos sobre el mismo selector, en este
caso, para ahorrar código se puede usar seguidos uno detrás del otro, y finalizaremos cuando
pongamos el punto y coma. Es un fallo típico poner el “;” antes y no se ejecutarán las capturas de
eventos que hayamos declarado a continuación, deberemos declarar nuevamente el selector $(
“seleccion” ).evento en el mejor de los casos, pero lo normal es que nos dé un error de Script
y no funcionará nada de ese bloque.
Te aconsejo que hagas la siguiente prueba, cambia el “;” que hay al final del evento .ke-
yup e insertalo en el evento anterior key.
.keypress(function() {
posicion++;
keypress++;
360 .keyup(function() {
posicion++;
keyup++;
Incluso nos dice más, a la derecha nos dirá el nombre del archivo y la línea donde ha co-
menzado a tener el error o ha detectado un error de patrón, en este caso, ha detectado el token
. que para el navegador es que ha terminado de leer los eventos y no entiende a qué elemento
le estamos escuchando el evento, ya que no corresponde con la sintaxis correcta $( “seleccion”
).evento.
Podemos saber cuándo ha pulsado o escrito un carácter el usuario, y también podemos saber el
número de caracteres que tiene un campo, podremos pasar al siguiente campo cuando se haya
rellenado, por ejemplo el dni o número de teléfono tiene un número fijo de caracteres, cuando
M3. JQUERY
lleguemos a su tope, podemos pasar al siguiente campo, ahorrando al usuario incluso que tenga
que pulsar el tabulador TAB.
Otro de los eventos que nos son muy útiles en nuestras páginas web es el control sobre
los formularios, es decir, escuchar y detectar los estados diferentes del formulario y poder inte-
ractuar con ellos una vez que el usuario los ha lanzado.
Evento .blur()
Descripción Enlaza un controlador de eventos al evento
“blur” de JavaScript, El evento blur se dispa-
ra cuando pierde el foco de control. Indica-
do para los formularios: text, textarea, button,
checkbox, fileupload, password, radio, reset y
submit.
Ejemplo $(“miseleccion”). blur(function() {
//Mis acciones
})
361
Evento .change()
Descripción Enlaza un controlador de eventos al evento
“change” de JavaScript, Con este envento po-
dremos detectar entre otras cosas cuando el
usario ha cambiado el estado de alguna selec-
ción multiple.
Ejemplo $(“miseleccion”). change(function() {
//Mis acciones
})
Evento .focus()
Descripción Enlaza un controlador de eventos al evento
“focus” de JavaScript, detectando cuándo el
elemento en cuestión tiene el foco del nave-
gador.
Ejemplo $(“miseleccion”). focus(function() {
//Mis acciones
})
Aula Mentor
Evento .focusin()
Descripción Detectaría cuándo el elemento ha cogido el
foco del navegador.
Ejemplo $(“miseleccion”). focusin(function() {
//Mis acciones
})
Evento .select()
Descripción Enlaza un controlador de eventos al evento
“select” de JavaScript, detectando si el usuario
ha realizado alguna selección en el formulario
Ejemplo $(“miseleccion”). select(function() {
//Mis acciones
})
Evento .submit()
Descripción Enlaza un controlador de eventos al evento
“submit” de JavaScript, detectando cuándo el
362 usuario ha realizado submit en un formulario.
Este evento es muy utilizado para confirmar
y detectar si el usuario ha rellenado correcta-
mente los datos de un formulario, por ejemplo,
no lo dejaremos pasar hasta que haya escrito
el texto, Entiendo y acepto las condiciones.
Ejemplo $(“miseleccion”). submit(function() {
//Mis acciones
})
Debido a las similitudes de algunos métodos, vamos a realizar un ejemplo, donde los
vamos a enfrentar y ver, qué elemento se coge antes y en qué momento correcto se activaría.
FocusIn se activa justo al inicio de coger el foco del elemento cuando estamos en un
campo de texto, pero si se trata de un elemento dentro de otro, el elemento padre, tomará el
focusIn, pero nunca cogerá el focus, lo hará el elemento hijo. Para ello, fíjate en el ejemplo
que hay dos partes, una donde se muestra los eventos que hay cuando nos movemos dentro
de nuestro formulario, y otra donde mostramos los valores respecto del div. Es muy importante
tener claro ésto porque podemos detectar que dependiendo del caso, nunca se llega a ejecutar
el evento que deseamos sobre el elemento.
M3. JQUERY
...
<div class=”unaCaja”>
<h3>.focusout() vs .blur</h3>
<h5>Ve pasando de un a otro campo ya sea con el TAB o con el ratón y capta el evento
.focusout()</h5>
<label>Nombre</label>
<label>Apellidos</label>
<label>Teléfono</label>
</div>
...
Respecto al jQuery
$(document).ready(function(){
var focusout = 0;
var focusin = 0;
var blur = 0;
var midivfocus = 0;
var midivfocusout = 0;
var midivfocusin = 0;
var midivblur = 0;
M3. JQUERY
var midivposicion = 0;
var posicion = 0;
$( “.misInput” )
.focus(function(){
$(this).css(“background-color”,”lime”);
posicion++;
focus++;
})
.focusout(function(){
$(this).css(“background-color”,”#ffffff”);
posicion++; 365
focusout++;
})
.focusin(function(){
posicion++;
focusin++;
})
Aula Mentor
midivfocusout++;
})
.focusin(function(){
$(this).css(“background-color”,”#FFFFCC”);
midivposicion++;
midivfocusin++;
})
.blur(function(){
$(this).css(“background-color”,”blue”);
366 midivposicion++;
midivblur++;
});
Y como CSS:
M3. JQUERY
.unaCaja{
width: 270px;
height: 360px;
border-width: 1px;
border-style: solid;
border-color: blue;
text-align: right;
margin-top: 30px;
h3, h5{
text-align: center;
Vamos a ver un ejemplo usando los tres eventos, change, submit y select, ambos muy
usuales en los formularios, como son un select con varias opciones, donde mostraremos si ha
existido algún cambio de la selección original, además tendremos un textarea donde obligare-
mos al usuario a que escriba un texto concreto “He leido y acepto las condiciones” muy útil para
los formularios que requieran confirmar que el usuario ha leído y acepta las condiciones. Por
último comprobaremos que todo está correcto y si es así, enviaremos el formulario, en nuestro
caso, mostraremos un alert indicando al usuario que se va a enviar el formulario.
<div class=”unaCaja”>
<label>Nombre</label>
<br>
<br>
<option>HMLT5</option>
<option selected=”selected”>CSS3</option>
<option>JQUERY</option>
368 </select>
<p id=”textoSalida1”></p>
<br>
</form>
<p id=”textoSalida2”>Debes escribir que aceptas las condiciones para continuar y escribir tu
nombre</p>
</div>
En el CSS tendríamos:
M3. JQUERY
.unaCaja{
width: 270px;
height: 400px;
border-width: 1px;
border-style: solid;
border-color: blue;
text-align: right;
margin-top: 30px;
select{
width: 250px;
369
h3, h5{
text-align: center;
Y en el jQuery:
$(document).ready(function(){
//----------------------------------------------------------------------
$(“div”)
.focusout(function(){
$(this).css(“background-color”,”white”);
})
Aula Mentor
.focusin(function(){
$(this).css(“background-color”,”#FFFFCC”);
});
//----------------------------------------------------------------------
$( “select” )
.change(function () {
});
});
//----------------------------------------------------------------------
if ( $( “#condiciones” ).val() === “He leido y acepto las condiciones” && ($( “#txtNombre” ).val().
length > 0)) {
return;
}
M3. JQUERY
$( “#textoSalida2” ).text( “Repito: Debes escribir ‘He leído y acepto las condiciones’ para continuar
y escribir tu nombre” );
event.preventDefault();
});
En este caso hemos usado varias cosas nuevas, una muy importante y que se va a usar
mucho cuando tengamos varias opciones, o mejor dicho un conjunto de datos devuelto, como
es el caso de la selección múltiple es la función .each, donde iterará con cada uno de los ele-
mentos devueltos. Ésto se suele usar mucho para iterar cuando se realiza una selección amplia
de elementos en jQuery y queremos iterar por ellos.
Otro elemento nuevo usado es event.preventDefault() que veremos más adelante pero
adelantamos que lo podemos usar cuando deseamos cancelar o evitar el comportamiento por
defecto del navegador frente a un determinado evento, como en este caso para el formulario.
También tenemos un evento que nos informa que se ha leído correctamente el docu-
mento y a partir de ese momento podremos hacer nuestros acciones con jQuery. Realmente ya 371
lo hemos usado anteriormente, sería el evento:
.ready()
Mostrábamos una alerta indicando al usuario que ya se había leído el documento y po-
díamos trabajar con él, en esta ocasión vamos a mostrar un texto para ser menos intrusivos y
hacer una navegación más fluida. Sólo tendremos que hacer lo siguiente:
$( document ).ready(function() {
$( “p” ).text( “El DOM ha sido cargado y ahora podemos trabajar con él.” );
});
..
<body>
</body>
..
Es posible que veas por internet otros métodos asociados al documento .load y .unload, estos
métodos han sido decrapted a partir de las versión 1.8, por lo que no debes usarlo y aún menos
si usas la versión 2.x.
Evento .resize()
Descripción Enlaza un controlador de eventos al evento
“resize” de JavaScript, detectando cuando el
usuario ha realizado un cambio de tamaño de
la ventana del navegador
Ejemplo $(“miseleccion”). resize(function() {
372
//Mis acciones
})
Evento .scroll()
Descripción Enlaza un controlador de eventos al evento
“scroll” de JavaScript, detectando cuando el
usuario ha interactuado con el scroll
Ejemplo $(“miseleccion”). scroll(function() {
//Mis acciones
})
Ejemplo .resize()
Supongamos que necesitamos saber el tamaño actual que tiene el navegador del usuario
o si ha redimensionado el tamaño del mismo, podríamos usar el evento .resize() para tal acción:
M3. JQUERY
<p id=”tam”><p>
373
Y en el archivo jQuery:
$( window ).resize(function() {
});
Ejemplo .scroll()
Vamos hacer un pequeño script para detectar cuando el usuario ha usado el scroll, para
ello vamos a escribir varios párrafos y vamos a cambiar el tamaño de la ventana, para forzar que
aparezca el scroll por la cantidad. Una vez que se active, cuando movamos éste, pondremos un
detector.
...
<div>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
...
En el CSS:
374 span {
color: red;
display: none;
font-size: 18px;
$( window ).scroll(function() {
});
El objeto Event es pasado a todos los eventos que se lanzan, y como era de esperar, al
igual que en los otros eventos podemos usar algunos atributos que nos van a venir muy bien
para nuestras aplicaciones web.
M3. JQUERY
Atributo .event.currentTarget
Descripción Devuelve el elemento actual sobre el que se
ha lanzado el evento. Muy parecido al this en
la Programación Orientada a Objetos.
Ejemplo $( “p” ).click(function( event ) {
});
Ejemplo10-event/index.html#event.cu-
rrentTarget
Resumen En este ejemplo, seleccionaríamos el párrafo y
cuando hagan click sobre el, comprobamos si
el atributo event.currentTarget es igual al ob-
jeto this, el cual nos da true, por lo que pode-
mos referirnos a él de ambas formas.
375
Atributo .event.data
Descripción Devuelve los datos que hayamos podido pasar
al evento cuando se asocia con .bind. (En el
siguiente apartado vemos el evento .bind)
Aula Mentor
Ejemplo …..
…..
$(“.misParrafos”).each(function(i){
$(this).on(“click”,{x:i},function(event){
});
});
…..
…..
Ejemplo10-event/index.html#event.data
M3. JQUERY
<ul>
<li>Elemento 2</li>
<li>Elemento 3</li>
<li>Elemento 4</li>
</ul>
$(document).ready(function() {
$(‘ul li’).click(function() {
var i = $(this).index();
Aula Mentor
});
});
Atributo .event.preventDefault()
Descripción Como hemos usado en varias situaciones (for-
mularios, ondragover…) si llamamos a este
método dentro de un evento, la acción pre-
determinada que se ejecutaría será cancelada.
Ejemplo ….
….
event.preventDefault();
378
$( “<div>” )
.appendTo( “#log” );
});
….
….
<div id=”log”></div>
….
….
Ejemplo10-event/index.html#event.preven-
tDefault
M3. JQUERY
Atributo .event.isDefaultPrevented()
Descripción Devuelve true o false si ha sido lanzado el
método preventDefault() o no.
Ejemplo ….
….
$( “#esMipreventDefault” ).click(function(
event ) {
event.preventDefault();
379
alert( “No he abierto el enlace sino una venta-
na: El valor de isDefaultPrevented es: “ event.
isDefaultPrevented() ); // true
});
….
….
Ejemplo10-event/#event.isDefaultPrevented
Aula Mentor
Atributo .event.stopPropagation()
Descripción Previene que se ejecute cualquier evento que
pudiera estar asociado a los padres del ele-
mento dentro del árbol DOM. Muy útil para
evitar las propagaciones jerárquicas entre ele-
mentos del evento en cuestión.
380
M3. JQUERY
Ejemplo ….
….
<a name=”event.stopPropagation”></a>
<h3><a href=”#event.stopPropagation”>event.
stopPropagation (Activado en el div)</a></
h3>
<div id=”midiv”>
</p>
</div>
….
381
….
$(“#mispan”).click(function(event){
event.stopPropagation();
});
$(“#mip”).click(function(event){
});
Aula Mentor
$(“#midiv”).click(function(){
});
Ejemplo10-event/#event.stopPropagation
382
Atributo .event.isPropagationStopped()
Descripción Devuelve si el método anterior stopPropaga-
tion() ha sido llamado.
M3. JQUERY
Ejemplo ….
….
<button id=”mibutton”>Púlsame</button>
<div id=”midiv3”></div>
….
….
function estaParadaLaPropagacion(
event ) {
if ( event.isPropagationStop-
ped() ) {
} else {
$( “#mibutton” ).click(function(event) {
estaParadaLaPropagacion( event );
event.stopPropagation();
Aula Mentor
$( “#mibutton” ).click(function(event) {
estaParadaLaPropagacion( event );
event.stopPropagation();
estaParadaLaPropagacion( event );
});
Ejemplo ….
http://localhost/MOD3.JQUERY/U6/Ejem-
plo5-eventos-mouse/
….
Resumen Ejemplo visto anteriormente, donde obtene-
mos las coordenadas del ratón dentro de un
rectángulo azul.
Atributo event.stopImmediatePropagation()
Descripción Previene que se ejecuten otras acciones que
estén asociadas al evento.
Ejemplo ….
…. 385
….
$(“#midiv4”).click(function(event){
event.stopImmediatePropagation();
});
$(“#midiv4”).click(function(event){
….
});
$(“#midiv4”).click(function(event){
Aula Mentor
$(“#mip4”).click(function(event){
});
$(“#mip4”).click(function(event){
event.stopImmediatePropagation();
});
Resumen En este ejemplo vamos a usar dos veces el
evento en situaciones diferentes para com-
386 prender mejor su funcionamiento. Vamos a
tener un identificador midiv4 que vamos a
llamar varias veces con el evento .click, vere-
mos que si tenemos comentada la llamada al
evento event.stopImmediatePropagation(); se
ejecutarán los tres eventos seguidos uno de-
trás de otro y en ese orden. Si en el prime-
ro realizo event.stopImmediatePropagation();
solo se ejecutará el primer click. Si lo pongo
en el siguiente click se ejecutará hasta ahí.
Atributo .event.isImmediatePropagationStopped()
Descripción Devuelve si el método anterior stopImmedia-
tePropagation() ha sido llamado.
M3. JQUERY
Ejemplo ….
….
<button id=”mibutton5”>Púlsame</button>
<div id=”midiv5”></div>
….
….
function estaParadaLaPropagacionIn-
mediata( event ) {
if ( event.isImmediatePropaga-
tionStopped() ) {
} else {
$( “#mibutton5” ).click(function(event)
{
estaParadaLaPropagacionInmediata( event );
event.stopImmediatePropagation();
Aula Mentor
estaParadaLaPropagacionInmediata(
event );
});
Atributo .event.target
Descripción Se refiera al elemento DOM que inició el
evento
388
M3. JQUERY
Ejemplo ….
….
<div id=”midiv6”>
<p id=”mip6”>
<span id=”mispan6”>Soy
una etiqueta un span
</span>
</strong>
</p>
</div> 389
….
….
});
Atributo .event.timeStamp
Descripción Número en milisegundos desde el 1 de ene-
ro de 1970, desde que el evento fue lanzado.
Muy útil para comprobar tiempos de ejecu-
ción de nuestros script.
Ejemplo …
<div id=”midiv7”>
<button id=”mibuttonReset7”>Resetear
temporizador y
vueltas.</button>
</div>…
if ( tiempo ) {
} else {
vuelta++;
if(!iniciadoTemporizador){
M3. JQUERY
alert(“INICIADO TEMPORIZA-
DOR”);
tiempo = event.timeStamp;
$( “#mibutton7”).text(“Pulsa
aquí para contar vuelta”);
iniciadoTemporizador = true;
});
$( “#mibuttonReset7”).click(function(event){
tiempo = event.timeStamp;
vuelta = 0;
$( “.cuentaVueltas”).remove(); 391
});
Atributo .event.which
Descripción Cuando estamos usando evento de entrada
(teclado o ratón), con event.which podemos
detectar qué botón ha sido pulsado, si es del
ratón, el botón derecho, el izquierdo o el có-
digo de la tecla del teclado.
M3. JQUERY
Ejemplo …
<div id=”milog8”></div>
</label>
<div id=”midiv8”></div>
if(event.which == 1)
$(“#midiv8”).append(“<br>Has pre-
sionado el botón izquierdo: “ +
event.which);
else if (event.which == 2)
$(“#midiv8”).append(“<br>Has pre-
sionado el botón
central/ruedaderecho: “ +
event.which);
else if (event.which == 3)
$(“#midiv8”).append(“<br>Has pre-
sionado el botón derecho: “ +
Aula Mentor
event.which);
else
$(“#midiv8”).append(“<br>Has pre-
sionado otro botón de tu
raton: “ + event.which);
});
394
Puedes visitar el ejemplo10-event/#event.
which
Resumen En este ejercicio nos creamos un input de
máximo un carácter para ver que código es el
que corresponde. Debemos recordar que cada
tecla corresponde a un código y este código
es el que indicará al sistema operativo qué
tecla ha pulsado. Usamos para ello el even-
to .keydown en la forma .on(“keydown”….
Como vimos en otras ocasiones y añadimos el
mensaje a un div que me he creado para mos-
trar el resultado, podíamos usar otra etiqueta
y otra forma.
.bind()
Este método es uno de las más importantes de jQuery, ya que podemos asociar fun-
ciones a eventos de elementos tanto del DOM como del navegador, en principio puede dar la
sensación de hacer lo mismo y en parte tiene el mismo resultado, lo bueno que nos facilita una
opción que de la otra forma no podíamos usar, y es asociar eventos simultáneamente, pasar
parámetros a eventos o lanzar nuestros propios eventos.
Veamos un ejemplo, para asociar el evento .onclick a un elemento HTML podíamos usar:
$(“miseleccion”).click(function(event){
//Mis acciones
});
Por ejemplo:
395
$(“#midiv9”).click(function(event){
});
Si queremos que cuando el usuario pase el ratón por encima del elemento, al hacer click
o doble click, realice unas acciones; en este caso mostrar una ventana, podemos usar la lista de
eventos como primer parámetro seguido de espacio y todos ellos entre comillas:
alert(“Has pasado el ratón por el elemento, click o doble click sobre él.”);
});
Dado el ejemplo mostrado, para poder realizar click o doble click, debemos cerrar la
ventana con el teclado y no con el ratón, sino no podremos detectar el evento click o doble click
al salirnos del área del elemento y activar nuevamente el evento mouseover.
.unbind()
Aula Mentor
Con este método podemos desenlazar un evento del elemento que deseemos. Por ejem-
plo, si queremos dejar de ejecutar cierto evento en algunas circunstancias podemos hacerlo.
Puede ser muy útil cuando queramos evitar que el usuario realice algunas acciones sobre nues-
tros elementos HTML y tener el control de cuándo se puede o no se puede lanzar un evento.
Vamos a ver el siguiente ejemplo, donde vamos a tener tres botones, un botón que mos-
trará una ventana miButton y otros dos para activar/desactivar el evento click del primer botón,
en el HTML tendríamos:
...
<label>Cuando actives el evento Click y pulses sobre el botón, aparecerá una ventana</label>
<br>
...
En el CSS:
396
#activaClick{
background-color: lime;
#desactivaClick{
background-color: orange;
Y en el jQuery :
M3. JQUERY
function funcionClick() {
$( “#activaClick” ).click(function() {
$( “#miButton” )
});
$( “#desactivaClick” ).click(function() {
$( “#miButton” )
});
Como vimos anteriormente en un ejemplo, podemos usar esta definición para manejar
los eventos de nuestros elementos, en vez de dotar al elemento HTML del evento de la forma:
seleccion.click(… ). Se pueden pasar varios eventos de la forma anteriormente comentada.
Events: son los eventos que se buscan asociar al conjunto de elementos selecciona-
dos. Se pueden pasar una lista de eventos.
Data: indica cualquier tipo de datos que se necesite pasar al manejador cuando s e
dispara el evento. Es también un parámetro opcional y, por lo general, se corresponde con
un objeto jQuery.
Aula Mentor
function miaccion() {
});
398
Una ventaja de usar el método .on() entre otras cosas es que podemos agregar varios
eventos de una vez, especificándolos de una vez:
Y también al igual que pasaba con otros métodos, es una buena práctica separarlos y si
hubiera que hacer acciones diferentes poder hacerlo separando los eventos por llaves y comas,
si por ejemplo tuvieramos el evento click y el evento dblclick, de una selección específica #miI-
dentificador y .miclase tendríamos:
$(‘#miIdentificador .miclase’).on({
click: function() {
},
dblclick: function() {
}
M3. JQUERY
});
Al igual que con .on podemos agregar eventos, podemos usar este nuevo evento para
eliminar los eventos que tenga nuestro elemento html.
Podemos pasar también una lista de eventos al igual que pasaba con el anterior, un ejem-
plo puede ser agregar un botón auxiliar donde eliminemos los eventos que antes le hayamos
proporcionado:
<br>
<br>
<button id=”miButton11”>Púlsame para eliminar los eventos .mouseover y .click del parrafo anterior.</
button> 399
$(‘#mip11’).on({
mouseover: function() {
$(this).css(“background-color”, “lime”);
},
click: function() {
});
//Ahora preparamos todo para que al pulsar el botón eliminemos los eventos
$(‘#miButton11’).click(function() {
$(‘#mip11’).off(“click mouseover”);
Aula Mentor
$(‘#mip11’).css(“background-color”, “#F3E2A9”);
});
Con este evento podemos controlar la ejecución de nuestro script una sola vez, y aunque
el usuario o el navegador intentara volver a ejecutarlo, no tendría ningún efecto. Veamos un
ejemplo sencillo donde al pulsar un botón mostramos mensaje; aunque el usuario pulse poste-
riormente el mismo botón no tendrá ningún efecto.
<button id=”miButton12”>Púlsame las veces que quieras, yo solo me ejecutaré una vez.</button>
Y en el jQuery:
$(‘#miButton11’).one(“click”,function(){
alert(“Has podido abrir una ventana, ya no podrás ejecutar más este evento en el elemento “);
});
400
Ahora veremos un ejemplo un poco más complejo pero más divertido, muchas veces
podemos “jugar” con los eventos para crear al usuario algo divertido y crear un juego, aunque
debemos pensar también en las aplicaciones que podrían tener para nuestras aplicaciones web.
Debes estar muy atento a este ejemplo, ya que tocamos muchos aspectos, CSS, HTML,
selectores, eventos, jQuery, etc y uniéndolo todo podemos crear una aplicación mucho más
compleja. Supongamos que queremos crear el siguiente juego.
Vamos a usar algunas funciones especiales que nos ofrece JavaScript, como es la gene-
ración de números aleatorios con el método Math.random(), este método nos genera un nú-
mero aleatorio, en nuestro ejemplo, vamos a crear un tablero donde aleatoriamente aparecerán
elementos con mina o sin mina. Tengo que adaptar un poco el método random() ya que me
genera un número decimal comprendido entre 0 y 1, por ejemplo si usamos la siguiente función
obtendremos un valor booleano (verdadero/falso o true/false) aleatorio, que es exáctamente lo
que queremos. Otro punto importante que vamos a usar en este ejemplo es la visualización,
seguimiento o depuración de nuestro programa, para ello nos vamos a ayudar de mensajes por
consola. Para ello, usamos dentro de nuestro código console.log(“texto”), y así podemos ir
realizando una traza y comprobar que con que datos o variables está funcionando nuestro script:
function aleatorioBoleano(){
return true;
}else{
return false;
401
Ahora debemos crearnos un tablero, para ello vamos a usar en este ejemplo <div></div>
con una sintaxis concreta, dos tipos de cajas, unas ConMina y otras SinMina para ello vamos a
tener los siguientes elementos:
También tendremos que tener unas variables para controlar el número de errores, en
principio se ha puesto un número fijo de 7, pero se podría pedir por un <input type=”text”, etc.
Para generar el tablero hemos decidido crear un sitio donde indicar al usuario el número
de errores actuaesl, y nos tendremos que crear un tablero de 6x6, es decir 36 elementos posible
donde podrá hacer click el usuario:
Aula Mentor
...
<label>Algunas valdosas tienen una mina, haz click y si salen de color verde no te preocupes puedes
continuar</label>
402
<div id=”tablero”></div>
...
width:600px; }
height:600px; .midiv13-mini-Sin {
} background-color: #F3E5A9;
.midiv13-mini-Con { width:94px;
} 403
Una de las ventajas de usar jQuery es crear elementos dinámicamente en tiempo de eje-
cución, por lo que no es necesario crear 36 <div> uno a uno escribiendolo en el código, pode-
mos crearnos una función que genere un número aleatorio, y devuelva verdadero o falso (true/
false) en cada interacción y crear en ese momento nuestro elemento que va a ser una mina o
sin mina. Para ello usamos como hemos usado en otras ocasiones el método .append que nos
añade HTML desde jQuery y en vez de crearlo manualmente, que sería lo mismo que insertar el
código en el HTML, llamamos mejor a una función que nos creará el código automáticamente
en cuestión de milisegundos:
function creaJuego() {
if(aleatorioBoleano())
$(this).append(“<div class=’midiv13-mini-Sin’></div>”);
else
$(this).append(“<div class=’midiv13-mini-Con’></div>”);
};
}
Aula Mentor
$(‘#tablero’).append(creaJuego);
Simplemente hemos creado un bucle for, donde creará 36 elementos, en cada interac-
ción llamo a la función que nos devolvía un valor aleatorio aleatorioBoleano() y dependiendo
de si es verdadero o falso, creo un elemento <div> de una forma u de otra. Hemos usado <div>
pero debemos saber a estas alturas, que podríamos agregar las etiquetas que creamos conve-
nientes, o usar <article>, <section>, etc.
Ya tenemos los elementos y el tablero creado, ahora debemos darle la interacción con
el usuario (eventos), para ello, nos vamos a crear el evento .click por ejemplo, se podría usar
.mouseover para hacerlo más dinámico o rápido, o cualquier otro que deseemos. Lo importante
de este ejemplo es que queremos usar el evento .click sólo una vez, por lo que debemos usar
el evento .one() y así nos aseguramos que el usuario sólo puede pulsar una vez sobre nuestro
elemento. Para ello, buscamos los elementos para su clase y los dotamos de los eventos .click
y dependiendo de si el elemento “tiene Mina” o no, lo ponemos de un color u otro. Para ello,
vamos a modificar los elementos CSS desde jQuery, aunque más adelante veremos más cosas, a
modo introductorio sería modificar las propiedades descritas de elemento HTML dinámicamente,
tendríamos por tanto:
$(‘.midiv13-mini-Sin’).one(“click”,function(){
$(this).css(“background-color”, “lime”);
});
404 $(‘.midiv13-mini-Con’).one(“click”,function(){
$(this).css(“background-color”, “red”);
errorUsuario();
});
Hemos usado .one y cambiamos el color para indicar al usuario si ha acertado (lima-
lime) o no (rojo-red). En caso que haya hecho click debemos ir contando los errores que va
cometiendo el usuario con la función errorUsuario(), para ello, nos hemos creado unas variables
con un límite de errores y con los errores acumulados. Por tanto tendríamos:
var errores_acumulados = 0;
var limite_errores = 7;
function errorUsuario(){
errores_acumulados++;
reiniciaJuego();
La función reiniciaJuego() realiza varias acciones muy interesantes, que aunque ya he-
mos visto anteriormente, aquí podemos ver un ejemplo más en una aplicación real.
function reiniciaJuego(){
405
//Ponemos a cero los errores acumulados
errores_acumulados = 0;
$(“.midiv13-mini-Sin”).remove();
$(“.midiv13-mini-Con”).remove();
$(‘#tablero’).append(creaJuego);
$(‘.midiv13-mini-Sin’).one(“click”,function(){
$(this).css(“background-color”, “lime”);
});
Aula Mentor
$(‘.midiv13-mini-Con’).one(“click”,function(){
$(this).css(“background-color”, “red”);
errorUsuario();
});
Hemos decidido borrar todos los elementos con el método .remove(), poner el contador
de errores a 0, modificar el mensaje que mostraba los errores a 0 y volvemos a crear todo de
nuevo, lo debemos hacer porque si no añadimos esto:
$(‘#tablero’).append(creaJuego);
No nos crea las valdosas o elementos <div>. Y si añadimos lo anterior pero no añadimos:
$(‘.midiv13-mini-Sin’).one(“click”,function(){
$(this).css(“background-color”, “lime”);
});
406 $(‘.midiv13-mini-Con’).one(“click”,function(){
$(this).css(“background-color”, “red”);
errorUsuario();
});
Crea las valdosas o elementos <div> de forma aleatoria y todo, pero no escuchamos el
evento .click de cada elemento, por lo que no podríamos interactuar con los elementos que
hemos creado nuevo. Debemos pensar que hemos empezado desde 0 con el juego y tenemos
que asegurarnos de poner las variables y los elementos como al principio.
Repasa todos los conceptos y elementos y asegúrate de entender todo antes de conti-
nuar, ya que es un ejemplo muy completo de todas las cosas que podemos hacer con los mó-
dulos vistos hasta ahora HTML5, CSS3 y jQuery.
7. Atributos.
Como hemos visto hasta ahora, con jQuery podemos seleccionar de forma masiva o de
forma concreta los elementos de nuestra aplicación web. Ahora una forma de darle más dinanis-
mo es el uso de atributos, modificando, añadiendo o eliminando según nos interese. Es decir,
M3. JQUERY
podemos modificar los elementos y los atributos de estos, eliminar o añadir nuevas clases o
permutarlas.
Podemos añadir nuestras clases a los elementos en tiempo real, por ejemplo imaginemos
que tenemos nuestro archivo CSS3 donde tenemos una clase que se llama colorPreferido y, en
ella, tenemos un color de fondo que se usará cuando el usuario haga mouseover sobre el ele-
mento. Para ello usamos:
Función Especifica una función que devuelve uno o varios nombre de clases que
se desea añadir.
.miColorPreferido{
background-color: lime;
Y en jQuery tendríamos:
$(document).ready(function(){
$(‘#addMiClase’).mouseover(function(){
$(this).addClass(‘miColorPreferido’);
});
Bueno, aunque a simple vista pensarás, ¡vaya! Pero si esto lo sé hacer, he de decirte que
llevas en parte razón. El efecto para el usuario puede ser igual que haber utilizado directamente
desde CSS el evento hover, o tantas otras formas. Debemos entender lo siguiente, en tiempo de
ejecución de nuestra aplicación web he añadido una clase a la selección de los elementos de mi
documento. Inicialmente esa clase no existe en el documento CSS, y esto me da mucho más
Aula Mentor
Al igual que hemos realizado anteriormente, podemos eliminar una clase a un elemento
en tiempo de ejecución de la aplicación.
.removeClass
Siguiendo con el ejemplo anterior, podríamos eliminar la clase una vez que el usuario
realice el mouseout del elemento HTML. Tendríamos por tanto el mismo código en el HTML y en
el CSS, pues si estamos trabajando de forma estructurada la mayoría de las veces sólo debemos
cambiar el jQuery.
$(document).ready(function(){
$(‘#addMiClase’)
.mouseover(function(){
$(this).addClass(‘miColorPreferido’);
})
408 .mouseout(function(){
$(this).removeClass(‘miColorPreferido’);
});
Para apreciar realmente qué está haciendo el navegador debemos usar el modo depura-
dor (F12), buscar el elemento y ver los estados que pasan sobre él:
Al pasar el ratón por encima y lanzar el evento .mouseover de la selección en este caso,
con id=”addMiClase” me cambia al siguiente código HTML:
M3. JQUERY
Hemos decidido en nuestro script jQuery, eliminar la clase cuando se active el evento
mouseout, el cual me elimina la clase asignada y vuelve a tener los valores que tuviera por de-
fecto el elemento HTML:
...
$(‘p’)
.mouseover(function(){
$(‘p’).addClass(‘miColorPreferido’);
})
.mouseout(function(){
Aula Mentor
$(‘p’).removeClass(‘miColorPreferido’);
});
...
El efecto al pasar el ratón será sobre todos los elementos que contengan el elemento:
Si en vez de usar directamente ‘p’ usamos this se activará sólo en el elemento que esté
llamando al evento en cada momento:
410
7.1.3. Permuta de Clases.
toggleClass(clase)
Función: Especifica una función que devuelve el nombre de la clase que se tiene
que permutar.
Conmutador: Valor booleano (true/false) que determina si la clase se tiene que añadir o
elminar.
Ejemplo de toggleClass
...
...
.txtBlue{
color: blue;
}
411
.bkgOrange{
background: orange;
En jQuery tendríamos:
...
$( “p” ).click(function() {
});
...
7.2. Leer.
Ahora debemos pensar que con la lectura de atributos de las etiquetas HTML podemos
acceder al valor usando la siguente sintaxis:
$(“selección”).attr(“atributo_a_leer”)
...
<div id=”resultado”></div>
...
$( “#dimeValor” ).click(function() {
});
...
Y a partir de cada pulsación en el botón Dime valor del atributo siempre nos dará el mis-
mo resultado, independientemente del texto que haya escrito en el <input> del formulario, este
punto es el que debemos entender, estamos accediendo a los atributos que hay en la etiqueta.
...
<div id=”resultado2”></div>...
$(‘.miEnlace’).each(function(i){
});
413
7.3. Editar.
Además de poder leer los atributos, podemos editarlos, consiguiendo así interaccionar
con los elementos más todavía, para realizarlo debemos usar una función que sobreescribe el
método .attr en este caso con dos parámetros:
$(‘miSeleccion’).attr(“atributo”, “valor”);
...
Tenemos una aplicación web donde tenemos muchos link a una página, pero en este
momento nos han comunicado que por problemas en el servidor no va a estar operativa, y claro,
queda muy mal tener una web con los enlaces “rotos”, por lo que vamos a coger en todos los
sitios donde tenemos enlace a esa web, y sustituirla por otra, sin tener que ir link por link. Con
jQuery podemos hacerlo sin tocar el código HTML y todo de golpe:
$(“.modificaAtributos”).attr(“href”,”http://www.mentoremprende.es”);
Si ejecutas la aplicación, verás que has modificado todos los enlaces a páginas web por
el nuevo, sin tener que saber ni siquiera cuantos hay y donde están. Como puedes ver jQuery es
una herramienta muy potente, por ejemplo si quisieramos cambiar de una vez todos los enlaces
para que en vez de abrirse en una pestaña nueva con el atributo target=”_blank” se abriera en
la misma página, con usar:
$(“.modificaAtributos”).attr(“href”,”http://www.mentoremprende.es”);
414
$(“.modificaAtributos”).attr(“target”,”_top”);
Se pueden modificar los atributos de forma seguida como acabamos de realizar, pero
jQuery nos proporciona una forma más limpia para este caso y es pasar parejas de atributos/
valor separados por comas y con el siguiente formato:
Se pueden pasar muchas parejas de atributo/valor, en este caso sólo hemos pasado dos,
pero se podrían pasar muchos más. Quedando el ejemplo que estamos realizando de la siguien-
te forma:
$(“.modificaAtributos”).attr({“href”:”http://www.mentoremprende.es”, “target”:”_top”});
7.4. Añadir.
Hemos comprobado que con jQuery podemos leer los atributos de los elementos HTML,
modificarlos, pero existirán casos que debamos añadir atributos, y claro está podemos hacerlo
simplificando mucho el código, para ello podemos usar el método .attr pero esta vez pasándoles
dos parámetros, el primero con el nombre del atributo que queremos añadir y como segundo
parámetro la función que debe devolver el valor a asignar dicho atributo.
M3. JQUERY
$(“miseleccion”).attr(“atributo”, function(indiceArray){ })
Imaginemos que tenemos nuestros formularios y tenemos varias clases creadas, por
ejemplo para los campos que son de texto, queremos agregarle el atributo placeholder y un
texto orientativo, por ejemplo, introduce un texto. Además tenemos otros campos de tipo fecha,
el cual vamos a rellenar con la fecha actual para facilitar al usuario rellenar el campo, para ello,
vamos a añadirle el atributo value con la fecha actual. Como veremos, no tenemos que saber
donde está en el código, ni a cuantos elementos va a afectar, ya que como he estructurado muy
bien la web puedo hacer todo este tipo de acciones de un vez.
<br><label>Introduce tu nombre</label>
415
<br><label>Introduce tu segundo apellido</label>
Ahora vamos a añadir los atributos placeholder y value a nuestros elementos, para ello
podemos realizar el siguiente código:
$(“.campoFecha”).attr(“value”, function(indiceArray){
});
$(“.campoTexto”).attr(“placeholder”, function(indiceArray){
Aula Mentor
return miTexto;
});
Hemos usado los métodos siguientes para obtener el día, mes y año respectivamente:
.getDate, .getMonth() y .getFullYear() los cuales los hemos asociado a una fecha variable de tipo
Date() y hemos tenido que crear un objeto nuevo, por ello hemos usado new Date().
7.5. Eliminar.
Imaginemos ahora que hemos agregado una sugerencia de texto indicando al usuario
qué campos de un formulario son obligatorios, y por algún motivo debemos eliminarlos direc-
tamente:
<br><label>Introduce tu nombre</label>
$(“.miFormulario”).removeAttr(“placeholder”);
El resultado sería que nos ha eliminado en una sola línea todos los atributos placeholder
del documento, quedando de la siguiente forma.
$(“.miFormulario”).removeAttr(“placeholder”);
417
8. Resumen.
- jQuery es una biblioteca de JavaScript, creada inicialmente por John Resig, que permite sim-
plificar la manera de interactuar con los documentos HTML, manipular el árbol DOM, mane-
jar eventos, desarrollar animaciones y agregar interacción con la técnica AJAX a páginas web.
- Con jQuery tenemos también un conjunto de selectores y filtros para elegir a qué elementos
del documento van a afectar nuestras acciones. Tendremos por tanto los selectores de eti-
queta o elemento, identificador y clase, entre otros muchos más de tipo parental y de posición
respecto a otras etiquetas.
- Para interactuar con el usuario jQuery proporciona “eventos” que serán disparados o detec-
tados por diferentes circunstancias. Podemos capturar eventos de los siguientes elementos:
del ratón, del teclado, de los formularios, del documento o del propio navegador.
Aula Mentor
El objeto .event es aquel que tendrán todos los elementos que han sido lanzados. Éste además
de poder capturar sus propiedades y datos, podremos modificar el evento definido por defecto
con .event.preventDefault().
Otra funcionalidad que podemos hacer con jQuery en tiempo de ejecución es añadir, eliminar
o permutar clases y atributos, para ello tenemos:
En el módulo anterior hemos visto que con jQuery podemos seleccionar los elementos del do-
cumento HTML según nos interese, detectar los eventos que el usuario ha realizado y añadir,
modificar y eliminar nuevas propiedades y atributos a los elementos ya existentes. En esta uni-
dad vamos a ver ver cómo podemos interaccionar con los formularios que rellenen los usuarios
en nuestras aplicaciones Web con jQuery, y además seguir viendo más posibilidades de CSS3,
añadir más efectos y el uso de Ajax, Asynchronous JavaScript And XML ( JavaScript asíncrono y
XML).
1. Formularios. 419
Aunque en HTML5 tenemos muchas formas para poder revisar y controlar el contenido
que el usuario nos introduce en los formularios, tenemos que tener presente que con jQuery
podemos usar muchas más restricciones personalizadas y ayudas para evitar que introduzcan
datos erróneos o de carácter mal intencionados, pero éstas no eximen por parte del servidor
realizar las comprobaciones pertinentes. Podríamos decir que con jQuery vamos a ayudar
al usuario a rellenar el formulario con datos correctos en una primera instancia y le podemos
aconsejar, revisar y comprobar si cumplen alguna característica (por ejemplo si la letra del DNI
es correcta, ha introducido número o letras, etc).
En unidades anteriores vimos cómo podemos acceder a nuestras propias clases o iden-
tificadores:
Debemos pensar que con los selectores de jQuery podemos elegir con qué elementos
del documento HTML vamos a trabajar, y en el caso de los formularios, siempre podemos selec-
cionar qué tipo de elementos, por tanto tenemos además unas etiquetas que realizan un filtro
Aula Mentor
:input $( “:input” ).
<form>
<input type=”checkbox”>
<input type=”file”>
<input type=”hidden”>
<input type=”image”>
420
<input type=”password”>
<input type=”radio”>
<input type=”reset”>
<input type=”submit”>
<input type=”text”>
<select>
<option>Opcion 1</option>
<option>Opcion 2</option>
</select>
<textarea></textarea>
<button>Button</button>
M3. JQUERY
</form>
<option>Amarillo</option>
<option selected=”selected”>Azul</option>
<option>Verde</option>
<option selected=”selected”>Naranja</op-
tion>
<option>Gris</option>
<option>Blanco</option>
</select>
<option selected=”selected”>Naranja</op-
tion>
:disabled Seleccionamos los elementos del formulario que
sean del tipo disabled, por ejemplo aquellos ele-
mentos que sean declarados de la siguiente forma:
<input name=”nombre” disabled=”disabled”>
En otras ocasiones del curso hemos comprobado que podemos acceder al valor de los
elementos de un formulario y realizar determinadas comprobaciones, por ejemplo: comprobar
si ha rellenado los campos antes de poder enviar el formulario. Si no queremos usar HTML5, y
preferimos usar jQuery (con la versión que da soporte a versiones antiguas de Internet Explorer 423
IE6, IE7 o IE8) tendremos que realizar nuestras propias validaciones con script propios. Siempre
tenemos esa opción “bajo la manga” pero muchas veces, se emplea demasiado tiempo en la
validación de datos que al fin y al cabo son tareas comunes en la mayoría de las web del tipo:
comprueba que el campo sea numérico, que no este vacío, si es un correo electrónico válido
(letras@letras.3letras), etc.
Con jQuery podemos usar un plugin que nos trae jQuery para la validación, que en de-
finitiva es un archivo de tipo js ( JavaScript) donde están creadas las validaciones:
http://plugins.jquery.com/validation/1.11.1/
Aula Mentor
Como podremos observar existe ya una nueva versión de validación 1.13.1. Cada dos
meses aproximadamente hay una nueva versión de jQuery ya que hay muchos desarrolladores
detrás haciendo mejoras. En la documentación de la web tenemos los requerimientos para poder
usar el plugin, en concreto para ésta hay que tener jQuery, y ha sido probado en las versiones
1.6.4, 1.7.2, 1.8.3, 1.9.1, 1.11.1 siendo ésta última la que estamos realizando en el curso.
Este tipo de archivo al igual que pasaba con el jQuery es una buena práctica tenerlo en
local o en un servidor que tenga mucha velocidad, ya que sino relantizaremos la comprobación
del formulario y el usuario podría pensar que es por problemas de la página. En nuestro caso,
nos vamos a descargar la versión y vamos alojar en nuestro servidor en la carpeta js/ donde te-
nemos los demás script.
Voy a explicar los pasos intermedios, porque es importante de donde ha salido la fuente
de todo y cómo hemos ido navegando hasta encontrar nuestro archivo, tal y como avanzan y
cambian las web, es mejor tener claro el proceso seguido, a dejar el link directo y pasados unos
meses y éste ya no funcione. De todas formas, en los recursos del curso, obtendrás los archivos
con los que se ha desarrollado el mismo, sino lo encontraras, pregunta a tu tutor.
Después de pinchar en Download now, nos aparecerá otra página web http://jqueryva-
lidation.org/ donde tendremos que seleccionar nuevamente Download y se nos descargará un
archivo con ejemplos, demos y los códigos fuentes. Y también nos podremos descargar exclusi-
vamente los archivos de validación.
424 Archivo jquery.validate que usaremos para validar los formularios cuando estemos reali-
zando el desarrollo de la aplicación web:
http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/jquery.validate.js
Idem anterior pero en su versión mínima, sin espacios, tabuladores, comentarios etc,
para usar cuando tengamos la aplicación definitiva:
http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/jquery.validate.min.js
Métodos adicionales donde podremos comprobar y validar más datos, por ejemplo, que
el número del banco sea correcto, que el código de IBAN que ha introducido el cliente corres-
ponde a un número correcto, formato de código postal, número de telefóno, etc. Esta versión
viene con comentarios, tabulaciones y saltos de página, por lo que es la que debemos usar
cuando estemos en la fase de desarrollo.
http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/additional-methods.js
Idem anterior pero en su versión mínima, sin espacios, tabuladores, comentarios etc,
para usar cuando tengamos la aplicación definitiva:
http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/additional-methods.min.js
Para usar este plugins de validación de formularios tendremos que hacer lo que hemos
realizado en varias ocasiones, linkarlo o enlazarlo desde nuestro documento, a la ruta donde
esté el archivo, en nuestro caso nos creamos una carpeta js, donde teníamos todos los script
almacenados. Debemos usarlo después de haber enlazado el fichero jQuery, en nuestro caso
M3. JQUERY
O de forma local:
Existen diferentes métodos que podemos usar para validar nuestros formularios, entre 425
los que destacamos:
dateISO: Devuelve true si el valor del campo es una fecha ISO válida, recordemos
426
maxlength: Devuelve false si el elemento es:
Y cuando usemos los métodos adicionales, tenemos otros tantos métodos, en los que
vamos a destacar:
427
bankaccountNL: Valida un número de banco con el formato:
123456789 or 12 34 56 789
Existen muchas comprobaciones y validaciones más indicadas para otros paises, (núme-
ro de teléfono de US, de UK, códigos postales, etc) y cada vez más se van realizando nuevas
incorporaciones, pero lo importante es saber que la mayoría de los datos que nos introduzca
el usuario podemos usar el plugin de jQuery-validate o usar sólo la parte necesaria en nuestra
aplicación web. Así, nos ahorramos programar algo que ya está programado y sobre todo com-
probado para no entrar en conflicto con otras partes de jQuery.
Ahora veamos un ejemplo de formulario y cómo usar algunas validaciones que nos pro-
porciona el pluging de jQuery: jquery-validate.js
Supongamos que queremos usar un formulario para que el usuario nos introduzcan sus
datos, por ejemplo el siguiente:
428
...
...
<div id=”miformulario”>
<form action=’’>
<div>
<label for=”name”>Nombre:</label>
</div>
<div>
M3. JQUERY
<label for=”surname”>Apellidos:</label>
</div>
<div>
<label for=”email”>Email:</label>
</div>
<div>
</div>
<div>
</div>
<div>
<label for=”password”>Contraseña:</label>
</div>
<div>
<label for=”observaciones”>Comentarios:</label>
</div>
<div>
</div>
</form>
</div>
...
...
Para poder usar el plugin de validación debemos llamar al método validate después de
realizar la selección, y posteriormente la opción que vayamos a comprobar, (email, url, etc).
También debemos decirle las reglas (“rules”) utilizadas para validar los datos introducidos por el
usuario.
$(‘miseleccion’).validate( {
430
rules:{
nombre1:{
//opciones
},
. . .
. . .
nombreN:{
//opciones
},
messages:{
nombre1:{
M3. JQUERY
//opciones y mensajes
},
. . .
. . .
nombreN:{
//opciones y mensajes
},
success:{
});
Existen más opciones que se pueden usar con validate y al igual que messages y success 431
son opcionales, la más importante sería rules ya que define nuestras reglas sobre los elementos.
Estos han de estar definidos con el atributo name para poder referirnos a él posteriormente, si
nos fijamos hemos distinguido a modo de ejemplo el nombre del campo del nombre de identi-
ficador para no confundir qué elemento va a llamar y usar el método validate.
Si queremos que este campo sea requerido y el usuario lo rellene para poder enviar el
formulario deberíamos de hacer:
$(document).ready(function(){
$(‘#miformulario form’).validate({
rules:{
nombre:{
required: true,
}
Aula Mentor
});
Debemos ser muy meticulosos, ya que el 90% de los errores cuando no funcionan las
validaciones es por uso incorrecto de la sintaxis o el uso de la selección de los elementos. Con
este ejemplo, se selecciona aquel documento HTML que tenga un identificador “miformulario” y
sea formulario “form”. Una vez que tengas esos elementos, vamos a validarlo .validate para com-
probar las siguientes reglas rules: comprueba el siguiente nombre de entrada de texto nombre
y ahora quiero que este campo nunca este vacío, lo que es lo mismo, sea requerido para poder
enviar el formulario. Si pulsamos el botón enviar sin escribir nada en el campo de nombre nos
aparecerá un mensaje global como podemos ver en la siguiente imagen:
Este mensaje “This field is required” nos indica que el campo en cuestión es requerido,
432 pero podemos elegir nosotros nuestros propios mensajes, para ello debemos añadir más cosas
a nuestro archivo jQuery, por ejemplo si queremos decir en Español “*Introduce tu nombre, este
campo es obligatorio” debemos usar:
$(‘#miformulario form’).validate({
rules:{
nombre:{
required: true,
},
messages:{
nombre:{
}
M3. JQUERY
});
Y si ahora le damos al botón enviar y el formulario de validación nos devuelve false nos
aparecerá el siguiente mensaje:
Y como ya sabemos CSS3, puede añadirle un poco de estilo, para hacer más llamativo el
mensaje al usuario. Para ello, podríamos usar el siguiente código:
. . .
. . .
Y en mi archivo CSS:
.mierror{
color: red;
433
Y ahora cada vez que mostremos un error, al usuario le aparecerá el texto de color rojo,
como se puede ver a continuación:
Sigamos con las validaciones de nuestro formulario, por ejemplo para el campo Apellidos
vamos a obligar que también sea obligatorio, pero que tenga al menos 3 caracteres. Se puede
concatenar validaciones poniéndolas dentro de las validación del elemento:
$(‘#miformulario form’).validate({
rules:{
nombre:{
required: true,
},
apellidos:{
minlength: 3,
required: true
Aula Mentor
},
messages:{
nombre:{
},
apellidos:{
}
434
});
Debemos tener en cuenta que hemos añadido una coma a continuación para poder se-
guir llamando elementos del formulario, y para añadir más validaciones que también las hemos
separado por comas. En este ejemplo, en el campo apellidos estamos realizando dos validacio-
nes: una que sea required en el campo y sea rellenado obligatoriamente y otra que tenga un
mínimo de 3 caracteres minlength. Por tanto tenemos la posibilidad de mostrar dos mensajes,
uno para cada validación.
A partir de ahora me voy a centrar sólo en las validaciones del elemento en cuestión y
no mostraré las demás para facilitar el aprendizaje y no repetir código pues tienes el ejemplo
completo y resuelto en los recursos del curso, sólo debemos aprender a usar las validaciones
ya que es recomendable que intentes realizar desde cero la validación de un ejemplo similar al
propuesto sin usar el código resuelto, y posteriormente si tuvieras dudas, usar el código como
apoyo.
<div>
<label for=”email”>Email:</label>
</div>
M3. JQUERY
$(‘#miformulario form’).validate({
rules:{
email:{
email: true,
},
messages:{
email:{
});
Para validar el número de iban que nos ha introducido, debemos usar: 435
$(‘#miformulario form’).validate({
rules:{
banco:{
iban: true,
},
messages:{
banco:{
});
Aula Mentor
Para validar una página web, que comience por http://.... o ftp://...podríamos usar:
$(‘#miformulario form’).validate({
rules:{
web:{
url: true,
},
messages:{
web:{
436 });
$(‘#miformulario form’).validate({
rules:{
password:{
rangelength: [6,12],
required: true,
},
messages:{
password:{
});
. . .
. . .
Y en el jQuery:
$(‘#caracteresRestantes’).text(caracteresRestantes + “ Caracteres
restantes”).css(“color”, “red”);
}else{
$(‘#observacionesId’).keydown(function(e){
caracteresOcupados = $(‘#observacionesId’).val().length;
actualizaCaracteres(valorMaximo, caracteresOcupados);
});
Es una forma aproximada para indicar al usuario cuántos caracteres le queda, si nos
fijamos, sólo hemos usado el evento .keydown del textarea para detectar que ha presionado la
tecla, y en cada pulsación, calculamos la longitud, para ello usamos $(‘#observacionesId’).val().
length y llamamos a otra función que nos hemos creado que se llama actualizaCaracteres(val
438 orMaximo, caracteresOcupados) y en ella, actualizamos el número de caracteres restantes que
nos quedan y comprobamos si el valor es positivo o negativo, y dependiendo de él ponemos el
texto de color rojo.
2. CSS3.
El uso de CSS3 y jQuery en las aplicaciones web, nos permite modificar, añadir y eli-
minar propiedades de estilo y tener un control no sólo del documento HTML como tal, sino
también de diseño del mismo. Algunas propiedades las hemos visto en apartados anteriores,
para facilitar y enriquecer los ejercicios; ahora veremos como acceder a las propiedades y qué
métodos son los más usuales para trabajar jQuery y CSS.
$(‘miseleccion’).css(‘propiedad’)
M3. JQUERY
De esta forma si tenemos un archivo CSS con nuestras propiedades definidas, podemos
acceder a todas ellas desde jQuery. Imaginemos que tenemos una hoja de estilo con las siguien-
tes definiciones de propiedades:
.mitexto{
color: blue;
background-color: white;
<div class=”mitexto”>
</div>
. . .
439
var mipropiedad1_CSS = $(“.mitexto”).css(‘color’);
. . .
Si nos damos cuenta no nos ha devuelto la palabra que esperábamos blue, pero si nos
ha devuelto el mismo significado con otra notación, recuerda que en módulos anteriores tenía-
mos varias formas de indicar al navegador los colores. Hay en internet diversas formas y script
realizados para transformar de unas notaciones a otras, lo importante es que hemos accedido a
las propiedades de nuestra hoja de estilo desde jQuery.
$(‘miseleccion’).css(‘propiedad’, ‘valor’)
Siguiendo con el ejemplo anterior, vamos a cambiar las propiedades, en concreto; vamos
a cambiar el color azul, por naranja y el color de fondo blanco, por gris. Como la forma de traba-
jar que estamos adquiriendo, no tenemos que modificar ni el archivo HTML, ni el CSS, sólo con
modificar nuestro script se hará todo automáticamente, estaríamos accediendo a las propiedades
CSS, y al documento HTML directamente para interactuar con él según necesitemos.
$(“.mitexto”).css(‘color’,’orange’);
$(“.mitexto”).css(‘background-color’,’gray’);
//Muestro los valores leidos nuevamente, ¡OJO! No modifica el valor del archivo CSS, solo del //navegador
En ocasiones necesitamos saber el tamaño de los objetos y las posicion dentro de una
página. Pensemos que tenemos una caja o capa (<div>) y queremos saber el tamaño que tiene,
tanto interno como externo (contando padding y bordes) para poder modificarla accediendo a
sus propiedades en CSS y saber dónde está situada respecto a la página, existen varios métodos
que nos ayudarán, estos son:
innerWidth(): Develve las dimensiones internas (anchura) del primer elemento que
haya en dicho objeto jQuery. Contando el padding pero no el borde.
- La posición siempre nos la devuelve con dos atributos “top” y “left” respecto de la esquina
superior izquierda.
Vamos a ver un ejemplo donde obtengamos todas esas medidas de un elemento, para
ello, tendremos dos elementos html, para facilitar el aprendizaje vamos a usar dos cajas una
dentro de la otra, definida de la siguiente forma:
<hr>
<div id=”cajaPadre”>
<div id=”cajaHija”>
</div>
441
</div>
<p id=”valoresCajas”><p>
Y en nuestro archivo CSS tenemos definidas los siguientes identificadores, una para la
caja Padre y otro para la caja Hija:
#cajaPadre{
width: 400px;
height: 400px;
Aula Mentor
background-color: #EBEC99;
position: relative;
#cajaHija{
width: 200px;
height: 200px;
background-color: #DF9449;
position: absolute;
top: 50%;
left: 50%;
width: 50%;
Y ahora vamos sacar todos los datos de nuestros elementos HTML, en este caso nuestro
<div> cajaPadre y cajaHija. Para ello, vamos a usar el siguiente código en jQuery:
. . .
. . .
$(‘#valoresCajas’)
443
.append(“RESULTADOS”)
.append(“<hr>”)
.append(“<br>CAJA PADRE”)
.append(“<br>innerWidth: “+anchoCajaPadre)
.append(“<br>innerHeight: “+altoCajaPadre)
.append(“<br>outerWidth: “+anchoTCajaPadre)
.append(“<br>outerHeight: “+altoTCajaPadre)
.append(“<hr>”)
.append(“<br>CAJA HIJA”)
.append(“<br>innerWidth: “+anchoCajaHija)
.append(“<br>innerHeight: “+altoCajaHija)
.append(“<br>outerWidth: “+anchoTCajaHija)
.append(“<br>outerHeight: “+altoTCajaHija)
444 . . .
. . .
Realmente en este ejemplo no sería necesario crear las variables para luego mostrarlas,
pero es una buena práctica que nos acostumbremos a usar variables en nuestros script, aquellas
veces que tengamos que usarlas varias veces o quede más claro el código, y facilite el posterior
mantenimiento/modificación del mismo por una tercera persona.
El resultado que obtenemos suponiendo que el elemento cajaPadre está dentro del
documento sería el que muestra la siguiente imagen. Debemos observar sobre todo los valores
respecto del documento, respecto del padre y las posiciones con y sin borde:
M3. JQUERY
Cuando tenemos un elemento scroll también podemos obtener la posición de los ele-
mentos respecto a este scroll, para ello disponemos de los siguientes métodos:
Veamos un ejemplo:
<h3>Posicionamiento en un Scroll</h3>
<hr>
<p>Mueve el scrollbar y obtén la posición del scroll vertical y horizontal en cada momento.</p>
445
<div id=”miScroll”>
<img src=”img/jquery_logo.png”>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div><br>
En el CSS, tendríamos:
Aula Mentor
#miScroll{
width:250px;
height:250px;
overflow:auto;
Y en el jQuery tendríamos:
$(“#miScroll”).scroll(function() {
});
446
El resultado sería el siguiente, nótese que hemos agregado una imagen con un tamaño
superior al ancho del scroll para poder ver el scroll horizontal:
3. AJAX.
Una de las innovaciones que ocurrió en el desarrollo de aplicaciones web fue la apari-
ción de AJAX, aunque realmente es una forma de desarrollar aplicaciones con una técnica con-
creta y que existía hace mucho tiempo antes, usando el método XMLHttpRequest de JavaScript
para realizar peticiones asíncronas al servidor. Últimamente ha habido un gran aumento y uso
de la misma, ya que la tecnología en sí lleva mucho tiempo usándose por desarrolladores web.
Ajax requiere un gran estudio del mismo y en este curso no vamos a poder profundizar debido
a la extensión y complejidad del mismo. Eso sí, vamos a ver una introducción del mismo, usar
algunas características con jQuery comprendiendo que también podemos interactuar con él y
coger una base por si queremos profundizar en otro momento mediante AJAX.
M3. JQUERY
3.1. Introducción.
A pesar de que el término «Ajax» (Asynchronous JavaScript And XML) fue creado en
2005 por Jesse James Garrett, en la historia de las tecnologías se remonta varios años antes con la
iniciativa de Microsoft en el desarrollo de Scripting Remoto (tecnología que permite a los scripts
que se ejecutan dentro de un navegador web intercambiar información con el servidor).
Ajax es una tecnología asíncrona, en el sentido de que los datos adicionales se solicitan
al servidor y se cargan en segundo plano sin interferir con la visualización ni el comportamiento
de la página. JavaScript es el lenguaje interpretado (scripting language) en el que normalmente
se efectúan las funciones de llamada de Ajax mientras que el acceso a los datos se realiza me-
diante XMLHttpRequest, objeto disponible en los navegadores actuales. En cualquier caso, no es
necesario que el contenido asíncrono esté formateado en XML.
Ajax es una técnica válida para múltiples plataformas y utilizable en muchos sistemas
operativos y navegadores dado que está basado en estándares abiertos como JavaScript y Docu-
ment Object Model (DOM). JQuery usaba de por sí varios métodos AJAX, uno que podemos ver
es el método .load(url, parámetros, callback), facilitando la tarea de enviar y recoger peticiones
asíncronas al servidor.
Supongamos un caso práctico, el navegador del cliente carga una página de mucho 447
“peso”, es decir, tiene muchas imágenes y contenidos que ralentizan la carga del mismo, una
vez que ha conseguido cargarla en el navegador, supongamos que queremos hacerle una con-
sulta de nuevo al servidor, pensemos que nuestra web está compuesta por muchas secciones,
artículos y queremos sólo actualizar una sección, o una caja, o sólo una parte. ¿Tendríamos que
recargar nuevamente toda la página con el coste en tiempo y peticiones web al servidor y el
tráfico que generaría nuevamente al usuario?. Es una de las opciones que nos resuelve AJAX,
imaginemos el siguiente esquema web:
Aula Mentor
Si por ejemplo queremos mandar una variable al servidor para actualizar una sección,
pero sin tener que tocar nada de lo demás, tendremos que usar otros métodos y emplear AJAX
para resolverlo.
448
1. El servidor del cliente ha realizado una petición, en este caso el cliente quiere actualizar la
sección de las redes sociales.
2. El servidor procesa la información que le ha venido del cliente, (actualizar las redes sociales)
y depende de la acción puede necesitar hacer: consultar a bases de datos, a otros servidores,
páginas web, o resolver por si misma la petición porque tenga todos los datos para realizarlo.
3. El servidor finalmente manda los datos actualizados de esa sección al navegador del cliente,
pero no se han modificado, ni actualizado las demás secciones.
Una vez que tenemos claro qué es AJAX, podemos seguir con las tecnologías implicadas
para una aplicación con AJAX, estas serían:
1. JavaScript, para capturar las interacciones con el usuario o los eventos que deseemos aplicar,
ya sea el navegador, el ratón, etc. todos los eventos que podemos capturar del usuario.
M3. JQUERY
2. El objeto XMLHttpRequest, para permitir que las peticiones se realicen al servidor sin inte-
rrumplir otras tareas del navegador.
3. Archivos XML en el servidor u otros formatos de datos. Normalmente se suele usar HTML,
JSON, etc.
4. Nuevamente JavaScript, para recibir los datos que nos ha mandado el Servidor Web y mos-
trarlos correctamente en nuestra página.
jQuery proporciona soporte para Ajax, permitiendo abstraer las diferencias que pueden
existir entre navegadores, para ello tenemos los siguientes métodos: $.get(), $.getScript(), $getJ-
SON(), $.post() y $().load().
3.2. Preámbulo.
Debemos tener muy claros los siguientes conceptos para entender correctamente el uso
de los métodos anteriores:
Con GET, lo podemos usar cuando estemos obteniendo datos del servidor, pero no
estamos interactuando con él, son peticiones del tipo “Dame o coge”, Dame este dato, Dame lo 449
que encuentres de esta página, etc. Las solicitudes GET pueden ser almacenadas en la caché del
navegador, pudiendo conducir a un comportamiento impredecible si no se tiene en cuenta.
Con POST, se puede usar cuando estemos interactuando con el servidor, y ésta pueda
requerir agregar o modificar datos. Son peticiones del tipo “Recibe” estos datos, y dependiendo
del caso si por ejemplo es un alta de un usuario, los daremos de alta en nuestro servidor (inte-
ractuando con la Base de Datos, registros log, etc).
Podemos usar muchos tipos de archivos de datos diferentes, entre los que se encuentran:
- Texto. Para el envío de las cadenas de caracteres. Si recordamos cuando en los formularios
mandábamos varias variables, estas se enviaban en formato de texto plano.
- Html. Para transportar los trozos de código HTML que serán insertados/ubicados en la pá-
gina.
- Script. Fichero con código JavaScrip, por ejemplo añadir script nuevo o funciones nuevas
a nuestra página.
- Json. Para transportar información en formato JSON, incluyendo más información (cadenas
de caracteres, array y objetos). JSON, es un formato muy estándar y usado para el intercam-
bio de información, tanto de aplicaciones web, como de aplicaciones de dispositívos móvi-
les. http://es.wikipedia.org/wiki/JSON
Aula Mentor
- XML. Para transportar información en formato XML. Junto con JSON, son dos formatos muy
extendidos, usados a nivel web y de intercambio de información. Por ejemplo entre un ERP
(Enterprise Resource Planning) o incluso la tendencia en los bancos para comunicarnos con
ellos es usar archivos XML, como son los cuadernos que envían las empresas, como puede
ser la SEPA:
http://docs.oracle.com/cd/E39564_01/doc.91/e39169/fields_sepa_pay_file_appx.
htm#EOAEL00518
3.2.3. Sincronismo/Asincronismo.
Si tenemos varias llamadas de Ajax de modo asíncrono podemos tener varias peticiones
al servidor de manera paralela por lo que nos puede ayudar a cargar la información más rápida,
o podemos estar interactuando con varios elementos y cada elemento tardará el tiempo que
necesite en dar su respuesta o resultado.
3.2.4.1. $.get()
La sintaxis que podemos usar con jQuery para hacer consultas es la siguiente:
$.get(url[, datos][,función][,tipo])
Para ello utiliza la consulta HTTP GET siendo los parámetros siguientes:
url: Una cadena de caracteres que contiene la URL del archivo que se
quiere cargar.
3.2.4.2. $.post()
La sintaxis que podemos usar con jQuery para hacer consultas es la siguiente:
$.post(url[, datos][,función][,tipo])
Para ello utiliza la consulta HTTP POST siendo los parámetros siguientes:
url: Una cadena de caracteres que contiene la URL del archivo que se
quiere cargar.
3.2.4.3. $getScript()
La sintaxis que podemos usar para cargar un script usando el método HTTP GET y eje- 451
cutarlo sería el siguiente:
$.getScript(url[,función])
Donde:
url: Sería una cadena de caracteres que contiene la URL del script que
se quiere cargar.
3.2.4.4. $.ajax()
De los métodos existentes en jQuery para trabajar con AJAX, este es el que comprende
los demás métodos por lo que es una buena práctica el uso del método $.ajax en lugar de los
otros ya que ofrece más características y está al igual que las demás funciones jQuery para un
uso más comprensible.
Para configurar el método $.ajax lo haremos a través de un objeto, el cual contiene todas
las instrucciones que necesita jQuery para completar la petición. Se pueden especificar acciones
Aula Mentor
en caso que la petición haya tenido éxito o no, además, al estar configurado como un objeto, es
posible definir sus propiedades de forma separada, haciendo un código más legible, reutiliza-
ción de código y un mantenimiento más optimo.
http://api.jquery.com/jQuery.ajax
Por último comentar que existen muchos más métodos como ajaxSetup(parámetros)
o serialize() que nos ayuda en las consultas y en la serialización de datos. La serialización de
datos es muy importante para transformar todos los campos y parámetros de un formulario de
forma contínua en una cadena de caracteres. Por ejemplo en el siguiente caso, se enviaría al
servidor la siguiente cadena:
single=Single&multiple=Multiple&multiple=Multiple3&check=check2&radio=radio1
AJAX y jQuery como vemos están integrados para poder funcionar conjuntamente en
nuestras aplicaciones web, no te preocupes si este apartado no lo has comprendido totalmente,
ya que solamente es una pequeña introducción y si nunca has usado AJAX, debes pensar que
son métodos nuevos y necesitaríamos más tiempo para poder comprenderlos. Si has usado antes 453
AJAX puedes profundizar en la documentación oficial y sacarle aún más provecho a tu manejo
de jQuery, si es la primera vez quédate con la idea principal y cuando dispongas de tiempo
siempre puedes retomarlo.
No debemos olvidar que el posionamiento de una página es hoy en día uno de los fac-
tores más importantes de cualquier aplicación web, ya que al existir muchas y crecer día a día
en número, es vital salir por delante en las búsquedas de las web competidoras, así los usuarios
eligirán antes la web que salga en los primeros resultados.
Pensemos que mucha información con AJAX sea cargada de forma asíncrona, cuando los
robots de los buscadores, por ejemplo de google pasaban a leer la información, no estan leyen-
do directamente el fichero como tal, ya que existen una cantidad de peticiones y respuestas para
completar la web en paralelo. Antiguamente no se indexaban correctamente y las web realizadas
en AJAX siempre salían detrás de las web no realizadas con AJAX.
Por todo esto, es muy importante pararnos y tener en cuenta este punto sobre AJAX,
puesto que tenemos que estudiar muy bien los casos en los que sería necesario, y en el caso
de usar AJAX, seguir unos métodos y pautas que existen para que no afecten a la indexación y
posicionamiento en los buscadores. Ya que si no los tenemos en cuenta, tendrémos una página
muy dinámica y rápida pero muy mal posicionada.
Aula Mentor
4. Efectos.
Un punto muy importante que no debemos olvidar al usar jQuery es el uso de efectos y
animaciones en nuestras aplicaciones web. Antíguamente cuando se veía una página web con
animaciones siempre se asociaba a Macromedia Flash Player, debido a que permitían un gran
abanico de efectos, animaciones y posibilidades. Hoy en día con jQuery podemos usar las ani-
maciones y efectos más típicos usados en las webs sin tener que obligar al usuario tener instala-
do la última versión de Adobe Flash Player. Este punto que a priori puede no tener importancia,
cuando estamos hablando de dispositivos móviles, sobre todo los Iphone a no ser que se instalen
aplicaciones externas no pueden ver las páginas web con Flash, con la consecuente pérdida de
usuarios que usan estos dispositivos.
Con estos métodos de jQuery .show() y hide(), podemos hacer aparecer y desaparecer
elementos HTML, pudiendo crear efectos ante el usuario muy interesantes. La sintaxis sería la
siguiente:
Ejemplos:
$(‘p’).show()
$(‘.claseMostrar’).show()
$(‘.claseMostrar’).show(’normal’)
$(‘.claseMostrar’).show(’slow’)
$(‘p’).hide()
$(‘.claseOcultar’).hide()
$(‘.claseOcultar’).hide(’normal’)
M3. JQUERY
$(‘.claseOcultar’).hide(’slow’)
. . .
<hr>
<div class=”ocultar”>
</div>
<hr>
<hr>
<div class=”mostrar”>
Aula Mentor
</div>
<hr>
456 . . .
. . .
var contador = 0;
$(‘#btnMostrar’).click(function(){
//Mis acciones
contador = 0;
});
$(‘#btnOcultar’).click(function(){
//Mis acciones
M3. JQUERY
contador = 0;
});
. . .
Y en el CSS:
.ocultar{
background-color: #F3E5A9;
.mostrar{
background-color: #F3E5A9;
El efecto será que dependiendo del botón que pulsemos, Mostrar u Ocultar, realizará una
acción u otra. Si nos fijamos la clase .mostrar no hace realmente nada en este script, ya que sólo 457
ponemos oculto/visible los elementos HTML que pertenezcan a la clase .ocultar. Es una buena
práctica aprovechar y utilizar los nombres cuando realmente tengan un sentido semántico, por-
que en un futuro, si necesitamos en vez de mostrar los elementos con la clase .ocultar queremos
ocultar los elementos que pertenezcan a la clase .mostrar tenemos la opción de hacerlo, porque
ya hemos dotado el código con la posibilidad de algún cambio.
Un ejemplo muy usado en las web con estos dos efectos, es el típico botón de leer más,
en el que al pulsar sobre él, muestra el contenido completo del párrafo. Para ello se puede
hacer de varias formas, por ejemplo si cogemos los datos de una base de datos agregamos dos
párrafos, por ejemplo, el primer párrafo con las primeras 50 palabras, o 100 caracteres, y el se-
gundo párrafo que estará oculto con el resto. Centrándonos en la parte de ocultar/mostrar texto
podríamos hacer los siguiente en el fichero HTML:
. . .
<a name=”leer_mas”></a>
<p class=”encabezadoArticulo”>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eius-
modtempor incididunt ut labore et dolore magna aliqua.
<br>
</p>
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
<br>
. . .
.restoArticulo{
display: none;
. . .
$(‘.leerMas’).click(function(){
//Mis acciones
contador = 0;
$(‘.restoArticulo’).show();
M3. JQUERY
$(‘.leerMas’).hide();
});
$(‘.leerMenos’).click(function(){
//Mis acciones
contador = 0;
$(‘.restoArticulo’).hide();
$(‘.leerMas’).show();
});
. . .
Debemos tener en cuenta que en determinadas ocasiones tendremos que usar efectos
combinados, como por ejemplo en el ejemplo anterior que cuando mostramos el texto, oculta-
mos el botón de leerMas.
4.2. Fundidos.
Hacer fundidos de los elementos con jQuery es posible gracias a los métodos de fading
que disponemos. Este método interacciona sobre los elementos HTML a través del cambio de la
propiedad opacity de CSS.
Recordando que con Opacity podemos variar el fundido con valores entre 0 (totalmente
transparente) y 1 (totalmente opaco). Existen los siguientes métodos para trabajar con los fundi-
dos:
fadeOut() Con este método conseguimos que el elemento que lo recibe desaparezca de la
página a través del cambio de su opacidad, haciendo una transición suavizada
con tendencia al valor de opacity cero.
fadeIn() Con este método conseguimos que el elemento que lo reciba aparezca en la
página a través del cambio de su opacidad, haciendo una transición suavizada
con tendencia al valor de opacity 1. Para poder apreciar este método el
elemento sobre el que estamos trabajando, debe estar con un valor inferior a 1,
es decir, que esté parcial o totalmente transparente.
Aula Mentor
. . .
<button id=”desapareceT”>FadeOut-Desaparece</button>
<button id=”apareceT”>FadeIn-Aparece</button>
. . .
460 . . .
$(‘#desapareceT’).click(function(){
$(‘#miImagen’).fadeOut();
});
$(‘#apareceT’).click(function(){
$(‘#miImagen’).fadeIn();
});
var opacidadActual = 1;
$(‘#aumentaFade’).click(function(){
}else{
opacidadActual=(parseFloat(opacidadActual)+parseFloat(incrementoOpacidad)).
toFixed(2);
});
$(‘#disminuyeFade’).click(function(){
opacidadActual=(opacidadActual-incrementoOpacidad).toFixed(2);
});
. . .
Hemos usado parseFloat(número) para indicar a JavaScript que no queremos que conca-
tene los valores número 1 y número 2, ya que si recordamos en JavaScript teníamos el operador
+, y dependiendo del caso debemos asegurarnos que estamos trabajando con números sino
tendremos resultados inesperados. Existen muchos métodos que nos ayudarán para asegurarnos
que estamos trabajando o queremos convertir al tipo que deseemos, entre los más importantes:
eval(), isFinite(), isNaN(), Number(), parseFloat(), parseInt(), String().
También hemos usado el método toFixed(2) que reduce el número de decimales a dos,
porque en este caso no necesitamos más decimales. Es recomendable usar siempre mensajes
en la consola para ayudarnos en la depuración del programa, del tipo console.log(“Mensaje :
“+variable). Te recomiendo que modifiques la línea del script:
opacidadActual=(parseFloat(opacidadActual)+parseFloat(incrementoOpacidad)).toFixed(2);
Por esta:
opacidadActual=opacidadActual+incrementoOpacidad;
Observa en la consola que es lo que pasa cuando vamos interactuando con los botones. ¿Y si
además quitamos el método toFixed(2)?
4.3. Desplazamientos.
462
Existen unos métodos que van a ayudarnos a crear efectos de desplazamiento sobre
nuestra página, realmente lo que hacen es modificar dinámicamente la altura de un elemento,
normalmente se aplica a una capa/caja de tipo <div></div>.
<div>
</div>
<div id=”midesplazamiento”></div>
M3. JQUERY
En el CSS tendríamos:
#midesplazamiento{
height: 100px;
width: 100px;
background-color: #A0A0A0;
$(‘#desplazamiento’).click(function(){
if($(“#midesplazamiento”).is(“:hidden”)){ 463
$(“#midesplazamiento”).slideDown(“slow”);
}else{
$(“#midesplazamiento”).slideUp(“slow”);
});
4.4. Animaciones.
Función de animación: Esta función sirve para indicar cómo se realizará la animación, si
más suave al principio y rápida al final, o igual de rápida todo el
tiempo. Es decir, la velocidad con la que se realizará el cambio de
valores en diferentes puntos dentro de la animación. En principio, los
dos posibles valores son “swing” (por defecto) y “linear”.
. . .
<p class=”miAnimacion”>Este texto será animado cambiando sus propiedades al pulsar el botón</p>
<div>
</div>
. . .
.miAnimacion{
color: blue;
font-size: 12pt;
Debes entender que no todas las propiedades pueden ser animadas, por ejemplo, colo-
res y aquellas que no tengan un valor que pueda ir creciendo o disminuyendo. Con este método
podemos modificar las propiedades de CSS, controlar el tiempo que va a tardar en aparecer la
animación y todo ello de una forma sencilla. En este ejemplo hemos usado solo el tamaño de
fuente, si quieres ver más ejemplos de animación en el siguiente enlace http://api.jquery.com/
animate/.
<p id=”colaEfectos”>TEXTO</p>
<div>
</div>
. . .
. . .
$(‘#iniciaCola’).click(function(){
micapa.hide(2000);
Aula Mentor
micapa.show(2000);
});
. . .
Y en el CSS, para destacar un poco el texto lo pondremos naranja y un poco más grande
de lo habitual:
.miAnimacion{
color: blue;
font-size: 12pt;
}
466
Ejecuta el código, haz click sobre el botón Inicia Cola de Efectos y verás como realiza
una detrás de otra y de forma ordenada la cola de efectos que le hemos agregado.
El método queue está íntimamente relacionado con la cola de efetos “fx” mencionado en
el apartado anterior. Usando este método podemos ver la lista de eventos encolados, o encolar
incluso otras acciones que no son efectos como tal.
. . .
<p id=”colaEfectos”>TEXTO</p>
<div>
</div>
<p id=”listaEfectos”></p>
. . .
En el script tendríamos:
} 467
$(‘#iniciaCola’).click(function(){
micapa.hide(2000);
notificaListaEfectos(String(‘hide(2000)’),2);
micapa.show(2000);
notificaListaEfectos(String(‘show(2000)’),3);
notificaListaEfectos(String(‘”font-size”: “5pt”’),5);
notificaListaEfectos(String(‘”font-size”: “27pt”’),6);
});
Si ejecutamos este código observaremos que por un lado se ejecutan los efectos y por
otro las notificaciones. Esto es porque el navegador agrega los efectos a su cola y los muestra
todos seguidos y sin interacción con el código, ya que hasta que no tiene todos los efectos no
tenemos la cola, por eso hemos agregado un alert(“Me han llamado”) para detener el código y
realmente ver qué está pasando.
En cada iteracción estoy agregando un valor más a la cola de propiedades del elemento,
y si comentamos esa línea nos dará la sensación de que ha calculado bien el número de efectos
(6) pero no nos va cambiando como esperábamos el texto en la página.
Supongo que estarás pensando en lo siguiente, si por un lado tenemos la cola de efectos
y el navegador ejecuta por otro lado el otro código, si quiero agregar otras funciones que no
sean animaciones como tal, ¿cómo se haría?
Para ello podemos usar el método .queue pero agregándole otros parámetros:
.queue([nombreCola], callback(continua))
Donde nombreCola sería opcional e indica el nombre de la cola donde encolar una
función. Si no se indica nada, se encolará a la cola predeterminada “fx”, se encola esa función en
la cola por defecto que gestiona jQuery por nosotros, ejecutando uno detrás de otro los efectos
468 del elemento. Si se indica un nombre, se encolará por nuestra cola y ésta la debemos gestionar
nosotros.
Para ayudarnos en todo el proceso, tenemos el método dequeue(), que puede recibir
un parámetro que es el nombre de la cola que se debe continuar ejecutándose. Si no indicamos
ninguna cola o indicamos el valor “fx”, la cola que seguirá procesándose por defecto.
. . .
<h4>Ejemplo 1: </h4><hr>
<p id=”colaEfectosQueue”>TEXTO</p>
<div>
</div>
. . .
M3. JQUERY
En el CSS:
#colaEfectosQueue {
color: orange;
font-size: 20pt;
Y en el script tendríamos:
. . .
notificaListaEfectosQueue(‘Inicio’, 0);
$(‘#iniciaColaQueue’).click(function(){
//-------------CSS y OTROS-----------------------------
micapaQueue.queue(function(){
$(this).css({
Aula Mentor
});
$(this).dequeue();
});
//-------------ANIMACION-------------------------------
//-------------OTROS-----------------------------
micapaQueue.queue(function(){
notificaListaEfectosQueue(‘hide(2000)’, 2);
$(this).dequeue();
});
470 //-------------ANIMACION-------------------------------
micapaQueue.hide(2000);
//-------------OTROS-----------------------------
micapaQueue.queue(function(){
notificaListaEfectosQueue(‘show(2000)’, 3);
$(this).dequeue();
});
//-------------ANIMACION-------------------------------
micapaQueue.show(2000);
//-------------OTROS-----------------------------
M3. JQUERY
micapaQueue.queue(function(){
$(this).dequeue();
});
//-------------ANIMACION-------------------------------
//-------------OTROS-----------------------------
micapaQueue.queue(function(){
$(this).dequeue();
});
//-------------ANIMACION-------------------------------
//-------------OTROS-----------------------------
micapaQueue.queue(function(){
$(this).dequeue();
});
//-------------ANIMACION-------------------------------
//-------------OTROS----------------------------
micapaQueue.queue(function(){
Aula Mentor
$(this).dequeue();
});
. . .
Cuando estamos realizando una animación con el método .stop() podemos parar la eje-
cución de la misma. Tiene la siguiente sintaxis:
.stop([limpiarCola],[irAlFinal])
Donde el parámetro limpiarCola sirve para eliminar todas las funciones que pudiera ha-
ber en la cola de efectos todavía por ejecutar, ya que si ejecutamos .stop() sin ningún parámetro
detendríamos sólo el efecto actual. Este parámetro es booleano indicando true detendrá toda la
cola, indicando false (u omitiendo el parámetro) detendremos sólo la animación actual.
El siguiente parámetro irAlFinal sirve para que se detenga el efecto de animación ac-
tual, pero que se coloque directamente en el valor final al que tendría ese efecto. Es un pará-
472 metro booleano, si se indica false, indica que la animación se para y se queda donde se había
detenido. Si indicamos true en este parámetro, aunque no se haya terminado el efecto, saltaría
al siguiente efecto, es decir se iría al final de la animación.
Veamos un ejemplo:
. . .
<button id=”start”>Iniciar</button>
<button id=”stop”>Parar</button>
<div id=”detenerEfectos”>jQUERY</div>
. . .
En el CSS tendríamos:
M3. JQUERY
#detenerEfectos{
background:lime;
height:80px;
width:210px;
position:absolute;
$(“#start”).click(function(){
$(“#detenerEfectos”).animate({left:’100px’},4500);
$(“#detenerEfectos”).animate({fontSize:’3em’},4500);
});
473
$(“#stop”).click(function(){
$(“#detenerEfectos”).stop();
});
$(“#stop2”).click(function(){
$(“#detenerEfectos”).stop(true);
});
$(“#stop3”).click(function(){
$(“#detenerEfectos”).stop(true,true);
});
Aula Mentor
5. Resumen.
- Todas las aplicaciones web suelen tener de una u otra forma algún formulario donde el
usuario nos introducirá los datos. jQuery nos proporciona muchos métodos para acceder
a ellos de forma concreta seleccionando qué tipo de campo o tipo de elemento es, y ten-
dríamos: :input, :submit, :text, :password, :radio, :checkbox, :checked, :selected, :disabled,
:enabled, :button, :image, :focus, :file, :reset.
- Para evitar sobrecarga de tráfico entre el servidor y los clientes, es conveniente hacer valida-
ciones de los datos que nos introduce el usuario en el formulario. Además éstas le ayudarán
para indicarles cómo es la forma correcta de rellenar los formularios. Existirían dos formas
de realizar estas validaciones, por nosotros mismos accediendo a los métodos y creando
las reglas pertinentes o de forma externa usando los métodos que nos proporciona jQuery
Validate. Existiendo ya predifinidas la mayoría de las funciones para comprobar datos del
formulario.
- jQuery puede interactuar también con las hojas de estilo CSS, accediendo y modificando las
propiedades definidas en el propio fichero .css. Tendríamos por tanto:
- Podemos emplear el uso de AJAX con jQuery a través de los métodos $.get(), $.post(), $get-
Script() y sobre todo del $.ajax(), pudiendo interactuar al igual que se hacía con JavaScript
pero de una forma más simplificada.
- Una forma de hacer aplicaciones web dinámicas, llamativas y que se diferencien del resto es
el uso de los efectos. Se pueden hacer los siguientes:
• Animaciones: .animate(Propiedades,[v],[Funcióndeanimación],[Callback])
1. jQuery UI.
Con el contenido de las unidades anteriores podemos desarrollar todo tipo de apli-
caciones web, ya que tenemos conocimientos sobre la página web con HTML5, el diseño o
maquetación con CSS3 y podemos interactuar enriquecidamente mediante jQuery. A partir de
esta unidad, vamos a ver otras formas de realizar aplicaciones web o detalles externos a tener
en cuenta en el desarrollo de nuestra aplicaciones.
jQuery fue un proyecto inicial donde se encontraban bibliotecas en JavaScript para fa-
475
cilitar la manipulación del DOM del documento, eventos y simplificar algunas acciones que ya
hacía JavaScript. Este proyecto fue creciendo y fueron añadiendo más bibliotecas, sobre todo
orientadas para que los diseñadores a la hora de implementar componentes de la web tuvieran
su tarea de una forma más sencilla.
Surgió entonces jQuery UI, que es una biblioteca de componentes para el framework
jQuery que le añade un conjunto de plug-ins, widgets y efectos visuales para la creación de
aplicaciones web. Cada componente o módulo se desarrolla de acuerdo a la filosofía de jQuery
(find something, manipulate it: encuentra algo, manipúlalo).
Para usar jQuery UI necesitamos al igual que cuando usábamos jQuery descargar un
archivo, éste contendrá las librerías que vamos a usar. Depende de la aplicación o el documento
en el que estemos trabajando, es posible que no necesitemos todas las librerías, sino sólo parte
de ellas que contendrán los elementos que vamos a usar nosotros.
Para descargarnos las librerias tenemos que irnos a la página de descargas oficial:
http://jqueryui.com/download/
Nos aparecerán una página con unos checkbox donde elegiremos qué opciones son las
que vamos a usar; para descargarnos exclusivamente aquellos componentes que vamos a usar,
en nuestro caso vamos a descargarnos la versión completa y dependiendo de la unidad tendre-
mos aquellas partes para no cargar mucho el documento o página web.
Aula Mentor
En el desarrollo de este manual está la versión jQueryUI 1.11.0, es muy probable que
cuando estés realizando el curso exista otra versión, ya que cada mes o mes y medio salen nue-
vas actualizaciones o mejoras, hay muchos programadores detrás de este proyecto y cada vez
van aportando nuevos códigos. De todas formas, en los recursos del curso hay una carpeta don-
de podrás descargarte todos los archivos que están en relación exacta con el curso y además, lo
más probable es que no tengas muchos problemas para usar la última versión existente, ya que
en muchos casos son totalmente compatibles con otras versiones, por lo que hay que revisar la
documentación.
476
Versión: Cada versión de jQuery UI está preparada para funcionar con una
versión de framework jQuery.
http://jqueryui.com/themeroller/
jquery-ui-1.11.0.custom.zip
Y si hemos elegido todas las opciones posibles habremos observado que tiene un tama-
ño de casi 2MB, por lo que es un tamaño grande y no recomendable en la mayoría de los casos.
Sería necesario ver qué apartados realmente vamos a necesitar y sino vamos a insertar algún
componente no seleccionarlo ya que sólo ralentizaremos la web en dispositivos con menos re-
cursos.
En esta versión parece que la tendencia según las últimas versiones es descargar los ar-
chivos css, js, quedando una estructura como ésta:
Tenemos que tener en cuenta que esta descarga nos proporciona todo lo necesario para
funcionar independientemente, de ahí que trae todo, incluso el archivo jQuery para funcionar. 477
external: Carpeta donde tendremos fichero externos al jQueryUI, en este caso el fichero
jQuery JavaScript Library v1.10.2
images: Carpeta donde se alojarán las imágenes necesarias del tema descargado, fondos
e iconos.
Luego tendremos dos archivos que son realmente los que vamos a necesitar para poder
usar jQueryUI con este tema, como ya estamos acostumbrados en el framework de jquery, siem-
pre nos proporcionarán la versión mínima (nombre-archivo.min.extensión) para usarla cuando
esté en fase de producción.
Recordemos que usualmente mientras estamos creando nuestra aplicación web, estamos
en fase de desarrollo y es posible que necesitemos ver el código fuente original, ver cómo está
implementado y la documentación al respecto. Cuando ya hemos probado la web y queremos
lanzarla a Internet o a nuestra Intranet de empresa, tendríamos que pasarla a fase de produc-
ción, donde se optimiza el archivo eliminando comentarios, tabuladores y saltos de líneas inne-
cesarios ya que el navegador no los utiliza.
Aula Mentor
<script src=”jquery-ui.js”></script>
<script src=”jquery.js”></script>
Por ello vamos a partir de nuestra estructura de directorios que hemos estado usando
todo el curso:
Vamos a tener todas las carpetas vacías menos la carpeta js donde vamos a mantener
el archivo jquery-1.11.1.min.js y jquery-1.11.1.js. Tenemos que asegurarnos muy bien donde
tenemos los archivos CSS y los JS, ya que la mayoría de las veces, el error está en nuestro script
y es por no haber llamado correctamente el nombre o ruta del archivo.
1.2. Acordeón.
478
Un efecto que ya hemos usado anteriormente de forma manual pero que el plugins de
jQueryUI nos trae de una forma muy llamativa es el efecto acordeón, donde conforme se va ha-
ciendo click en el componente va desplegándose y cerrándose con sus correspodientes efectos:
Para ello tendríamos que tener la estructura anterior descrita (con los correspondientes
archivos css y js) y el siguiente contenido en nuestro archivo HTML5, por ser la primera vez voy
a agregar todo el código completo, aunque también puedes verlo en los recursos del curso.
<!DOCTYPE html>
<html lang=”es”>
<head>
M3. JQUERY
<title>Módulo jQueryUI</title>
<!-- Fichero que se refiere a jQuery UI para poder usar sus diseños -->
<!-- Añadimos la hoja de estilo de jQuery UI para poder usar sus diseños-->
479
</head>
<body>
<section>
<article>
<div id=”miAcordeon”>
Aula Mentor
<h3>Elemento 1</h3>
<h3>Elemento 2</h3>
<h3>Elemento 3</h3>
<h3>Elemento 4</h3>
</div>
</article>
480 </section>
</body>
</html>
Lo único que hemos tenido que declarar es una capa de tipo miAcordeon para poder
seleccionarla/buscarla en mi script jQuery (como hemos estado realizando todo el curso) y a
continuación tenemos que usar el método:
.accordion();
$(document).ready(function(){
$( “#miAcordeon” ).accordion();
Ten en cuenta que no hemos declarado ningún archivo propio CSS ya que estamos
usando los que usa por defecto el plugins. Además si nos fijamos, este efecto está usando va-
rios elementos (efectos, propiedades y estilos) que, aunque ya sabemos nosotros crearlos desde
cero, nos facilitan mucho ya que estaría todo creado previamente.
M3. JQUERY
Cuando el foco está en el header del elemento podemos usar los siguientes elementos:
ESPACIO/ENTER: Activa el panel asociado al elemento cabecera que está en ese momento.
Al fin y al cabo, no dejan de ser unos archivos con hojas de estilo predefinidas, el widget
acordeon de jQuery UI CSS especifica unas reglas concretas, pero si necesitas saber a que estilos
se está refiriendo siempre los puedes ver en la documentación oficial, en este caso verás que
puedes usar:
481
ui-accordion: El contenedor del acordeón.
UI Core Núcleo de UI
Existen muchos parámetros y funciones que puedes modificar y configurar, en caso que
necesites más información puedes recurrir a la documentación oficial:
http://api.jqueryui.com/accordion/
Aula Mentor
1.3. Autocompletar.
Uno de los efectos y elementos que es muy interesante para el usuario es ayudarle en
la escritura y simplificación en la elección de los elementos. Para ello, jQuery UI nos facilita un
elemento que se llama autocomplete, en el que conforme va escribiendo el usuario, van saliendo
las opciones más similares a su búsqueda.
.autocomplete()
A este método se le ha de pasar al menos una lista de nombres, para ello usamos la sin-
taxis:
$(miSeleccion ).autocomplete({
source: Lista
});
Jesús, José , Antonio, Andrés, Luis, Mario, Miguel Ángel, Francisco, Juan, Javier, María, Guada-
lupe, Raquel, Rosa, Alicia, Dolores.
482
Queremos que cuando el usuario empiece a escribir su nombre, si éste está en la lista le
vaya ayudando en la decisión agilizando todo el proceso.
. . .
<div>
</div>
. . .
$(document).ready(function(){
var listaNombres = [
“Jesús”,
“José” ,
“Antonio”,
“Andrés”,
“Luis”,
“Mario”,
“Francisco”,
“Juan”,
“Javier”,
“María”,
“Guadalupe”,
“Raquel”,
“Rosa”,
“Alicia”,
“Dolores”
];
$( “#miAutocomplete” ).autocomplete({
source: listaNombres
Aula Mentor
});
Debemos pensar que estos nombres en algunos casos serán siempre los mismos, por
ejemplo si estamos en un formulario donde preguntamos al usuario sobre la provincia donde
nació, estás son estáticas y siempre serán las mismas y podíamos usarlo de esta forma. Pero en
otros casos esta lista será dinámica, cogida de una Base de Datos, de otra web o servidor. Para
facilitar los posibles cambios es una buena práctica cargar la lista de nombres o bien con una
variable independiente, o con una función. Al realizarlo así, tenemos algo parecido a esto:
$( “#miAutocomplete” ).autocomplete({
source: dameNombres()
});
Así estamos llamando a una función que se llama dameNombres() y realmente nos daría
igual de que forma obtenemos los nombres, hoy puede ser de forma estática y en un futuro,
podemos usar otros métodos, pero si hemos trabajado así, el mantenimiento del código será
siempre más sencillo:
var listaNombres = [
“Jesús”,
“José” ,
“Antonio”,
“Andrés”,
“Luis”,
“Mario”,
“Miguel Ángel”,
“Francisco”,
“Juan”,
“Javier”,
M3. JQUERY
“María”,
“Guadalupe”,
“Raquel”,
“Rosa”,
“Alicia”,
“Dolores”
];
return listaNombres;
Existen muchos parámetros y funciones que puedes modificar y configurar, en caso que necesi- 485
tes más información puedes recurrir a la documentación oficial:
http://api.jqueryui.com/autocomplete/
1.4. Botones.
Otro elemento que no puede faltar en cualquier aplicación web son botones, y claro
está, jQueryUI nos facilita también varias formas de declararlos. Para ello tenemos el método
para crear, o dar formato de botones siguiente:
.button()
. . .
. . .
Y en el jQuery tendríamos que seleccionar nuestros elementos y decirle a todos ellos que
les aplique el método .button() de jQueryUI.
$(document).ready(function(){
$( “input[type=submit], a, button” )
.button()
//Eliminamos la acción por defecto del evento .click para este ejemplo.
event.preventDefault();
});
Aunque podemos pensar que este método no es nada útil, ya que hemos visto muchas
formas en el curso de crear botones, sólo con apenas tres líneas hemos creado los botones con
ese estilo, que de hacerlo de forma manual tendríamos que definir: un fondo concreto, una
fuente de texto y color agradable y en sintonía con los demás, además de tener que controlar
todos los eventos cuando pase por encima de cada botón, crear nuevos fondos, color de borde,
color de texto, etc. Realmente estamos totalmente capacitados para realizar un botón con una
apariencia igual o mejor que ésta, lo único que jQueryUI nos ofrece muchos temas, colores y
demás estilos predefinidos, y en muchas situaciones cuando tengamos que desarrollar una apli-
cación de forma rápida.
Existen muchos parámetros y funciones que puedes modificar y configurar, en caso que
necesites más información puedes recurrir a la documentación oficial:
M3. JQUERY
http://api.jqueryui.com/button/
1.5. Calendario.
Muchas veces cuando estamos realizando un formulario, necesitamos que el usuario nos
introduzca una fecha, por ejemplo, la fecha de nacimiento, la fecha de una cita, etc; en definitva
un campo en el que el usuario necesita introducir un dato de tipo fecha y tenemos que asegu-
rarnos que el formato de fecha es correcto y sea una forma agradable y fácil para él.
.datepicker()
Con él nos ahorraremos mucho tiempo de programación ya que nos da todo realizado,
los días de cada mes, y una forma de ir interactuando entre ellos (pasar de mes). Como ya sa-
bemos existen muchos temas, y cada tema tiene su estilo correspondiente y todos los elementos
estarían en concordancia con los demás componentes, por eso, lo ideal es escoger un tema
apropiado o crearnos uno por nuestra cuenta, como veremos en temas posteriores.
487
Ejemplos de calendarios en los diferentes temas:
Para usar el calendario, no tenemos que usar mucho código, debemos asociarlo a un
campo del formulario en el HTML y posteriormente llamar al calendario desde jQuery UI. En el
documento HTML tendríamos que crearnos un campo de tipo texto y asociarle un id para poder
llamarlo desde el script de jQuery:
. . .
. . .
Aula Mentor
$(document).ready(function(){
$( “#miCalendario” ).datepicker();
Y realmente con apenas dos líneas de código, hemos creado un calendario muy vistoso
y útil. Cuando pulsemos en la fecha, directamente nos parecerá la fecha en formato MM/DD/
AAAA:
488
Existen muchos parámetros y funciones que puedes modificar y configurar, en caso que
necesites más información puedes recurrir a la documentación oficial:
http://api.jqueryui.com/datepicker/
1.6. Diálogos.
Cuando necesitemos usar diálogos, podemos recurrir también a jQueryUI, así mostramos
diálogos más personalizados a los que tiene por defecto el navegador. Es muy interesante para
aquellos casos que queramos dar más personalización a nuestra página y destacar sobre otras,
ya que son diferentes y más agradables.
Para usar los diálogos con jQueryUI tenemos que usar el método:
.dialog()
. . .
<p>Este texto será el que aparecerá en el diálogo. Esta ventana la puede mover o cerrar el usuario.</
p>
M3. JQUERY
</div>
. . .
$(document).ready(function(){
$( “#miDialogo” ).dialog();
El resultado sería un diálogo en sintonía con la página, todo esto por usar el mismo tema
de diseño:
http://api.jqueryui.com/dialog/
489
1.7. Menús.
Toda aplicación o página web debe tener un menú o forma de interactuar entre las
diferentes secciones de la página. En el módulo de CSS3 vimos muchos métodos y menús dife-
rentes, sabemos cómo se hacen y en qué están basados la mayoría. Para ayudarnos en esta tarea
tan común, jQueryUI también nos proporciona una forma de crear nuestros menús, y de igual
forma, se suele usar listas para crear los nombres de los menús, hoy en día es casi impensable
usar imágenes; se hace más hincapié en el CSS3 y así se agiliza la página.
Para usar el método menú de jQueryUI, sólo tenemos que usar el siguiente método:
.menu()
Vamos a coger literalmente el texto del ejemplo del ejercicio 6.2.2 para demostrar que si
realizamos una buena semántica en el documento HTML, poder hacer cambios posteriormente
es muy sencillo. El código HTML que teníamos para el menú lo hicimos con lista y tenía la si-
guiente estructura:
<ul id=”menu”>
<li>INICIO</li>
<li>Sección 1
<ul class=”submenu”>
Aula Mentor
<li>Elemento 1</li>
<li>Elemento 2</li>
<li>Elemento 3</li>
<li>Elemento 4</li>
</ul>
</li>
<li>Sección 2
<ul class=”submenu”>
<li>Elemento 1</li>
<li>Elemento 2</li>
<li>Elemento 3</li>
<li>Elemento 4</li>
490 </ul>
</li>
<li>Seccion 3
<ul class=”submenu”>
<li>Elemento 1</li>
<li>Elemento 2</li>
<li>Elemento 3</li>
<li>Elemento 4</li>
</ul>
</li>
M3. JQUERY
<li>Seccion 4
<ul class=”submenu”>
<li>Elemento 1</li>
<li>Elemento 2</li>
<li>Elemento 3</li>
<li>Elemento 4</li>
</ul>
</li>
</ul>
Y en el CSS sólo necesitamos delimitar el ancho del menú, ya bien dentro del fichero CSS
o si lo hacemos dentro del head:
<style>
$(document).ready(function(){
$( “#menu” ).menu();
Nuevamente con muy pocas líneas hemos realizado un menú desplegable y además,
tenemos muchos temas para poder usarlos. El ejemplo, quedaría de la siguiente forma, debes
fijarte que ha contado muchas opciones y cambios de colores, bordes, sombreado, etc que ten-
dríamos que hacer con CSS nosotros mismos:
Existen muchos parámetros y funciones que puedes modificar y configurar, en caso que
necesites más información puedes recurrir a la documentación oficial:
http://api.jqueryui.com/menu/
Cuando estamos usando una barra de progreso, jQuery UI nos ofrece una forma muy
sencilla y con muy buen aspecto gráfico. Para ello, podemos usar la sintaxis siguiente:
.progressbar({
value: 00
});
Donde value nos indica el valor en el que estaría la barra de progreso en ese momento,
siendo 0 el menor y 100 el mayor o la barra completa. Para usarlo, sólo debemos de agregar al
documento HTML el siguiente código:
. . .
</div>
. . .
En el jQuery tendríamos:
$(document).ready(function(){
$( “#miBarraProgreso” ).progressbar({
value: 56
});
Veamos un ejemplo que sea más automático, es decir que veamos como va aumentando
la barra de progreso según unos parámetros, estos parámetros, ahora van a ser simulados, pero
ayudarán a entender mejor este método:
. . .
<div id=”miBarraProgreso2”>
</div>
</div>
. . .
Y este al jQuery:
miProgressbar.progressbar({
value: false,
change: function() {
},
complete: function() {
});
function progreso() {
if ( val < 99 ) {
Lo que va realizando este código es hacer aumentar automáticamente el valor con (val
+2) y vamos a su vez insertando temporizaciones, tanto para iniciar el script como para los in-
tervalos en cada cuenta.
Hemos usado dos parámetros de la función, change para la acción que vayamos hacer
mientras haya un cambio, en este caso mostrar el valor del %. Y otra función cuando termine,
complete, que en este caso, muestra un texto “¡Simulación completa!”
494 También debemos prestar atención a un método que hemos usado que es:
Con esta función lo que hacemos es simular tiempos de espera, ya que se ejecutará la
función indicada en el primer parámetro, pasado el tiempo expresado en milisegundos del se-
gundo parámetro.
setTimeout( progreso, 80 );
Indicando que ejecute la función progreso en 0.12 segundos, creando el efecto de carga
simulada de un archivo, de una web, etc.
Todo este ejemplo viene descrito por una simulación, y de paso hemos aprovechado
para aprender la función setTimeout, pero en una aplicación real tendremos que calcular ese
tiempo con datos reales, por ejemplo en la subida de un archivo, si éste ocupa 10.000MB, y
lleva 1.000MB tendrá un 10% subido y en cada actualización podemos incluso indicar cuántos
MegaBytes se han subido.
M3. JQUERY
Puedes ver el ejercicio comentado en los recursos del curso, recuerda que sería impor-
tante que intentaras crearlos tú desde cero para coger una soltura real con todos los módulos
que estamos trabajando:
http://api.jqueryui.com/progressbar/
.selectmenu();
Vamos a ver un ejemplo con varios ejemplo de menus, uno simple, otro con varios gru-
pos, y otro con muchos elementos para ver cómo los presenta el plugins.
select {
width: 200px;
Y en el script de jQuery:
$(document).ready(function(){
$( “#idioma” ).selectmenu();
Aula Mentor
$( “#nivelIdioma” ).selectmenu();
$( “#edad” )
.selectmenu()
.selectmenu( “menuWidget” );
Hemos usado la opción menuWidget del la opción .selectmenu() existen muchas opcio-
nes donde puedes ir probando y practicando, para ello, siempre disponemos de la documenta-
ción oficial con todos sus parámetros.
http://api.jqueryui.com/selectmenu/
1.10. Slider.
.slider()
Para poder usarlo en nuestras aplicaciones web, tenemos que usar muy poco código,
veamos un ejemplo sencillo. En el HTML tendríamos que tener:
<div id=”miSlider”></div>
$(document).ready(function(){
$(“#miSlider”).slider();
Con este ejemplo hemos creado un slider, podemos mover y desplazarlo a la derecha
o izquierda, pero realmente, no nos sería muy práctico en nuestros formularios. Uno entre los
tantos ejemplos que podemos usar, sería que ese desplazamiento estuviera relacionado con las
opciones de un componente <select></select>:
<form id=”formulario”>
<option>1</option>
<option>2</option>
<option>3</option>
497
<option>4</option>
<option>5</option>
<option>6</option>
</select>
</form>
min: 1,
max: 6,
range: “min”,
});
$( “#misHabitaciones” ).change(function() {
});
Con este script vamos actualizando el valor del <select> cada vez que hay algún cambio
(change). Vamos modificando el valor del select dentro de sus valores, que pueden ser numéri-
cos o alfanuméricos:
Existen muchas formas interesantes resueltas sobre los slider, simulando ecualizadores,
mezcladores de colores y todos los que se te ocurran. Te recomiendo que una vez entendidos
estos ejemplos, si tienes tiempo puedas ampliar información sobre ellos en la documentación
oficial http://api.jqueryui.com/slider/ y verás cómo agregar efectos y elementos de una forma
sencilla.
498
1.11. Spinner.
Cuando tengamos que usar valores numéricos, otro componente muy utilizado es el uso
de spinner, teniendo la opción de aumentar y disminuir el valor del campo para poder rescatar-
lo.
Para hacerlo más didáctico vamos a insertar varios botones para poder ver cómo interac-
túa el componente con el usuario:
M3. JQUERY
<p>
</p>
<p>
</p>
<p>
499
</p>
$(document).ready(function(){
/*-------------------------------------------------
-------------------------------------------------*/
$( “#desactiva” ).click(function() {
Aula Mentor
miSpinner.spinner( “enable” );
} else {
miSpinner.spinner( “disable” );
});
/*-------------------------------------------------
-------------------------------------------------*/
if ( miSpinner.spinner( “instance” ) ) {
miSpinner.spinner( “destroy” );
} else {
miSpinner.spinner();
});
/*-------------------------------------------------
-------------------------------------------------*/
$( “#dameValor” ).click(function() {
});
/*-------------------------------------------------
el valor 5 en el spinner
-------------------------------------------------*/
$( “#insertaValor” ).click(function() {
miSpinner.spinner( “value”, 5 );
});
501
/*-------------------------------------------------
-------------------------------------------------*/
$( “button” ).button();
1.12. Tabs.
Una forma de organizar las páginas web y mostrar al usuario diferentes opciones son las
tabs o pestañas también llamadas tab-bar. Seguro que las has visto sobre todo en aplicaciones
para Smartphone u otros dispositivos. Para crear unas pestañas debemos usar el método:
Aula Mentor
.tabs()
. . .
<div id=”misTabs”>
<ul>
502
</ul>
<div id=”tabs-1”>
</div>
<div id=”tabs-2”>
</div>
<div id=”tabs-3”>
</div>
</div>
. . .
M3. JQUERY
Si nos fijamos tendríamos tres partes bien diferenciadas; el contenedor que contendrá
todo el conjunto (div id=”misTabs”), otra donde tenemos las opciones superiores de las pesta-
ñas que declaramos como una lista <ul> <li>…</li></ul> y otra donde declaramos el contenido
interior de cada pestaña <div id=”tabs-n”>.
Ahora en el script jQuery sólo tenemos que definir las siguientes líneas:
$(document).ready(function(){
$( “#misTabs” ).tabs();
1.13. Tooltip.
Por último vamos a ver los elementos tooltip, indispensable para ayudar al usuario cuan-
do está navegando por nuestra web o rellenando nuestros formularios. Este tipo de ayuda se
presenta normalmente al pasar el ratón por encima, al coger el elemento o el foco. Esta infor-
mación puede ser texto o incluir más cosas, imágenes u otros componentes, para ello existe el
método:
503
.tooltip()
puede estar unido a cualquier elemento. Al pasar el ratón por el elemento, el atributo title se muestra
en una pequeña caja al lado del elemento</p>
<p>
</p>
<label for=”dni”>DNI:</label>
Aula Mentor
<input id=”dni” title=”Introduce tu dni con la letra seguida (sin caracteres ni espacios) y en mayús-
cula”></p>
</div>
$(document).ready(function(){
$(this).tooltip();
Como podemos darnos cuenta, directamente todo lo que pongamos como title será
detectado por el método y le agregará la información. En este caso y como queremos que se
aplique a todo el documento hemos dicho que todo el $(document) cuando sea leído, use el
elemento con él mismo (this). Se podría haber realizado una selección más exahustiva, pero para
el ejemplo viene bien ya que deseamos que se active para todos los componentes susceptibles
de tener tooltip.
504
http://plugins.jquery.com
http://jquery-plugins.net
Podemos por tanto, desarrollar nuestros propios plugins, para que terceras personas
aprovechen el código desarrollado. Existen varias formas de realizar plugins, algunas simple-
mente ponen disponibles nuevas funciones globales a nuestro jQuery.
Las funciones globales son en realidad métodos del objeto jQuery, pero en un sentido
práctico, son funciones dentro de un espacio de nombres jQuery. Un ejemplo de ello sería la
función $.ajax(), en ella todo lo que $.ajax() realiza se podría conseguir con una función global
denominada $.ajax(), pero este enfoque nos dejaría abiertos a conflictos de nombres de función.
Al situar la función dentro del espacio de nombre jQuery, solamente nos tenemos que preocupar
por conflictos con otros métodos jQuery.
Para añadir una nueva función al espacio de nombre jQuery, podemos simplemente
asignar la nueva función como una propiedad del objeto jQuery:
jQuery.globalFunction = function(){
//Mi código
jQuery.globalFunction();
$.globalFunction();
Así podríamos usar nuestra llamada a la función de forma básica y en este ejemplo mos-
trará por consola el texto indicado.
jQuery.functionOne = function(){
jQuery.functionTwo = function(){
}
Aula Mentor
jQuery.functionThree = function(miVariable){
$.functionOne();
$.functionTwo();
$.functionThree(‘Hola’);
Se puede utilizar otra sintaxis para definir nuestras funciones, que es usar $.extend(),
pero tenemos que tener cuidado al utilizar el mismo espacio de nombres de jQuery, podríamos
tener conflictos con nombres de función definidos en otros plugins jQuery.
jQuery.extend({
jQuery.functionOne : function(){
506 },
jQuery.functionTwo : function(){
},
jQuery.functionThree : function(miVariable){
});
Para evitar conflictos muchas veces es mejor encapsular todas las funciones globales
para un plugin concreto en un objeto de la siguiente forma:
jQuery.miPlugin = {
jQuery.functionOne : function(){
};
jQuery.functionTwo : function(){
};
jQuery.functionThree : function(miVariable){
};
};
Esta forma de trabajar crea realmente otro espacio de nombres para nuestras funciones
globales, denominado jQuery.miPlugin. Ahora las funciones que hay declaradas, realmente
serían métodos del objeto jQuery.miPlugin, una propiedad del objeto global jQuery. Por tanto
para poder usar estas funciones debemos anteponer el nombre miPlugin antes de llamar a los
otros métodos así no tendrá conflictos.
$.miPlugin.functionOne();
$.miPlugin.functionTwo(); 507
$.miPlugin.functionThree(‘Hola’);
Así evitamos colisiones con otros espacios de nombres y plugins, es la forma de asegu-
rarnos de estar totalmente protegidos ante errores externos a nuestro pluging.
La mayoría de la funcionalidad de jQuery viene a través del uso de sus métodos de ob-
jeto, y aquí es donde los plugins también destacan. Siempre que escribimos una función que
actúa sobre parte del DOM, es apropidado crear un método “.” de objeto.
jQuery.fn.miMetodo = function(){
//Mi código
console.log(‘Soy un método’);
$(miSeleccion).miMetodo();
Nuestro método se invocará sobre el elemento de selección que haya declarado, po-
dríamos haber declarado una función global, sin embargo, puesto que no hemos utilizado los
nodos DOM coincidentes en ningún sentido. Una implementación de método razonable actuará
siempre sobre su contexto.
Una vez hemos realizado todo nuestro código, creando funciones, métodos, etc pode-
mos publicarlo de modo que otros puedan utilizarlo y benificiarse de él, como tú, en otras oca-
siones te has podido benificiar de otros códigos, puedes hacer esto en el repositorio de plugins
oficial de jQuery http://plugins.jquery.com. Aquí debemos registrarnos, seguir las instrucciones
para describir el plugin y subir el archivo con el código comprimido en .zip.
Por supuesto antes de subir ningún plugins debemos asegurarnos que el plugin está co-
rrecto para el público, existen una reglas a seguir cuando se escriben plugins para que funcione
bien con otros códigos:
Los plugins jQuery pueden no asumir que el alias $ se encuentra disponible, en su lugar
debe escribir el nombre jQuery completo cada vez, que en el caso de usar script muy extenso
puede ocasionar lentitud y dificultar la lectura.
508
Interfaces del método
Todos los métodos jQuery se invocan dentro del contexto de un objeto jQuery, de modo
que this, hace referencia a un objeto que puede hacer referencia a uno o más elementos DOM.
Todos los métodos deben comportarse correctamente con independencia del número de ele-
mento coincidentes.
Estilo de documentación
/**
*@alias
*@author
*@classDescription
*@constructor
*@deprecated
M3. JQUERY
*@example
*@exception
*@id
*@inherits
*@internal
*@memberOf
*@method
*@namespace
*@param
*@private
*@projectDescription
*@property
*@return 509
*@see
*@since
*@type
*@version
**/
Por supuesto no es obligatorio rellenar todos para cada función, hay que pensar que la
documentación está pensada para facilitar y ayudar a otras personas que no han desarrollado el
código a que puedan usarlo y entenderlo correctamente.
Usualmente en la definición del fichero se agregan los datos de versión, autor, copyrigth
y otros, para saber de forma global qué va a contener el fichero. Por ejemplo, si abrimos un
archivo de jquery, veremos que inicialmente nos dá información, en concreto para la versión
jquery-1.11.1.js nos da la siguiente información:
/*!
* http://jquery.com/
Aula Mentor
* Includes Sizzle.js
* http://sizzlejs.com/
* http://jquery.org/license
* Date: 2014-05-01T17:42Z
*/
Existen programas y proyectos que se han ocupado que posteriormente toda esa docu-
mentación podamos verla de una forma más agradable y vistosa, para Java, C++ existe Doxigen
y para JavaScript hay un proyecto nuevo llamado JSDuck.
510
3. Resumen.
- jQuery UI, es una biblioteca de componentes para el framework jQuery que le añade un
conjunto de plug-ins, widgets y efectos visuales para la creación de aplicaciones web. Cada
componente o módulo se desarrolla de acuerdo a la filosofía de jQuery (find something,
manipulate it: encuentra algo, manipúlalo).
- Para la instalación de jQuery UI, nos tendremos que descargar unos archivos dependiendo
de la versión de jQuery que estemos trabajando. Una vez descargados agregamos sus temas,
funciones y podremos utilizar muchos elementos de forma automática:
Acordeón: .accordion()
Autocomplete: .autocomplete()
Botón: .button()
Calendario: .datepicker()
Diálogos: .dialog()
Menús: .menu()
Spinner: .spinner()
Tabs: .tabs()
Tooltip: .tooltip()
- Podemos desarrollar nuestros propios plugins para que otros desarrolladores web puedan
utilizar nuestro código. Éste lo tenemos que hacer siguiendo unas reglas para no interceder
con otros métodos de jQuery, si no podríamos crear conflictos entre el propio código y no
funcionaría. Para ello, tenemos varias opciones:
511
Módulo 4. Aplicaciones
Web Multiplataforma
1. Introducción.
En los módulos anteriores hemos aprendido a realizar web usando HTML5, CSS3 y
JQUERY, realmente todas las páginas web que hemos desarrollado en el curso van a ser visibles
por los navegadores de SmartPhone, Tablets, Pc e incluso SmartTv. Con lo que ya sabemos po-
dríamos realizar cualquier web para todos los dispositivos pero hay que reconocer que las di-
mensiones de cada dispositivo van a ser diferentes y eso va a ocasionar en el usuario que tenga
que estar ampliando/reduciendo la pantalla para poder disfrutar del contenido del mismo.
514
Últimamente se ha optado por desarrollar dos páginas web, una adaptada para pocos
dispositivos con pantallas grandes y otra para cuando el usuario está accediendo a través de un
Smartphone o Tablets. Claro está, esta última suele ser una versión más reducida y centrada en
la parte de interacción con el usuario, por ejemplo la mayoría de los bancos, no tienen la misma
interfaz cuando accedes desde un Smartphone o Tablets a cuando accedes con un ordenador
personal, en el ordenador personal aprovechan y meten más gráficos, imágenes, publicidad y
realizan en definitiva una web más pesada.
Al igual que nos pasó con jQueryUI en la unidad 8, jQuery en su empeño de estar en
contacto con los desarrolladores creó jQuery Mobile para ayudar a los diseñadores y desarro-
lladores, a proporcionar Webs para móviles con un alto nivel de usabilidad, multiplataforma,
personalizables y fáciles de usar.
“Es un sistema unificado de interfaces de usuario para todas las plataformas populares
de dispositivos móviles, creado sobre los sólidos fundamentos de jQuery y jQueryUI. Su ligero có-
digo se desarrolla usando la mejora progresiva, y posee un diseño flexible al que es fácil aplicar
temas”.
Una vez leída la definición, nos haremos la pregunta, ¿para que navegadores es compa-
tible jQuery Mobile?
iOS: Safari para iPhone, iPod Touch, e iPad desde iOS 3.2
http://jquerymobile.com/gbs
B-grade: El navegador posee una interfaz mejorada, pero sin funcionalidades AJAX en la
navegación.
2) Servidor web. Podemos seguir usando el que instalamos, Wamp, Lamp o Mamp.
3) Navegador o emulador. Ahora debemos tener en cuenta que vamos a hacer páginas
desde el punto de vista de un Smartphone o Tablets, por lo que necesitaremos un
emulador o navegador real. Comentar que existen en el mercado un gran número de
Aula Mentor
Ya que tendríamos instalado todo en nuestro equipo para poder seguir trabajando con
jQuery Mobile, vamos a repasar cómo podemos conmutar entre web emulada desde dispositivo
móvil o web desde navegador de pc.
Para ello nos vamos al navegador Google Chrome, pulsamos en la parte superior dere-
cha donde está el icono de color verde
Al pulsar Enable nos aparece un menú con diferentes opciones, estas opciones día a día
van añadiendo dispositivos y nuevas funcionalidades, y pueden ser diferentes, en definitiva son
diferentes dispostivos o emuladores de dispositivos:
También este emulador nos ofrece las siguientes opciones en el menú de la derecha:
Geo Location: Muy útil cuando queramos simular coordenadas y probar que
nuestra aplicación la está utilizando correctamente.
Aula Mentor
Un punto muy importante de usar este editor es que podemos instalar ayudas/Snippet
ya creados para trabajar con jQuery Mobile, por lo que tendremos muchas acciones de forma
automática disponibles para usar en nuestros documentos.
https://sublime.wbond.net/installation#st2
En él aparece un código que debemos copiar, lo pego aquí de todas formas, aunque
siempre es bueno copiarlo de ahí por si hay alguna modificación:
Ahora nos vamos a nuestro programa Sublime Text2 y creamos un fichero nuevo, en File
- New File, y posteriormente nos vamos a View - Show console (Ctr +)
Nos aparecerá en la parte inferior una consola donde debemos pegar el texto que tenía-
mos copiado en el portapapeles en la consola y pulsamos enter:
Debemos cerrar Sublime Text2 y volverlo abrir para que se agreguen los paquetes de
ayuda. Una vez reiniciado nos vamos de nuevo a Sublime Text2 y pulsamos las teclas Ctrl +
Shift + P o en MAC Shift + P y nos aparecerá una ventana de ayuda de los Snippet .
M4. Aplicaciones Web Multiplataforma
Escribimos en esta ventana Install Package, aunque con el autocomplete que proporcio-
na no será necesario, debemos seleccionar la opción Package Control: Install Package
Nos abrirá una nueva ventana y vamos a buscar el paquete jQuery Mobile Snippet y
seleccionamos la versión para Sublime Text2
Una vez seleccionado se instalarán todos los Snippets de jQuery Mobile. Debemos cerrar
nuevamente Sublime Text 2 y volverlo abrir.
519
Y ahora si nos vamos al documento nuevo, y empezamos a escribir jqm y pulsamos Ctrl
+ Barra Espaciadora nos saldrán todos los snippets de jQuery Mobile:
Si seleccionamos la primera opción donde pone Basic semantic page veremos que nos
ha escrito la estructura básica para usar jQuery Mobile a nivel de página y secciones:
Aula Mentor
No te preocupes si ves atributos que nunca habías visto que empiezan por data-role ya
que lo veremos en el siguiente apartado. También podemos buscar los elementos con Ctrl +
Shift + P y seleccionar lo que vayamos a necesitar, de una forma automatizada:
<ul data-role=”listview”>
<li><a href=”#”>item1</a></li>
<li><a href=”#”>item2</a></li>
<li><a href=”#”>item3</a></li>
520
</ul>
En el siguiente punto vamos a profundizar más sobre la estructura que tiene una página
con jQuery Mobile, ahora debes entender que tenemos un editor de texto con la mayoría de
los snippets creados para jQuery Mobile, además con parámetros para directamente cambiar los
nombres y entonces agregar sólo el contenido.
Todos estos detalles van a ser los que te van a diferenciar de un programador que no
utilice este tipo de programas. Además como ya aprendimos en el módulo 1 más funciones de
Sublime Text 2 para agregar nuestros propios Snippet, poco a poco tendrás una buena biblioteca
y desarrollarás páginas muy rápidamente.
3. Estructura básica.
Para usar una página web con jQuery Mobile, sólo tendremos que saber HTML5 y agre-
gar los siguientes enlaces:
Es posible que en algunos casos el tema usado utilice imágenes para la parte de la inter-
faz gráfica, en este caso tenemos que tenerlo en cuenta.
M4. Aplicaciones Web Multiplataforma
Al igual que nos ha pasado durante todo el curso, debemos tomar la decisión de ¿dón-
de vamos a alojar estos archivos? De forma local o remota, o a través por ejemplo de un CDN
(Content Delivery Network) Red de entrega de contenidos. Cada uno tiene sus ventajas y sus
inconvenientes como ya hemos comentado anteriormente. En este caso, y sobre todo para no
tener que depender de internet para realizar el curso, vamos a usarlo de forma local, además
si en un futuro se quiere empaquetar la aplicación como nativa, nunca debes usar CDN como
medio para cargar los archivos de JQuery Mobile.
En caso que sea una aplicación web para instalarla en un dominio, si queremos usarlo
de forma externa sólo tendremos que tener un <head> parecido a éste:
<head>
<meta charset=”utf-8”/>
521
<!-- Lincamos con la versión de jquery para tener las funciones de jquer mobile -->
</head>
Si lo vamos a usar de forma local, debemos descargarnos todo el material desde la sec-
ción recursos o desde la web oficial y posteriormente hacer los <link… > correctos:
http://jquerymobile.com/download/
http://api.jquerymobile.com/
Aula Mentor
Una vez nos decargarmos el fichero comprimido, a día de hoy la versión es la jquery.
mobile-1.4.3.zip, casi con toda seguridad hay una versión más actual cuando estés leyendo es-
tas páginas, pero no te preocupes porque lo más probable es que sea totalmente compatible,
y además puedes descargar esta versión en los recursos del curso. Hay muchos desarrolladores
trabajando detrás y cada muy pocas semanas hay una versión más actual, te aconsejo, para evitar
problemas externos que no estén contenidos en el manual, usar esta versión que tienes en la
sección de recursos.
Debemos recordar que existen dos versiones de los archivos importantes, la versión mí-
nima y la versión de desarrollo. Nosotros como estamos en desarrollo, vamos a usar ambas por
si en algún momento necesitamos ver que está realizando el script, pero debemos recordar que
cuando saquemos la versión a producción o en modo definitiva, siempre es aconsejable usar las
versiones mínimas, sin comentarios, tabuladores ni saltos de línea, siempre será más eficiente.
Otra opción válida sería enlazar siempre con los archivos en su versión minima (archivos que
acaban en: .min.extensión) y tener los archivos de apoyo como consulta, así cuando saquemos
el código a producción no tenemos que cambiar absolutamente nada.
Una vez tenemos clara la estructura mínima para desarrollar aplicaciones web con jQuery
Mobile, debemos declarar una metaetiqueta para la ventana de visualización con el fin de evitar
problemas de visualización en el dispositivo. La ventana de visualización es el área a la que
se adapta la página. Al ser aplicaciones para Smartphone o Tablet, y al realizarla de forma más
clara y simple, no sería necesario ampliar o reducir la pantalla con los dedos, por lo que la escala
sería 1, y se puede forzar a que el usuario no pueda cambiar esta escala mediante gestos con los
dedos o con los botones.
O de otra forma:
Por tanto el documento básico HTML5 desde el que partiríamos realizando nuestras apli-
caciones puede tener la siguiente estructura: 523
<!DOCTYPE html>
<html lang=”es”>
<head>
<!-- Definición de los archivos JS y CSS de forma local en nuestro servidor -->
</head>
<body>
Aula Mentor
</body>
</html>
El formato presentado sería sin ningún contenido en el <body></body>, cosa que no tie-
ne mucho sentido, pero a partir de él se iran construyendo las nuevas páginas. Sí, has escuchado
bien, dentro del mismo body, podemos tener varias páginas. Esto es una característica que se
puede usar de forma optativa, aunque es muy recomendable para hacer cargas de páginas más
efectivas, ya que están cargadas previamente.
Tendríamos muchas páginas visuales dentro del mismo documento, esta forma de traba-
jar se usa desde hace tiempo y se llama WML (Wireless Markup Language, Lenguaje de Marcas
Inhalámbrico), donde a cada página visual se le llama “carta” y a cada documento WML se llama
“baraja”. Para definir cada parte visual se suele usar la etiqueta <div> con un rol específico.
En la siguiente página vamos a ver un ejemplo sencillo para que vayas entendiendo
cómo vamos a crear nuestras páginas web con jQuery Mobile. Una vez entendido, es sólo ir
agregando componentes: botones, listas, etc.
524
M4. Aplicaciones Web Multiplataforma
3.1. Roles.
Cada carta o página visual contenida puede adquirir un rol, mejor dicho cualquier <div>
puede obtener un rol distinto. Estos roles son la forma de comunicar al navegador qué va ser
cada trozo de código, en algunas situaciones será una página como tal, un encabezado, pié de
página, etc.
ROL Descripción
page Define una página visual, en la que jQuery
mostrará contenido.
header Define el encabezado de la página.
content Define el contenido de la página.
footer Define el pie de página
navbar Define una barra de navegación.
button Dibuja un botón.
controlgroup Dibuja un componente
collapsible Panel desplegable de contenido dentro de una
página
collapsible-set Grupo de paneles plegables (acordeón)
fieldcontain Contenedor para campos de formulario
listview Contenedor para elementos en formato de lis- 525
ta
dialog Define un cuadro de diálogo
slider Define un deslizador visual para valores boo-
leanos
nojs Elemento que se ocultará en los navegadores
compatibles con jQuery Mobile
Los roles y atributos personalizados son los que hacen posible que haya diferentes pági-
nas visuales en el mismo. Se puede usar la semántica de secciones <section> asociadas a páginas
o directamente usar <div> asociadas a páginas:
. . .
<body>
<!-- ##########################################
Aula Mentor
PAGINA 1
##########################################
-->
<!-- ##########################################
PAGINA 2
##########################################
-->
526
<!-- ##########################################
PAGINA N
##########################################
-->
</body>
. . .
3.2. Temas.
Al igual que nos pasaba con jQueryUI, con jQuery Mobile tenemos también unos te-
mas predefinidos para usarlo en nuestros diseños web. Posteriormente veremos cómo agregar
nuestros temas personalizados con nuestros colores, fuentes, formatos..etc, pero ahora debemos
saber que jQuery Mobile nos ofrece 5 niveles de muestras de color, descritos por letras:
a. Priodad máxima a la parte visual (opción por defecto) – (color global: negro)
Para cambiar las muestras de color sólo tendremos que cambiar la letra cuando defina-
mos el data-theme. Por tanto con cambiar de letra data-theme=”e” a data-theme=”b” tendremos
una apariencia visual totalmente diferente.
Debemos tener en cuenta que cada página (refiriendonos de aquí en adelante a página
visual y no documento HTML) que vayamos a tener, debe tener su propio encabezado, conteni-
do y pie de página, porque será lo que se visualice en cada página del dispositivo. Cada página
debería ser declarada así:
Aula Mentor
. . .
<div data-role=”page”>
<div data-role=”header”>
<h1>CABECERA</h1>
</div>
<div data-role=”content”>
<p>CONTENIDO DE LA PÁGINA<p>
</div>
<div data-role=”footer”>
<h1>PIE DE PÁGINA</h1>
</div>
528 </div>
. . .
<header data-role=”header”>
<h1>CABECERA</h1>
</header>
<article data-role=”content”>
<p>CONTENIDO DE LA PÁGINA<p>
</article>
<footer data-role=”footer”>
<h1>PIE DE PÁGINA</h1>
</footer>
M4. Aplicaciones Web Multiplataforma
</section>
Para navegar entre las diferentes páginas, ya sea dentro de la página cuando sea multi-
páginas, a enlaces externos de la página u otros enlaces que necesitemos vamos a disponer de
la etiqueta que ya conocemos:
<a href=”urlPagina”..….>
Cuando queramos ir de una página a otra tendremos que usar <a href=”#nombrePagina”>.
Otro detalle muy importante que nos proporciona jQuery es la animaciones entre transiciones
de páginas, esto es, efectos que realiza para crear aplicaciones llamativas para el usuario. Más
adelante veremos este tipo de transiciones.
Como sabemos los dispositivos de Android y BlackBerry suelen traer un botón de re-
troceso que si lo pulsamos, automáticamente pasará a la página anterior, ahora bien en caso de
no traer este botón, podemos añadir el botón de retroceso para que independientemente del
dispositivo pueda navegar e ir hacia atrás. Para ello, podemos usar un atributo específico:
data-add-back-btn=”true”
Añadir o no este atributo, dependerá de si vamos hacer una página pensada para nave- 529
gador o si vamos a usarla sin el marco instalada, hay que dotar nuestra página de él porque sino
podríamos dejar al usuario sin poder ir a la página anterior.
Vamos a crear una estructura que vamos a ir completando durante todo el curso y poco
a poco le iremos añadiendo elementos. Vamos a suponer que queremos realizar un documento
HTML con varias páginas, estas páginas compondrán tu currículum para las demás personas y
una forma de demostrar que sabes realizar aplicaciones web con jQuery Mobile:
INICIO Donde pondremos alguna imagen y texto sobre ti, tus inquietudes, y
además vamos a incluir la fecha actual, el nombre y apellidos, email y
contacto de redes sociales y web.
OTROS DATOS Donde vamos a agregar idiomas, hobbies y otros datos de interés.
Por tanto tendremos como mínimo 5 páginas que podíamos definir de la siguiente forma,
como estamos acostumbrados en HTML, CSS y jQuery vamos a crearnos una lista de elementos
que van a contener cada ítem el nombre de cada página. Ésta la vamos a insertar en un elemento
que tenga el rol de barra de navegación:
Aula Mentor
<nav data-role=”navbar”>
<ul>
<li><a href=”#experiencia”>Experiencia</a></li>
<li><a href=”#contactar”>Contactar</a></li>
</ul>
</nav>
Normalmente los menús de navegación suelen estar en la parte inferior, por lo que ten-
dremos que usar algun truco para que siempre aparezcan ahí. Para poner un pie persistente
usando data-position=”fixed”, necesitaremos una forma de distinguir el elemento que está activo
o no, para que el usuario distinga si esta en Inicio, en formación, etc. Para ello, vamos a usar dos
clases ui-btn-active y ui-statepersist.
530 Por tanto nuestro menú sería de la siguiente forma, si estamos en la página de inicio,
debemos añadir cosas al footer por lo que ampliaremos el código a:
<nav data-role=”navbar”>
<ul>
<li><a href=”#inicio”
class=”ui-btn-active ui-state-persist”>Inicio</a></li>
<li><a href=”#experiencia”>Trabajos</a></li>
<li><a href=”#otros”>Otros</a></li>
<li><a href=”#contactar”>Contactar</a></li>
</ul>
</nav>
</footer>
M4. Aplicaciones Web Multiplataforma
Se asemeja a lo que queremos obtener pero la parte inferior podría ser mejorable aña-
diendo un icono a cada opción, aunque sería totalmente voluntario. Para ello jQuery Mobile
dispone de muchos iconos, y una forma muy sencilla de usarlos. Debemos de agregar el atributo
data-icon=”nombre” y con eso obtendremos el icono que trae por defecto jQuery Mobile.
A continuación podemos ver la lista de iconos disponibles y la forma de llamarlos para 531
usarlos en nuestro documento:
Por ejemplo unos apropiados pueden ser: para inicio el icono “home”, para formación el
icono “grid”, para la sección de trabajos podíamos usar “star”, para otros el icono “info” y por
último para contactar el icono de “mail”. Quedando nuestra página:
Aula Mentor
<!DOCTYPE html>
<html lang=”es”>
<head>
<!-- Definición de los archivos JS y CSS de forma local en nuestro servidor -->
</head>
<body>
<h1>CABECERA</h1>
</header>
<article data-role=”content”>
<p>CONTENIDO DE LA PÁGINA<p>
</article>
<nav data-role=”navbar”>
<ul>
</ul>
</nav>
</footer>
</section>
</body>
</html>
Y el resultado que deberíamos tener hasta ahora sería el siguiente. Si nos fijamos sólo
tengo realizada una página, la de inicio por eso he agregado la clase class=”ui-btn-active ui-sta-
te-persist sólo a este elemento de la lista (elemento activo actualmente), posteriormente tendré
que cambiar esa clase a cada página que esté realizando para que el usuario cuando haga click 533
en ella se vaya cambiando la página activa. Ésta es una forma, otra puede ser informándolo en
la cabecera:
534
Bueno, hasta ahora con muy poco código, y un código realmente conocido por nosotros
al 80% ya que la mayoría ha sido HTML5; tenemos un resultado bastante aceptable para dispo-
sitivos móviles de diferentes marcas, posteriormente vamos a ver cómo agregarle más elementos
a nuestra aplicación.
4. Botones.
Cuando vayamos a realizar un enlace, podemos usar botones, ya que no deja de ser
código HTML. Sobre todo en los dispositivos móviles tenemos que tener en cuenta la visión del
usuario y debemos hacer una interfaz agradable y fácil de usar, ya que al hacer una aplicación
web específica para dispositivos móviles, debemos evitar en la medida de lo posible usar link o
enlaces como tal:
Se pueden crear botones de diferentes formas al igual que pasa con HTML5.
<button >Acceder</button>
Recuerda que para poder capturar el nombre del botón debes agregarle el atributo:
- Y como última forma y novedad respecto a lo que ya sabíamos, es usar el rol de tipo button,
agregando el elemento <a> con el atributo data-role=”button”
Y el resultado sería como podemos ver visualmente el mismo en todas las formas: 535
Por defecto cada botón que se declare va a crear un salto de línea y cada botón va a
ocupar toda la pantalla, existe una forma de agregar botones en línea, es decir, uno a continua-
ción del otro. Para ello tenemos el atributo data-inline=”true” que indicaría al equipo que sería
en línea. Por ejemplo, en el caso anterior si queremos que dos botones ocupen toda la línea y
los tres siguientes ocupen solo una línea tendríamos que añadirle el atributo data-inline=”true”
a esto tres.
Aula Mentor
Si nos fijamos cuando ponemos los componentes inline tenemos que tener cuidado y
ser precabidos porque al igual que pasa en cualquier página web, si el elemento que esta en
línea no coge, se bajará a la siguiente línea. Como podemos ver, dependiendo de la pantalla
del dispositivo pasará una cosa u otra, de ahí que cuando vayamos desarrollando siempre es
conveniente ir probando en varios dispositivos con el emulador para comprobar el resultado y
siempre podamos agregar.
536
Podemos usar botones agrupados, sobre todo cuando tenga sentido en la propia aplica-
ción o nos interese visualmente. En este caso, debemos eliminar el atributo de data-inline=”true”
para aquellos botones que lo tuviera para no crear conflictos en su alineación y posteriormente
usar el data-role=”controlgroup”. En otros casos cuando queramos hacer un controlgroup pero
de botones inline debemos agregar este atributo a los botones y controgroup a su contenedor.
. . .
<div data-role=”controlgroup”>
</div>
. . .
M4. Aplicaciones Web Multiplataforma
. . .
</div>
. . .
En el caso de que nos pase como en ejercicios anteriores que en algunos dispositivos
realice un efecto que no deseemos por el tamaño de pantalla y baje a otra línea, siempre pode-
mos reducir el tamaño de letra como otra propiedad más de CSS:
537
El resultado de ambos controlgroup sería el siguiente:
Todos los botones por defecto tiene un efecto de sombra y esquinas redondeadas, estas
opciones las podemos modificar con los atributos booleanos (true/false) data-corners y data-
shadow.
Aula Mentor
Un elemento que puedes asociar también a los botones son los iconos, pudiendo agregar
diferentes iconos creando botones más llamativos y parecidos a los que el usuario está acostum-
brado a usar en sus aplicaciones. Para ello tenemos el atributo data-icon como vimos anterior-
mente y funcionarían exactamente igual que las que usamos para el menú de navegación, aquí
algunos ejemplos más usados:
. . .
<button data-icon=”delete”>Eliminar</button>
<button data-icon=”search”>Buscar</button>
. . .
Respecto a iconos, comentar que se podemos usar iconos personalizados para crear una
web más auténtica y diferenciada de las demás, aunque también no debemos olvidar que han
de ser muy intuitivos y el usuario suele estar acostumbrado a los que nos ofrece directamente
jQueryMobile.
5. Iconos personalizados.
Para crear iconos personalizados debemos de:
- Definir nuestro propio nombre en el atributo data-icon. Éste no debe entrar en conflicto
con los ya definidos, así que es una buena práctica crearlo de la siguiente forma <nom-
bre-aplicación>-<nombre-icono> o usar la notación Reverse Domain Name <Reverse-DNS>- 539
<nombre-icono>. Por ejemplo si tengo un dominio que se llama midominio.com sería:
com-midominio-miaplicacion-nombre-icono
Nos vamos a crear cuatro imágenes, dos para tamaño 18x18 y otras dos 36x36. Primero
he creado la de mayor resolución posteriormente le he dado a reducir tamaño a 18x18. Unas van
a indicar una sonrisa y otras todo lo contrario.
El diseño ha sido totalmente manual para ver que podemos personalizar todo lo que
queramos. No tienen ningún borde y tiene transparencia alfa. Los vamos a ubicar en una ruta,
en nuestro caso dentro de la carpeta images, y crearemos dos carpetas, una para los iconos nor-
males y otros para los de alta resolución.
Aula Mentor
img/icons-hd/cara-ok-amarillo-36x36.png
img/icons-hd/cara-nok-amarillo-36x36.png
img/icons/cara-nok-amarillo-18x18.png
img/icons/cara-ok-amarillo-18x18.png
Ahora nos vamos a crear dos nombres para los iconos, que tendremos que llamar en el
data-icon de la siguiente forma:
data-icon=” proyectoCurso-cara-ok”
data-icon=” proyectoCurso-cara-nok”
Si ejecutamos ahora mismo la aplicación podremos observar que no nos aparece ningún
540 icono, pero si aparece el sitio redondeado y de color gris donde se ubicaría:
Si nos fijamos el icono es de forma redondeada, de radio 18x18 o 36x36, debemos tener
en cuenta que el icono creado encaje perfectamente dentro de su ubicación, por lo que es po-
sible que necesitemos crear una canvas o tamaño de icono inferior.
Tenemos que definir ahora nuestro CSS para asociar nuestras imágenes, ya sea en un
archivo aparte, como hemos estado haciendo todo el curso dentro de la carpeta css o en el pro-
pio <head> del documento. Para evitar accesos y debido a la simplicidad del código esta vez lo
haremos en el <head>:
<style type=”text/css”>
.ui-icon-proyectoCurso-cara-ok:after {
background-image: url(“img/icons/cara-ok-amarillo-18x18.png”);
}
M4. Aplicaciones Web Multiplataforma
.ui-icon-proyectoCurso-cara-ok:after {
background-image: url(“img/icons-hd/cara-ok-amarillo-36x36.png”);
.ui-icon-proyectoCurso-cara-nok:after {
background-image: url(“img/icons/cara-nok-amarillo-18x18.png”);
.ui-icon-proyectoCurso-cara-nok:after { 541
background-image: url(“img/icons-hd/cara-nok-amarillo-36x36.png”);
</style>
Como podemos ver, es sencillo crear nuestros iconos y usarlos tanto en botones como
en los menús de navegación. Comentar, que hay que realizar iconos y usar colores siempre
acordes con la página, en este ejemplo hubiera sido mejor usar iconos en sintonía con el tema,
que según hemos visto el color era blanco.
Otro efecto que podemos usar es cambiar la ubicación de los iconos, es decir, la
ubicación respecto del texto. Para ello podemos usar el atributo data-iconpos y puede tomar los
siguientes valores:
Aula Mentor
. . .
</button>
</button>
</button>
</button>
. . .
. . .
</button>
. . .
6. Columnas.
En determinadas circunstancias es posible que necesitemos organizar la aplicación en
columnas, podríamos decir que en vez de utilizar la etiqueta table podemos organizar los ele-
mentos y tener nuestras columnas, filas que necesitemos, siempre teniendo en cuenta el tamaño
que disponemos dentro del dispositivo. Debemos pensar que vamos hacer una rejilla o grid de
elementos en la pantalla.
Para crear una cuadrícula o rejilla hay que crear un contenedor de bloque, ya sea
<div>,<section>, etc. Y agregarle la clase según el número de columnas:
Todas las celdas deben ser a su vez un contenedor de bloque que utilice ui-block-<letra
a hasta la d> . Vamos a ver un ejemplo:
. . .
<section class=”ui-grid-c”>
544 </section>
. . .
7. Listas.
En las aplicaciones web multiplataforma, un elemento muy extendido son las listas, ya
que organizan de una forma amena y ordenada el contenido. Podemos usar las listas como he-
mos realizado hasta ahora <ol> (ordenadas) <ul> (desordenadas) y los ítems llamarlos con <li>
. En el caso de que queramos sacar la parte visual y adaptada a diferentes dispositivos podemos
usar los roles de JQuery Mobile.
Para usar una lista sólo tenemos que usar el siguiente atributo o rol:
data-role = “listview”
Vamos aprovechar y crear todo el apartado de Listas en una nueva página visual, para
ello vamos a crearnos nuestra página a continuación de la que ya teníamos con jQuery Mobi-
le como vimos anteriormente, copiamos la lista o menú de navegación y cambiamos la clase
class=”ui-btn-active ui-state-persist” del primer botón al segundo, quedando esta nueva página
como se muestra a continuación.
M4. Aplicaciones Web Multiplataforma
<header data-role=”header”>
<h1>CABECERA</h1>
</header>
<article data-role=”content”>
</article>
<nav data-role=”navbar”>
<ul>
</ul>
</nav>
. . .
<article data-role=”content”>
<ul data-role=”listview”>
Aula Mentor
<li>HTML5</li>
<li>CSS3</li>
<li>JQUERY</li>
<li>JQUERY MOBILE</li>
</ul>
<ol data-role=”listview”>
<li>HTML5</li>
<li>CSS3</li>
<li>JQUERY</li>
<li>JQUERY MOBILE</li>
</ol>
546
</article>
. . .
No debemos dejar escapar que en las lista <ol> automáticamente jQuery Mobile nos ha
insertado un número indicándonos el orden que ocupa en la lista. Como podemos apreciar, no
existen inicialmente diferencias entre ambas listas en el dispositivo de la izquierda, pero hemos
de apreciar en él que cada elemento de la lista ocupa toda la pantalla y en determinadas oca-
siones podemos querer que se vea la lista como una lista interior. Para ello, podemos usar el
atributo data-inset=”true” a los elementos <ul> u <ol>.
. . .
<li>HTML5</li>
<li>CSS3</li>
<li>JQUERY</li>
<li>JQUERY MOBILE</li>
</ul>
<hr>
547
<p> ( Lista ol ) con data-inset=”true”</p>
<li>HTML5</li>
<li>CSS3</li>
<li>JQUERY</li>
<li>JQUERY MOBILE</li>
</ol>
. . .
HTML5 no emplea la sintaxis de XML, lo que significa que algunas etiquetas, como pue-
de ser <li> no es necesario cerrarla, pero creo que es mejor independientemente de que tenga-
mos la opción seguir usando la notación usual <li></li>, al menos inicialmente.
En las listas a menudo es posible que tengamos que usar algún método para separar o
distinguir unos elementos de otros, para ello tenemos el siguiente atributo, tenemos que tener
en cuenta que es sólo un rol que se le aplica al ítem de la lista:
li:data-role=”list-divider”
Aula Mentor
548
<li>HTML5</li>
<li>CSS3</li>
<li>JQUERY</li>
<li>JQUERY MOBILE</li>
<li data-role=”list-divider”>REQUERIMIENTOS</li>
<li>TIEMPO</li>
<li>GANAS DE APRENDER</li>
<li>FLEXIBILIDAD Y PACIENTES</li>
<li>APTITUD POSITIVA</li>
</ul>
M4. Aplicaciones Web Multiplataforma
Ademas de agregarnos unos iconos personalizados, nos agregará efectos cuando pulse-
mos o interactuemos con el ítem en cuestión. Por ejemplo podemos crear una lista interactiva
sólo con agregarle los enlaces <a>. Y en caso de que no queramos que tenga visible ningún
icono, podemos usar data-icon=”false”. Veamos un ejemplo:
549
. . .
<li><a href=”#”>HTML5</a></li>
<li><a href=”#”>CSS3</a></li>
<li><a href=”#”>JQUERY</a></li>
</ul>
. . .
550
7.3. Listas divididas.
En determinadas ocasiones es posible que necesitemos que la lista esté compuesta por
dos elementos, por ejemplo uno para seleccionar el ítem de la lista y otro para editarlo, borrarlo
o cualquier otra acción que necesitemos.
Automáticamente jQuery Mobile cuando detecta dos enlaces en el mismo ítem los trata
de esa forma. La primera etiqueta definida <a …. > será la que ocupe mayor espacio y la segun-
da será la que no debería tener texto, y más bien la acción concreta, editar, borrar, añadir, etc.
Para ello sólo tendremos que definir el ítem de la lista de la siguiente forma:
Podemos modificar también la importancia de cada fila solo agregando títulos a cada
ítem de la lista. Si recordamos en HTML teníamos <h1><h2>…etc para enumerar el nivel e im-
portancia de la información que contiene.
Cuando tenemos una lista demasiado amplia, es conveniente ayudar al usuario en en-
contrar el elemento que esta buscando. Para ello, jQuery Mobile nos facilita esta acción añadien-
do otro atributo más a la lista: data-filter=”true”, con eso, automáticamente se encarga de agre-
gar al usuario un campo de entrada, y realiza un filtrado del contenido de la lista y muestra los
elementos coincidentes. Si agregamos el atributo al ejemplo anterior obtendríamos lo siguiente:
Aula Mentor
Cuando hemos escrito la letra “a” nos muestra sólo los ítem de la lista coincidentes.
También podemos usar listas más complejas, agregando más elementos a la lista enri-
queciéndose y dandole la mayor información posible al usuario. Podemos agregar imágenes,
información adicional o descripciones y contadores.
Tenemos que recordar que con jQuery Mobile y con HTML5 se le da mucha importancia
a las etiquetas que incluyas, la semántica que escribas en HTML va a ser muy importante para
posteriormente hacer determinadas acciones y si por ejemplo en una etiqueta escribimos:
<li>
<a href=”#”><h3>España</h3>
</li>
Para agregar imágenes a nuestros ítems de la lista podemos usar la etiqueta que ya
conocíamos <img src=”rutaImagen”>. Podemos distinguir entre iconos y miniaturas/thumnails,
realmente se usa la misma sintaxis pero de forma usual, los iconos tiene un tamaño de 16x16 y
las minuaturas 80x80 (o 160x160 hd). No debemos confundir estas imágenes con los data-icon
que agregamos a cada lista, ya que es información que se agrega a la fila y se ha de insertar en
cada ítem. Lo que hacemos es decirle al sistema que la imagen va a ser de la clase class=”ui-li-
icon” , por tanto tendremos que recordar lo que vimos respecto al tamaño de los iconos.
Para agregar una imagen (tipo icono) debemos agregar el siguiente código:
. . .
<li data-role=”list-divider”>Paises</li>
src=”img/icons/es.png”>España</a></li>
. . .
<li><a href=”#”>
<img src=”img/logos/html5-logo.png”>
<h3>HTML5</h3>
<p>Lenguaje HTML</p></a>
553
</li>
<li><a href=”#”>
<img src=”img/logos/css3-logo.png”>
<h3>CSS3</h3>
<p>Hojas de estiloL</p></a>
</li>
<li><a href=”#”>
<img src=”img/logos/jquery-logo.png”>
<h3>JQUERY</h3>
<p>Framework jQuery</p></a>
</li>
<li><a href=”#”>
<img src=”img/logos/jquery-mobile-logo.png”>
Aula Mentor
<h3>JQUERY MOBILE</h3>
</li>
</ul>
Muchas veces, además de agregar un título, descripción e imagen, es posible que nece-
sitemos otro dato más para agregar información adicional sobre esa fila. Si por ejemplo cada fila
554 corresponde al nombre de una persona, podríamos poner la edad, teléfono o link con su email.
Si nuestra aplicación es de una tienda de artículos puede ser el precio, o si es una lista de paises
por ejemplo podíamos indicar su moneda, prefijo telefónico, etc.
Para poder usar esto, usamos la etiqueta <span> o <div> junto con una clase:
class=”ui-li-aside”
<li data-role=”list-divider”>Países</li>
<li><a href=”#”>
España</a>
</li>
<li><a href=”#”>
M4. Aplicaciones Web Multiplataforma
E.E.U.U</a>
</li>
<li><a href=”#”>
Francia</a>
</li>
<li><a href=”#”>
Inglaterra</a>
</li>
</ul>
7.5.4. Contadores.
class=”ui-li-count”
Aula Mentor
<li data-role=”list-divider”>Paises</li>
<li><a href=”#”>
España</a>
<span class=”ui-li-count”>600</span>
</li>
<li><a href=”#”>
E.E.U.U</a>
</li>
<li><a href=”#”>
Francia</a>
<span class=”ui-li-count”>1309</span>
</li>
<li><a href=”#”>
Inglaterra</a>
<span class=”ui-li-count”>1190</span>
M4. Aplicaciones Web Multiplataforma
</li>
</ul>
No te preocupes si no gusta el estilo o el tema que estas viendo, sólo con agregar unas
líneas puede cambiar el aspecto visual totalmente, declara la lista de la siguiente forma:
Puedes ver todo estos ejemplos en los recursos del curso, recuerda que es muy recomen-
dable que empieces un archivo desde el inicio y vayas probando sobre él todos los elementos y
en caso de duda revises la solución:
557
Puedes visitar el ejemplo 04-listas/#listas
8. Tab.
Como pasaba con jQueryUI tenemos un elemento muy útil para organizar el contenido
dentro de nuestras aplicaciones. Está muy extendido en las aplicaciones y es recomendable su
uso siempre que la aplicación lo requiera.
Vamos aprovechar y crear una nueva página al igual que pasó en el anterior apartado.
No debemos olvidar que ahora debemos agregar class=”ui-btn-active al elemento actual de la
lista:
<header data-role=”header”><h1>CABECERA</h1></header>
<article data-role=”content”>
</article>
<nav data-role=”navbar”>
<ul>
</ul>
</nav>
Para usar tab podemos partir del mismo ejemplo que trabajamos en el módulo anterior
558 y voy a cambiar el color del texto que debemos añadir:
<div data-role=”navbar”>
<ul>
</ul>
</div>
<div id=”tabs-1”>
</div>
<div id=”tabs-2”>
M4. Aplicaciones Web Multiplataforma
</div>
<div id=”tabs-3”>
</div>
</div>
559
Una opción muy importante que podemos usar cuando vamos a ir rellenando cada pes-
taña es usar un documento html, php, js, etc para llamarlo en el momento que el usuario haga
click sobre él. Imaginemos en el caso anterior que creamos una pestaña más, pestaña miTwit-
ter. Y ahí vamos a llamar a un fichero, llamado mitwitter.html y quiero que se cargue en esta
pestaña:
Para ello necesitamos tener un documento creado mitwitter.html con las etiquetas que
queramos insertar ahí, por ejemplo:
<div><p>Este texto se ha cargado de un fichero llamado desde la pestaña. Podía haber sido un fichero PHP
que lea el twitter del usuario, o realice cualquier otra opción que se nos ocurra.</p></div>
Aula Mentor
<div data-role=”navbar”>
<ul>
</ul>
</div>
<div id=”tabs-1”>
</div>
</div>
</div>
1º
2º
<div><p>Este texto se ha cargado de un fichero llama-
do desde la pestaña. Podía haber sido un fichero PHP
que lea el twitter del usuario, o realice cualquier
otra opción que se nos ocurra.</p></div>
M4. Aplicaciones Web Multiplataforma
También se pueden usar tab de forma vertical, y que las pestañas se vayan mostrando en
la parte derecha. Esta forma se ha de usar en dispositivos que tengan una pantalla grande, por
ejemplo Tablet, SmartpTv, etc.
561
. . .
</ul>
</div>
</div>
</div>
. . .
9. Formularios.
Uno de los aspectos que nos podría interesar más en las aplicaciones web multiplata-
forma sería la realización de formularios para interactuar con datos con el usuario. Al igual que
562
pasaba antes, la mayoría del código es conocido por nosotros, ya que al fin y al cabo van a ser
input, textarea, select, etc. El formulario también recibirá su action donde podremos recibir una
URL donde mandaremos el fichero, el funcionamiento es el mismo al que ya estamos acostum-
brados, con su método get o post. Lo único que en este caso, podemos emplear el atributo data-
ajax=”true” en el elemento form; siendo muy útil cuando la acción está haciendo una petición
a un dominio que no está en el mismo dominio. Cuando el usuario rellene su formulario, vamos
a enviarlo por correo electrónico a una dirección de email, pero este último punto lo veremos
en el siguiente apartado.
Debemos recordar que todos los elementos están renderizados para un mejor uso, y con
el uso de AJAX todas las páginas comparten el mismo DOM, incluyendo los controles de formu-
lario Web. Para evitar problemas debemos utilizar un ID único en nuestros elementos para todo
M4. Aplicaciones Web Multiplataforma
el sitio, sino tendrás problemas, acciones no deseadas y te costará detectar dónde esta el error.
Vamos a seguir ampliando nuestra aplicación, realizaremos una nueva página y pondre-
mos como activa el siguiente elemento del menú de navegación, en este caso form. Como he-
mos realizado hasta ahora, a continuación de las otras páginas y en el mismo documento index.
html:
<header data-role=”header”>
<h1>CABECERA</h1>
</header>
<article data-role=”content”>
</article>
563
<footer data-role=”footer” data-id=”menuInferior” data-position=”fixed” data-theme=”a”>
<nav data-role=”navbar”>
<ul>
</ul>
</nav>
9.1. Etiquetas.
Un elemento al que debemos acostumbrarnos a trabajar con él, serían las etiquetas
sobre los campos del formulario. Éstas apuntan al control correcto empleando el atributo
for=”idCampo” después de su definición de la etiqueta <label>.
Las etiquetas deberían usarse en todos los formularios HTML5, aunque en este módulo
no se hizo hincapié para facilitar y no mezclar conceptos al aparecer datos del formulario ya que
no habíamos dado todavía CSS3 ni identificadores (id). En este módulo no podemos dejar pasar
por alto, y con más motivo en los dispositivos móviles ya que cuando el usuario haga click en
la etiqueta el control del formulario pasará a estar activo.
9.2. Contenedores.
564
Para usar los contenedores de campo, podemos usar la clase: class ui-field-contain.
Es posible si lees por internet que se usa también el rol data-role=”fieldcontain”, éste ha
sido cambiado por esta nueva clase en la versión 1.5. Debemos tener cuidado y siempre usar los
métodos correspondientes a la versión que tengas, por eso siempre tenemos que tener abiertos
la documentación para consultar dudas de este tipo, o en el caso de habernos bajado todo el
API, como ha sido nuestro caso, hay unos ejemplos donde te explican el componente que vas
hacer y la forma correcta de realizarlo. Si tienes la misma estructura que en el curso, ésta la en-
contrarás en:
www\MOD4.JQUERYMOBILE\jquery.mobile-1.4.3\demos
</div>
Por ejemplo:
M4. Aplicaciones Web Multiplataforma
<div class=”ui-field-contain”>
<label>CONTENEDORES</label>
<label for=”idNombre”>Nombre</label>
<label for=”idPass”>Pass</label>
</div>
También podemos agrupar elementos como vimos en las listas con controlgroup, un
ejemplo muy usado en los formularios puede ser agrupar botones u otros elementos. Realmente
todo esto ya lo hemos visto, sólo era para poner de manifiesto que se pueden usar exactamente
igual en los formularios.
<div class=”ui-field-contain”>
565
<fieldset data-role=”controlgroup”>
<button>BOTÓN 1</button>
</fieldset>
</div>
<div class=”ui-field-contain”>
<button>BOTÓN 1</button>
Aula Mentor
</fieldset>
</div>
Respecto a los botones, los podemos usar exactamente igual que en anteriores secciones
y con los campos de texto pasa lo mismo. Vamos a realizar algunos ejemplos pero recuerda que
todo esto ya lo sabemos, sólo lo estamos repasando y aplicándolo a un formulario. A modo de
resumen y recordando que podemos usar la mayoría de las opciones que vimos en los formula-
rios de HTML5 (name, placeholder, required, pattern, etc):
Crear botones:
<button>button</button>
566
<input type=”button” value=”type-button”>
<legend>CAMPOS DE TEXTO:</legend>
<input type=”password”
placeholder=”type=password”>
<textarea placeholder=”type=text”></textarea>
9.5. Conmutadores.
Otro elemento que debemos usar en nuestros formularios ya que el usuario está acos-
tumbrado a usar en sus aplicaciones y simplifican mucho la interfaz del usuario, son los elemen-
tos conmutadores o switch. Estos pueden tomar un valor u otro, verdadero o falso. Para ello se
basan en los checkbox, sólo que se aplica el rol data-role=”flipswitch”.
<label for=”conmutador”>Opcion</label>
<label for=”opcion”>Opcion</label>
<label for=”miSelect”>Opcion</label>
<option value=”NO”>NO</option>
<option value=”SI”>SI</option>
</select>
9.6. Deslizadores/Slider.
Cuando un campo pueda tomar un rango de elementos predefinido, pero mayor de dos,
(sino usaríamos un conmutador tipo filpswitch), podemos usar el componente deslizador <input
type=”range”>, el cual puede tomar valores min (mínimo), max(máximo) y step (intervalo en
cada paso).
Aula Mentor
<label for=”deslizador”>deslizador</label>
Podemos personalizar un poco estos elementos que nos da jQuery Mobile, por ejemplo
añadiendole valor en cada paso, es decir ¿cómo va a incrementar cuando se realice un despla-
zamiento? Podríamos decir que se incremente en valores de 2 en 2, o de 1 en 1 (por defecto), o
incluso valores decimales, 0.5.
<label for=”deslizador”>deslizador</label>
Como vimos con jQueryUI teníamos un componente muy util para que el usuario pueda
introducir las fechas, no se puede usar tal cual aquí pero si nos proporciona otra forma de intro-
ducir fechas. Este componente es más aconsejado por el tipo de pantallas que tiene el usuario y
lo ideal, en la medida de lo posible es que el usuario introduzca manualmente los menos cam-
568 pos posibles (sobre todo para evitar errores de mecanización), ya que ralentiza la interacción
con la aplicación; sobre todo en elementos conocidos, fecha, si/no, lista de opciones, etc.
Para usar fechas sólo debemos indicar al <input que va a ser del tipo type= “date”:
Puedo aumentar/disminuir
cada campo dd o mm o aaaa
<label for=”miFecha”>Fecha</label>
Para usar menús de selección no es necesario agregar ningún elemento clase o rol, y
podemos realizar elección sencilla o múltiple:
<label for=”menuSeleccion”>deslizador</label>
</select>
El efecto que se verá va a depender del navegador del dispositivo, algunas veces lo
mostrará en la misma pantalla desplazando el componente hacia abajo, o creará un elemento
emergente, cada sistema operativo usará su propio método:
569
Para evitar estas diferencias, que bueno, dependiendo de cada aplicación puede ser o
no conveniente, podemos desactivar el menú nativo y aparecería igual en todos los dispositivos,
usando data-native-menu=”false” como atributo del select.
Cuando hablamos de selecciones, es posible que en algunos casos esta selección sea
de tipo múltiple, es decir, que el usuario pueda elegir varios elementos de los dados, para ello
podemos usar el siguiente código que sólo hemos añadido multiple=”multiple” data-native-
menu=”false” al menú select:
Aula Mentor
</select>
570
Cuando estamos hablando de opciones, muchas veces necesitamos organizar las op-
ciones de alguna forma, ya sea categoría, importancia, etc. Para agrupar estos elementos nos
podemos de optgroup:
<option>Elige...</option>
</optgroup>
</optgroup>
</select>
Podemos usar elementos de agrupación de tipo visual (vertical u horizontal), para ello
sólo debemos crear varios select y agruparlos con un rol de data-role=”controlgroup”
<fieldset data-role=”controlgroup”>
571
<legend>Agrupación de selecciones (vertical)</legend>
<option value=”1”>Naturaleza</option>
<option value=”2”>Pesca</option>
<option value=”3”>Deporte</option>
<option value=”4”>Escalar</option>
</select>
<option value=”5”>Arroz</option>
<option value=”6”>Macarrones</option>
Aula Mentor
<option value=”8”>Lentejas</option>
</select>
<option value=”9”>Blanco</option>
<option value=”10”>Amarillo</option>
</select>
</fieldset>
Como veremos en las imágenes siguientes, se crea unos elementos muy agradables para
el usuario sin cambiar mucho la estructura usual de creación de elementos. Se puede realizar
muchos más efectos y combinaciones con los elementos de selección, entre las que destacamos:
Debemos recordar que para que todos los elementos del formulario se envíen co-
rrectamente, debemos asignar un nombre. Por ejemplo:
<button name=”btnEnviar”….
573
<select name=”miSeleccion”…
<textarea name=”miTextarea”….
<header data-role=”header”>
<h1>CABECERA</h1>
Aula Mentor
</header>
<article data-role=”content”>
</article>
<nav data-role=”navbar”>
<ul>
</nav>
Para mandar correos electrónicos desde nuestra aplicación, podemos verlo desde dos
puntos de vista:
Para ello podemos usar el atributo mailto:direccion. Un ejemplo sencillo sería agregar
al contenido de nuestra página el siguiente código:
<p>Para ponerse en contacto con nosotros pulse <a href=”mailto:ejemplo@ejemplo.com “>aquí</a> o en con
nuestro departamento</p>
<address>
M4. Aplicaciones Web Multiplataforma
Departamento de ventas<br>
Telefono<br>
</address>
575
Si en vez de tener un dispositivo móvil usáramos un PC, como es nuestro caso con el
emulador del navegador, tendrás que tener instalado algún cliente de correo para poder ver que
se ejecuta correctamente. En caso de no tener ningún cliente de correo, puedes usar Thunder-
bird, es gratuito y te lo puedes descargar desde aquí: https://www.mozilla.org/es-ES/thunder-
bird/ .
Ahora bien, no nos deberíamos de preocupar mucho por esta parte ya que realmente
las aplicaciones web que vamos a desarrollar con jQuery Mobile en su mayoría van a ser para
dispositivos móviles con Android, BlackBerry, iPhone, Windows Phone, etc.
Sería más interesante si dispones de un dispositivo móvil que esté conectado a tu red
local, y con el servidor web encendido, poner la dirección del servidor y pruebes por ti mismo
el resultado. Podrás comprobar que llama en cada caso al cliente de correo de tu dispositivo
móvil.
Aula Mentor
De todas formas, el resultado sería en ambos casos si tenemos un dispositivo con An-
droid, parecido a esté, observa que si hay instalado más de un cliente de correo, solicita por cuál
deseamos mandar el email:
Seguro que has entrado alguna vez a una página web y te has encontrado un formulario
para contactar o realizar algunas consultas y un botón para enviar el formulario. En determina-
das ocasiones, este “enviar” puede hacer acciones más complejas (agregar datos a base de datos,
log, consultas, estado actual pendiente, crear un ticket para hacer un seguimiento, etc). Pero en
M4. Aplicaciones Web Multiplataforma
la mayoría de los casos este tipo de formularios cuando pulsamos sobre el botón “enviar”, real-
mente lo que hace es mandar un correo electrónico con los datos del formulario a una dirección
dada.
Para poder hacer esto, el servidor tiene que tener la función mail para poder enviar co-
rreos directamente. La mayoría de los usuarios de Linux que estén usando su servidor Apache,
Mysql y PHP, no tendrán problemas ya que la función mail está integrada, y se puede usar de la
siguiente forma:
.. . . . . . . .
.. . . . . . . .
.. . . . . . . .
.. . . . . . . .
.. . . . . . . .
.. . . . . . . . 577
.. . . . . . . .
.. . . . . . . .
.. . . . . . . .
.. . . . . . . .
</form>
//Mando el email con los datos recibidos
.. . . . . . . .
//Usando algún método de los que hay
.. . . . . . . .
.. . . . . . . .
.. . . . . . . .
.. . . . . . . .
Cuando pulsemos para enviar el formulario, vamos a activar el action del formulario, en
este caso vamos a llamar al archivo enviar.php. Dentro del formulario tendremos los elementos
que deseemos (<input…, <textarea.., <select…etc). No debemos olvidar que para recoger los
datos del formulario debemos usar nombres adecuados en los elementos del formulario y evitar
caracteres especiales o acentos.
. . .
578
<label for=”comentariosContactar”>Comentarios</label>
</form>. . .
Una vez realizado la apariencia debe ser parecida a ésta, como verás es una apariencia
adaptada al móvil y la verdad que el usuario puede manejar toda la información desde la misma
pantalla:
M4. Aplicaciones Web Multiplataforma
Como habíamos exigido que los campos estuvieran rellenos (añadiendo required al final
de cada campo), si pulsamos el botón del submit con los datos vacíos, nos irá apareciendo un
mensaje informándonos “Completa este campo”.
Cuando el usuario rellene todos los campos y pulse en botón Enviar Formulario, llama- 579
remos al fichero enviar.php que en este caso lo que hará será mostrar un documento HTML5, un
artículo con los datos que hemos recibido y hará una acciones para enviar un email. Para ello,
vamos a usar el código fuente de la librería que nos facilita PHPMailer, tienes la documentación
en https://github.com/PHPMailer/PHPMailer, pero de forma resumida lo que tendremos que
hacer es copiar unos archivos a nuestro proyecto. Desde el código PHP vamos a llamar a esos
archivos (con la funcion require de PHP) y posteriormente podremos usar la función mail en
nuestro proyecto con nuestra cuenta de correo. Esta función nos proporciona muchas opciones
y utilidades, pero en nuestro caso sólo al usarlo para enviar un correo con unos datos, vamos a
ver sólo la parte envío.
Tendremos que tener una cuenta de correo asociada de tipo POP3, SMTP para usar esta
clase, para hacer pruebas vamos a usar la siguiente:
Contraseña: usuariosaula
Para organizar un poco nuestro proyecto nos podemos crear una carpeta para este tipo
de utilidades, llamada correo y debemos agregar al inicio del fichero enviar.php, quedando de
la siguiente forma:
Aula Mentor
<?php
require (‘utilidades\correo\PHPMailer-completo\PHPMailerAutoload.php’);
….
….
Ya podemos usar nuestra clase, y sólo tenemos que ir rellenando los campos que necesi-
tamos para enviar el correo, que son: el email destinatario, el remitente, el asunto, el contenido,
archivos si fuera necesario, etc. El código correspondiente sería:
. . .
<h5>Nombre : ‘.$campoNombre.’.</h5>
<h5>Apellidos: ‘.$campoApellidos.’.</h5>
<h5>Comentarios: ‘.$campoComentarios.’.</h5>’;
$mail->Host = ‘smtp.aplicacioneswebmultiplataforma.es’;
$mail->SMTPAuth = true;
$mail->Username = ‘pruebas@aplicacioneswebmultiplataforma.es’;
$mail->Password = ‘usuariosaula’;
$mail->From = ‘pruebas@aplicacioneswebmultiplataforma.es’;
$mail->addAddress(‘info@aplicacioneswebmultiplataforma.es’, ‘Contactar’);
$mail->AddReplyTo(‘pruebas@aplicacioneswebmultiplataforma.es’,’Usuario Web’);
M4. Aplicaciones Web Multiplataforma
$mail->WordWrap = 50;
$mail->isHTML(true);
$mail->Body = ‘
<h5>Nombre: <i>’.$campoNombre.’</i></h5>
<h5>Apellidos: <i>’.$campoApellidos.’</i></h5>
<h5>comentarios <i>’.$campoComentarios.’</i></h5>’;
$mail->AltBody = ‘Este es el cuerpo en texto plano para cliente que no soportan email con HTML:
Nombre: ‘.$campoNombre.’\n
comentarios: ‘.$campoComentarios.’\n’;
if(!$mail->send()) {
} else {
echo ‘Información recibida correctamente. Gracias por contactar con nosotros, le responde-
remos lo antes posible al email indicado.’;
. . .
Hemos usado una cuenta de destinatario para usar el correo electrónico info@aplica-
cioneswebmultiplataforma.es, en la cuenta que hayamos dado de alta recibiríamos el siguiente
mensaje:
582
Existen otras formas de enviar los formularios, muy usadas para dispositivos móviles,
sobre todo cuando las integramos en el propio dispositivo. Puedes usar archivos JSON para los
formularios enviar el formulario json_encode($datos) y posteriormente leer los datos.
11. Transiciones.
JQuery Mobile nos ofrece unos efectos muy llamativos para hacer las aplicaciones cuan-
do cambiamos entre páginas. Estas transiciones utilizan CSS3 y están aceleradas por hardware
en la mayoría de los dispositivos. Como siempre, nos podemos encontrar dispositivos que no
funcionen correctamente o mejor dicho, no funcione con fluidez esperada o no se represente el
efecto directamente.
data-transition: valor
Así para agregar un efecto de transición de una página llamada “pagina1” a otra página
llamada “pagina2” tendremos que usar:
En el ejemplo que hemos usado en el curso, podemos agregar también efectos, debemos
recordar que debemos hacerlo en cada navegación de cada página. Por lo que el ejemplo base
583
podría ser:
. . .
<nav data-role=”navbar”>
<ul>
</ul>
</nav>
</footer>
. . .
Debemos recordar que dependiendo de la página que esté activa debemos usar: class=”ui-
btn-active ui-state-persist” en el elemento actual de la página para mostrar al usuario la página
activa actual.
Hay que intentar usar una consistencia en el uso de las transiciones, intentando no “ma-
rear” al usuario, y abusar de los efectos (no gana quien más efectos agregue). Intentad hacer
efectos elegantes y lógicos según la aplicación. En el ejemplo se han usado varios para que
puedas ver cómo se efectuarían, sólo eso.
data-direction=”reverse”
Por ejemplo si se usa un efecto para ir a otra página, si se dota de navegación a la página
anterior, ese enlace es el idóneo para invertir el efecto.
Para empezar a diseñar nuestro propios esquemas debemos irnos a la página oficial:
http://jquerymobile.com/themeroller
Lo primero que debemos usar y diseñar el tema para nuestra versión de jQuery Mobile,
en nuestro caso hemos estado usando la versión 1.4.3, pero en caso de que estés usando otra la
puedes cambiar en la siguiente pestaña y elegir la deseada:
M4. Aplicaciones Web Multiplataforma
Familia de fuentes.
Si nos fijamos en la parte superior nos aparecen diferentes letras: A, B, C, etc. Estas son
las opciones diferentes que podemos realizar para cada letra.
585
También podemos usar y aplicar colores muy rápidamente gracias al uso de Adobe Kuler
(http://kuler.adobe.com) donde con arrastrar el color elegido al elemento deseado, aplicará el
efecto.
Una vez terminemos de elegir y adaptar nuestro tema, sólo tenemos que:
586
En la ventana nos indica cómo usarlo, sólo debemos copiar el código correspondiente y
agregarlo a nuestra página y ya se aplicará a nuestra web.
Vamos a suponer que una empresa que se dedica a la venta de pollos de crianza nos
propone crear una web, claro está el color ideal para la mayoría del tema sería el amarillo. Si
M4. Aplicaciones Web Multiplataforma
adaptamos los elementos y temas para nuestra página web, observaremos que sin tener que
cambiar nada en nuestra aplicación tenemos un aspecto totalmente diferente. Nuestro <head></
head> respecto a definicion y lincado de archivos ha quedado de la siguiente forma:
. . .
. . .
Debemos recordar que al fin y al cabo el tema serán unos archivos .css, con una confi-
guración y unos iconos en el caso de que hayamos decidido usarlo:
587
Como podrás observar, con pocos cambios y algunos detalles más podemos cambiar to-
talmente la apariencia de una aplicación y dar la sensación de más formal, informal o adaptada
al contenido de la aplicación.
Los temas que exportemos debemos guardarlos y no perder el archivo exportado, ya que
si queremos modificar en otro momento el tema y hemos modificado la estructura del archivo,
podemos volver a la misma página, importar el tema y seguir diseñando lo que creamos conve-
niente.
Al igual que pasaba en CSS3, debemos usar los temas y diseños personalizados sólo para
la apariencia y diseño, no para el posicionamiento de los elementos. Esto lo realizamos con la
semántica de nuestra aplicación.
Aula Mentor
www.midominio.com www.midominio.com
m.midominio.com
mobile.midominio.com
mobi.midominio.com
xxxxx.midomino.com
O crearnos una carpeta dentro del propio dominio, donde alojaremos la página:
www.midominio.com/m
www.midominio.com/mobile
www.midominio.com/mobi
www.midominio.com/xxxx
M4. Aplicaciones Web Multiplataforma
También se lanzó las extensiones específicas para dispositivos móviles, por lo que po-
dríamos contratar nuestro mismo dominio con la extensión .mobi, dejando para los dispositivos
móviles la siguiente dirección:
www.midominio.mobi
Realmente estas son formas de llamar o de cómo enlazar con nuestra web creada para
dispositivos móviles, lo que nos interesa realmente es saber que tendremos que tener en nuestro
servidor dos carpetas: una para la versión web estándar y otra para la móvil, posteriormente,
podremos acceder a ella de muchas formas (subdominio, carpeta o extensión del dominio).
Veamos que tenemos que hacer cuando entra una petición a nuestro servidor web de
un navegador solicitando información (acceder al index.html) de nuestro dominio principal, su-
pongamos que hemos decidido que vamos a crear una carpeta dentro de nuestro directorio de
nombre mobile, y ahí tendremos el proyecto que hemos creado:
589
Es recomendable dar la opción al usuario que ha entrado en la parte móvil, usar la pági-
na estándar, ya que normalmente las web móviles tienen menos contenidos, imágenes e incluso
acciones que las otras. Para ello, tendríamos que grabar de alguna forma una variable que nos
indique si va a ser móvil o web, un ejemplo podría ser el almacenamiento con localstorage o
sessionStorage. Otra forma sería usar variables de sesión en el navegador mediante PHP.
Para detectar si es un dispositivo móvil o no vamos a usar la variable User Agent en con-
creto sería: HTTP_USER_AGENT. Una vez hemos detectado qué sistema operativo es, podemos
hacer una redirección, mediante htaccess o mediante el lenguaje de programación PHP, con él
podemos capturar el navegador y la versión concreta que está accediendo.
Posteriormente tendríamos que comparar el resultado de esa variable con alguna lista,
base de datos o array donde tengamos aquellos navegadores que son candidatos a ser mostrados
como dispositivo móvil. Para ello, podemos usar la web:
http://www.aplicacioneswebmultiplataforma.es/
En la sección de utilidades nos podremos descargar una lista de alrededor 200 navega-
dores distintos, muchos son de ordenadores personales, otros son de smartphone, SmartTv, otras
de Tablets, etc.
Aula Mentor
SmartTv
Mozilla/5.0 (SMART-TV; X11; Linux i686) AppleWebKit/535.20+ (KHTML, like Gecko) Version/5.0
Safari/535.20+
Smartphone
Tablet
Mozilla/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko)
Version/7.0 Mobile/11D257 Safari/9537.53
PC (windows 7+Chrome)
Si nos fijamos en la cadena de texto que nos devuelve muchos datos, y casi podemos
intuir el dispositivo del que se trata, fijemonos en la SmartTv, pone directamente el nombre.
590
Para mostrar y comprobar el navegador en el curso, entre las diferentes formas, vamos a
usar la opción de tener un fichero PHP por su simplicidad; usaremos para ello un fichero XML
(eXtensible Markup Language -lenguaje de marcas extensible-), que contendrá el listado de pa-
reja NAVEGADOR – VISTA.
Sin profundizar mucho en los ficheros XML, vamos a resumir de forma informal que
los ficheros XML van a ser unos ficheros de texto plano que tiene una estructura concreta. Esta
estructura se puede trasladar a bases de datos, tablas, ficheros o comunicación entre programas.
Usa al igual que HTML etiquetas, unas serán de apertura y otras de cierre, y contienen una jerar-
quía, la cual corresponde a cada campo o nodo. A diferencia del HTML debes tener en cuenta
que XML sí va a distinguir entre mayúsculas y minúsculas (case sensitive) en las etiquetas, por
lo que debes tener cuidado para evitar errores.
<personas>
M4. Aplicaciones Web Multiplataforma
<nombre>Antonio</nombre>
<dni>12345678</dni>
<nombre>Luis</nombre>
<dni>87654321</dni>
<personas>
Eso se podría corresponder a los siguientes datos, ya sea de un fichero, base de datos o
texto plano:
Tabla personas
nombre dni
Antonio 12345678
Luis 87654321
useragent: donde vamos a almacenar la cadena completa que nos da el navegador. Es 591
importante comprobar que en muchos casos nos indica el dispositivo e incluso el modelo con-
creto. Por lo que tendremos un amplio abanico de opciones.
vista: donde vamos a indicar si para ese dispositivo vamos hacer la vista multiplatafor-
ma, que hemos adaptado para otros dispositivos (jQuery Mobile) o la (estándar/normal).
useragent vista
Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; multiplataforma
Lenovo A660 Build/IMM76D) AppleWeb-
Kit/534.30 (KHTML, like Gecko) Version/4.0
Mobile Safari/534.30
Mozilla/5.0 (Windows NT 6.1; WOW64) normal
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/37.0.2062.94 Safari/537.36
Mozilla/5.0 (iPad; CPU OS 7_1_2 like Mac OS multiplataforma
X) AppleWebKit/537.51.2 (KHTML, like Gec-
ko) Version/7.0 Mobile/11D257 Safari/9537.53
Mozilla/5.0 (SMART-TV; X11; Linux i686) multiplataforma
AppleWebKit/535.20+ (KHTML, like Gecko)
Version/5.0 Safari/535.20+
Mozilla/5.0 (Windows NT 5.1) AppleWe- normal
bKit/537.36 (KHTML, like Gecko) Chro-
me/36.0.1985.143 Safari/537.36
Aula Mentor
El fichero se llamará navegadores.xml y será una lista muy extensa con la siguiente es-
tructura:
<!--
- FECHA: 29/08/2014
- REGISTROS: 187
-->
<navegadores name=”navegadoresweb”>
<dispositivo name=”nav”>
</dispositivo>
</navegadores>
Y para usarlo vamos a utilizar un archivo en lenguaje PHP. No es objetivo del curso el
conocimiento de este lenguaje, y no te has de preocupar si no entiendes totalmente el lenguaje,
ya que debes comprender que si no lo has visto nunca, es un lenguaje nuevo con sus peculia-
ridades. Este punto no se evaluará ni se tendrá encuenta en la nota, pero es preferible tener el
código para realizar la comutación de alguna forma. Se han agregado los comentarios al archivo
para comprender que se realiza en cada acción, de todas formas, debemos quedarnos con el
concepto global,es decir, vamos a usar un archivo, el cual va a leer el navegador actual, lo va a
comparar con un archivo XML y dependiendo de lo que nos devuelva este archivo, mostraremos
una página u otra.
No debemos olvidar que PHP es un lenguaje del lado del servidor, por lo que realmente
muestra al navegador lo que el servidor desee. Puede tener trozos de código HTML5 entremez-
clados con trozos de código de PHP. Para poder intercalar entre código PHP con código HTML5
tenemos que iniciar las siguientes etiquetas:
M4. Aplicaciones Web Multiplataforma
<?php
?>
Y para escribir desde PHP código HTML5 tenemos dos opciones, cerrar la etiqueta con
?> o usar echo, que imprime o muestra el código al navegador.
Nosotros vamos a usar una función para que lea el navegador y la almacenaremos en
una variable del lado del servidor y además la grabaremos en la sesion del navegador. Le pon-
dremos de nombre modoNavegador y así en el caso que necesitemos preguntar o modificar de
nuevo, tendremos una variable creada. Si entramos en modo depurador del navegador podre-
mos comprobar que se ha creado correctamente, para ello, sólo hemos imprimido desde PHP el
código siguiente:
echo ‘
<script>
sessionStorage.setItem(“modoNavegador”,”’.$vistaDevuelta[‘vista’].’”);
</script>’;
Donde $vistaDevuelta[‘vista’] es la variable de tipo PHP que almacena el resultado de- 593
vuelto de leer el fichero XML, y lo guardaremos por si en un futuro lo necesitamos.
El codigo completo del fichero que realiza la conmutación de un modo a otro sería el
siguiente:
<?php
//Recogemos el valor de la variable HTTP_USER_AGENT donde está almacenado el valor del navegador
$infoAgent=$_SERVER[‘HTTP_USER_AGENT’];
/* Función que busca dentro del fichero XML y devuelve el modo de vista.
*/
function dame_vista_dispositivo($variableNavegador){
- new SimpleXMLElement
- simplexml_load_file(fichero)
*/
$navegadoresXML = simplexml_load_file(‘navegadores.xml’);
594 $encontrado=false;
foreach($navegadoresXML->children() as $nodo){
/*
*/
if($variableNavegador == $nodo->useragent){
$vistaDevuelta[‘vista’] = $nodo->vista;
$vistaDevuelta[‘encontrado’] = true;
M4. Aplicaciones Web Multiplataforma
//Creamos una variable de sesion por defecto almacenaremos si es versión móvil o normal.
echo ‘
<script>
sessionStorage.setItem(“modoNavegador”,”’.$vistaDevuelta[‘vista’].’”);
</script>’;
return $vistaDevuelta;
?> 595
Y a partir de ahora como hemos cerrado la etiqueta de PHP, podemos escribir directa-
mente el código HTML5.
<!DOCTYPE html>
<html lang=”es”>
<head>
<title>Módulo jQueryUI</title>
<!-- Fichero que se refiere a jQuery UI para poder usar sus diseños -->
<!-- Añadimos la hoja de estilo de jQuery UI para poder usar sus diseños-->
Aula Mentor
</head>
<body>
<section>
<article>
<h4> De todas formas si quieres acceder manualmente puedes usar la versión que desees.
Versión PC o Multiplataforma</h4>
<?php
$valorDevuelto = dame_vista_dispositivo($infoAgent);
if($valorDevuelto[‘encontrado’] == true){
if($valorDevuelto[‘vista’] == ‘normal’){
}else{
}else{
echo “<h3>NO hemos encontrado tu dispositivo en nuestra base de datos, la navegación por
defecto será <b>MULTIPLATAFORMA</b></h3>”;
?>
</h3>
<br>
</article>
</section>
</body>
</html>
También hemos usado un contador hacia atrás, de forma opcional para informar al usua-
rio, pero como nosotros ya sabemos que con jQuery podemos hacer una cuenta atrás modifi-
cando el valor del texto que se muestra al inicio:
Además hemos usado también unos botones para dar la opción al usuario de elegir qué
versión quiere ver NORMAL o MULTIPLATAFORMA, en nuestro caso hemos usado jQueryUI, y
para ello hemos usado el método .button(), quedando el código de mi archivo con los script
jQuery miarchivojquery.js de la siguiente forma:
Aula Mentor
$(document).ready(function(){
var i = 9;
var tiempo=1000;
function sigueRestando(){
j= i;
i--;
//en la variable i
M4. Aplicaciones Web Multiplataforma
function actualizaContador2(){
$(“#contadorAtras”).text(i);
if(i!=1){
sigueRestando();
}else{
Hemos mostrado por consola varios mensajes para ayudar a la compresión de las fun-
ciones y métodos que hemos usado para realizar la cuenta atrás, recuerda que para verlos debes
entrar y usar el modo depurador del navegador.
14. Resumen.
- Al igual que con jQuery UI teníamos unos métodos y temas predefinidos orientados para las
páginas web, con jQuery Mobile tendríamos lo mismo pero orientado para dispositivos mó-
viles. Podríamos decir que jQuery Mobile “es un sistema unificado de interfaces de usuario
para todas las plataformas populares de dispositivos móviles, creado sobre los sólidos funda-
mentos de jQuery y jQueryUI. Su ligero código se desarrolla usando la mejora progresiva, y
posee un diseño flexible al que es fácil aplicar temas”.
Aula Mentor
- La estructura básica de jQuery Mobile se basa en roles de los elementos, temas y al igual
que pasaba con HTML5 tendríamos una zona de navegación, donde en un mismo archivo
podemos contener varias páginas gracias al método data-role=”page”.
- Para las listas tenemos muchas opciones, desde la lista básica a divididas, filtrar texto de la
lista o listas compuestas. Todas éstas se pueden usar gracias al data-role = “listview” y junto
con data-icon=”edit”, data-filter=”true o la clase class=”ui-li-icon” respectivamente.
- Para crear nuestras pestañas o tabs, tenemos que usar data-role=”tabs” y para navegar po-
dríamos usar <div data-role=”navbar”>.
- Respecto a los formularios se podría tratar de forma muy similar a como hemos usado en
HTML5. En concreto si el formulario consiste en enviar un correo electrónico, hay que revi-
sar qué sistema operativo tiene el servidor y configurar que éste mande correos electrónicos.
Para esta función podremos ayudarnos de PHP y de la librería PHPMailer.
- Para la transición entre páginas usaremos data-transition: podemos usar diferentes efectos:
Slide: Animación de derecha a izquierda. SlideUp: animación de abajo arriba. SlideDown:
animación de arriba abajo. Pop: animación crecerá desde un punto central hasta completar
toda la página. Fade: realiza un fundido cruzado de la página antigua a la nueva. Flip: ro-
tación sobre la página, efecto 3D.
600 - Cuando dispongamos de dos páginas web, una para dispositivos con pantalla grande o
estándar y otra para móviles o multiplataforma, tendremos que tener un método para que
nuestra aplicación automáticamente se dirija hacia una u otra página, ya sea un subdominio,
subcarpeta o dirección concreta. También tendremos que dar la opción en el caso de usar
multiplataforma usar la web estándar.
Unidad 10. Introducción al desarrollo de
aplicaciones multiplataforma
1. Introducción.
Existen muchas marcas de dispositivos, y cada una con su propio sistema operativo, éstas
además tienen aplicaciones para dar más servicios a sus usuarios. El problema viene del lado
del desarrollador, ya que cada sistema operativo ha apostado por un lenguaje y por una forma
de programar:
http://developer.android.com/index.html
iOS/OSX (Iphone, Ipad…etc) Objective-C inicialmente y desde junio 2014
Apple ha sacado un nuevo lenguaje para pro-
gramar en iOS/OSX llamado swift.
https://developer.apple.com/swift/
Blackberry Blackberry OS, mezcla de varios lenguajes
QML, ,Javascript, HTML5…etc.
http://developer.blackberry.com/html5/
Windows Phone C# y Visual Studio, puedes descargarte todas
las herramientas de éste blog
http://blogs.msdn.com/b/ricardoj/archi-
ve/2012/07/12/desarrollo-de-aplicaciones-pa-
ra-windows-phone-herramientas.aspx
Symbian OS C++ con el Framework Qt o J2ME.
http://enyojs.com/
Como podemos ver, para hacer aplicaciones para los diferentes lenguajes tenemos que
dominar diferentes lenguajes, y eso sólo para la realización de las aplicaciones en los dispo-
sitivos. Si somos trabajadores de una empresa y ésta tiene página web, y además quiere tener
aplicación web para dispositivos móviles, más su aplicación para los dispositivos, tendremos que
saber, aún más lenguajes de programación.
Lo bueno que con todo lo que hemos visto en el curso tenemos un % muy alto para
desarrollar su aplicación web, la aplicación web para dispositivos móviles y tenemos una buena
base para la programación de aplicaciones en los dispositivos multiplataforma, aquellos dispo-
sitivos que se basen en HTML5, CSS3, Javascript o jQuery.
Además, existen diferentes Framework que intentan unificar la mayoría de las aplicacio-
nes partiendo de un lenguaje común y la tendencia debido a la tendencia de unificar el progra-
mador web con el programador de aplicaciones, es usar un lenguaje adaptado a él, siendo el
más extendido el que hemos aprendido en el curso.
602
2. Visión general de los Framework Existentes.
Como hemos comentado anteriormente, por el bien de los desarrolladores, existen di-
ferentes Framework llamados multiplataforma, ya que ofrecen la posibilidad de exportar a dife-
rentes sistemas (Android, App Store, etc) partiendo de un solo proyecto.
Vamos a ver las de todas éstas, las que están más orientadas según el perfil que hemos
recibido en el curso:
decir que no son realmente aplicaciones nativas al dispositivo (ya que el renderizado se realiza
mediante vistas web a través del navegador del dispositivo y no con interfaces gráficas especí-
ficas de cada sistema), pero no se tratan tampoco de aplicaciones web (teniendo en cuenta que
son aplicaciones que son empaquetadas para poder ser desplegadas en el dispositivo incluso
trabajando con el API del sistema nativo).
Como hemos visto en el curso, con jQuery UI y jQuery mobile podemos desarrollar apli-
caciones web, ver cómo quedan en el dispositivo y luego junto con PhoneGap poder exportarla
a la plataforma que deseemos:
http://demos.jquerymobile.com/1.1.0/docs/pages/phonegap.html
Aula Mentor
También podemos usar otras plataformas como Sencha Touch 2, que están basadas al
igual que PhoneGap en HTML5.
Es otro Framework basado en HTML5. Sencha Touch es una interfaz de usuario (UI)
de la biblioteca JavaScript, construido específicamente para la Web Móvil. Puede ser utilizado
por desarrolladores web para desarrollar interfaces de usuario para aplicaciones web móviles
para que se vean y se asemejen a aplicaciones nativas en dispositivos móviles compatibles. Está
basado completamente en estándares web como HTML5, CSS3 y JavaScript. Sencha Touch tiene
como objetivo permitir a los desarrolladores el crear rápida y fácilmente aplicaciones móviles
basadas en HTML5 que funcionan en los dispositivos Android, iOS, Windows Tizen y BlackBe-
rry, y producir una experiencia nativa-app-como dentro de un navegador.
Este Framework también es muy recomendado según el perfil que hemos adquirido en
el curso, ya que tenemos todos los conocimientos importantes para desarrollar aplicaciones ba-
sadas en aplicaciones web.
Una vez que hemos desarrollado nuestra aplicación web, podemos distribuir ésta en las
distintas tiendas, pero para ello, antes de hacerlo, debemos empaquetar nuestra aplicación, es
decir, copiar nuestros archivos (HTML, JavaScript, CSS y jQuery Mobile) en proyectos diferentes
y crear estructuras concretas para cada plataforma.
Comentar que desde el W3C (World Wide Web Consortium es una comunidad interna-
cional que desarrolla estándares que aseguran el crecimiento de la Web a largo plazo) están
trabajando en un estándar para empaquetar aplicaciones Web para su distribución. El grupo es
Native Web apps y puedes obtener más información en:
http://www.w3.org/community/native-web-apps/
Cuando empaquetamos una aplicación Web como una aplicación nativa, tenemos la ca-
pacidad de acceder a algunas API nueva que no suelen estar en HTML5, como son acceder a la
lista de contactos, tomar una foto y guardarla en la galería y otros sensores de última generación
(detectar mirada para iniciar/parar la ejecución de un vídeo, capturar huella dactilar, aceleróme-
tro, etc).
* Crear un proyecto nativo para cada plataforma, añadir los archivos de nuestra aplicación web
como recursos locales y utilizar un componente Web View para asociarlo a nuestro contenido
HTML. Por ejemplo, crearíamos un proyecto para Android con Eclipse, le agregamos los archivos
M4. Aplicaciones Web Multiplataforma
correspondientes (HTML, CSS, JS, etc) y creamos un componente Web View, copiamos index.
html en la carpeta assets/www y se cargaría como una aplicación como tal. Este tipo de aplica-
ciones se llaman aplicaciones híbridas, porque existe una parte nativa y otra en modo apli-
cación web. Por ello debemos conocer el SDK (software development kit) de cada plataforma
(iOS, Android, etc) y agregarle los archivos que hemos creado, como es de suponer esta opción
requiere mucho conocimiento, y en determinadas ocasiones, un dispositivo Mac para poder
exportar a Iphone.
* Utilizar directamente una plataforma oficial de aplicaciones Web, y directamente desde ahí nos
ofrece la posibilidad de exportar nuestros proyectos a un archivo .zip (tipo PhoneGap). Empa-
quetandolo correctamente.
* Utilizar un entorno nativo, creando por tanto aplicaciones nativas, que nos permita compilar
nuestra aplicación para varias plataformas (tipo Titanium Studio).
Una vez hemos decidido cómo lo vamos a realizar, debemos conocer la distribución en
las distintas tiendas:
Existen otras tiendas donde podemos distribuir nuestra aplicaciones, aunque no son
muy conocidas, (ya que la mayoría de los usuarios usan la tienda que le trae cada dispositivo),
aunque el mercado de éstas van creciendo, y podemos destacar entre otras: AndroidPit, SlideMe,
GetJar (la primera que lanzó el Angry Birds), apps.opera.com, etc.
También tendremos que tener en cuenta que nuestra aplicación debe tener:
- Un icono en alta resolución para que se agregue a las apps del dispositivos.
Es necesario por tanto obtener de alguna forma, una repercusión monetaria de todo ese
esfuerzo, y debemos volver hacer un análisis del estado actual y las tendencias.
Debemos ser fríos y calculadores, pensando para qué mercado voy a desarrollar y cuánto
tiempo me va emplear la adaptación, o en que tiendas voy a empezar a trabajar. En optimiza-
ción, calidad y cuando tenemos dudas sobre qué decidir, existe un teorema que es el “teorema
de Pareto”. Consiste en la relación 80-20 o 20-80. Es decir, tenemos que abordar el 80% del
606 problema (¿Qué tienda o plataforma?) con el 20% del esfuerzo. Por lo que mi recomendación,
tanto para el desarrollo de aplicaciones como para otras dudas respecto a decisiones, siempre
es abordar el máximo de aplicaciones que abarque el 80% de las tiendas o dispositivos.
Es posible que otra gente piense, ¿no es mejor apostar por un sitio donde no haya tantas
aplicaciones y opciones? Efectivamente, podíamos emplear el 80% del esfuerzo en el 20% de
las tiendas o dispositivos. El problema viene cuando te pagan por cada descarga (si haces una
app de pago) o por publicidad, ¿dónde tendríamos más posibilidad de tener más descargas? Eso
no quita, que si disponemos de tiempo, primero nos centremos en las que ocupen un % mayor
(Android e iOs) y posteriormente las adaptemos para las demás plataformas.
También debemos preguntarnos, ¿vamos hacer nuestra aplicación de pago, gratuita con
publicidad, o subvencionada a través de otros medios? ¿parte gratuita (demo) y aplicación com-
pleta de pago? ¿incialmente gratuita y pasado un tiempo de pago? Sería cuestión de analizar
todas estas preguntas y finalmente decidir la mejor estrategia dependiendo de la plataforma a
desarrollar.
http://appleinsider.com/
http://www.appbrain.com/stats/stats-index
M4. Aplicaciones Web Multiplataforma
También Google nos ofrece otra plataforma donde nos recomienda cómo monetizar
nuestras aplicaciones:
http://www.google.es/ads/admob/monetize.html
http://www.inmobi.com/monetize/
Otra forma de monetizar las aplicaciones puede ser diferente, no tan directa, pero sí
puede ser un proyecto a medio o largo plazo. Serían las siguientes:
Por tanto, independientemente de la opción que elijas, te aconsejo que desarrolles un 607
buen proyecto final en este curso y éste sea útil, tanto personalmente como profesionalmente.
Realiza una buena página personal, con su parte móvil o incluso una aplicación. Tanto si deseas
recibir dinero por ellas, como si quieres demostrar lo que eres capaz hacer, tienes que tener algo
tangible que mostrar. Así que, ¡ánimo y a por tu proyecto!
Bueno, toda aplicación es válida mientras que sea buena y útil para el usuario. Debes
ser innovador y también debes intentar hacer aplicaciones para el usuario, a no ser que sea ese
el objetivo no hacer aplicaciones para uno mismo. Con esto me refiero que debes ver cómo se
usan la mayoría de la aplicaciones y siempre aclarar, no hacer retos al usuario en la navegabili-
dad.
Como caso real, comentar el de unos desarrolladores que realizaron una web tan inno-
vadora que el 80% de los usuarios no sabían manejarla, no encontraban el menú de navegación,
básicamente porque no se sabían cómo iniciar la navegación, y con la rapidez que hoy en día
lleva el usuario casi todos la desestimaron, pensaron que estaba en obras o de mantenimiento.
Ser innovador, es crear cosas nuevas, mejores a las que hay, no peores. Este grupo de desarro-
lladores hicieron una web para ellos, y no pensarón en el perfil de sus usuarios, posteriormente
tuvieron que modificar la estructura.
Debes tener en cuenta el perfil de tus usuarios y adaptarte a ellos, por ejemplo si es una
aplicación para personas mayores, por ejemplo, tendrás que estudiar su perfil, tener en cuenta
poner las opciones grandes, con grandes botones y que se vean sobre todo bien, obviando más
Aula Mentor
También debes pensar que no sólo las personas de habla hispana van a poder acceder
a tu aplicación, piensa que si tienes una página web, o realizas una aplicación existe un gran
número de usuarios potenciales que pueden ser de habla inglesa, y si tienes la posibilidad de
hacer la traducción, puede tener mayor repercusión, cambiando solo el texto base.
Si realizas tu aplicación no debes olvidar que en algunos dispositivos, como por ejemplo
el iPhone, no tiene botón atrás, y como en algún punto olvides esto, puedes dejar al usuario en
un “punto muerto” sin poder avanzar ni retroceder.
Debes intentar hacer tu diseño basado en % lo máximo posible, porque así se adaptará
tanto a un dispositivo de pantalla grande, como a uno de pantalla pequeña, recuerda lo que
comentamos sobre Responsive Web Design.
Cuando estés desarrollando aplicaciones móviles, debes evitar abrir páginas externas
desde tu aplicación, ya que perderás el control de la misma y tendrás problemas para ello, ya
que si la estas desarrollando con el webview, usando archivos locales cargados en tu dispositivo,
no podrás acceder a ellos, y en el caso de que pudieras, si estás con un Iphone, a lo mejor esa
web externa no tiene la opción de vuelta atrás, y si la tiene, no va a ser nunca a tu archivo local.
608 Puedes crear juegos que no requieran de mucho procesamiento gráfico, memoria o cpu,
ya que es posible que no vaya igual de fluida que una aplicación nativa, pero ¡ojo! puedes hacer
infinidad de juegos del tipo: tres en raya, trivial o cualquier aplicación de preguntas y respuestas,
ahorcados, apalabrados, busca minas, dale al topo, puzzle, brain training, etc. Como podemos
trabajar con gráficos 2D y código HTML5, básicamente podemos hacer cualquier aplicación que
se nos ocurra, crear botones personalizados y tendrá éxito mientras que sea divertida para el
usuario y disfrute de la aplicación.
Una de las formas más usuales de llamar a los usuarios es crear juegos, y como cada
vez los usuarios empiezan con una edad más temprana, existe una gran demanda de esta cate-
goría de aplicaciones, tanto web como para móviles como para tablets. Existe un gran mercado
de Framework, la mayoría de pago para crear tus propios juegos incluso con HTML5. Están en
constante evolución, pero podríamos mencionar los siguientes:
- Akihabara http://www.kesiev.com/akihabara/
- LimeJS http://www.limejs.com/
M4. Aplicaciones Web Multiplataforma
- Construct 2 http://www.scirra.com/construct2
- ImpactJS http://impactjs.com
- Box2d JS http://box2d-js.sourceforge.net/
¿Empiezo ya a programar?
Rotundamente NO. En general no se debe empezar ningún proyecto sin haber realiza-
do un gran análisis de todo. Tristemente, la mayoría de las veces cuando se habla de crear un
proyecto web, lo primero que hace la mayoría de la gente, es abrir el block de notas y empezar
<html><head>….etc . Es un error muy importante y cometido muy a menudo, en vez de pasar
directamente a la implementación, es necesario realizar un gran análisis previo, coger un papel
y un lapiz (porque te puedes equivocar y siempre se puede rectificar) o cualquier otro sistema y
hacer un diseño junto con un estudio previo. Mínimo debes responderte las siguientes pregun-
tas: ¿qué quiero hacer? ¿cómo lo quiero hacer? ¿cómo lo voy a desarrollar? ¿qué tiempo le voy
a emplear? ¿cuál es el perfil de los usuarios? ¿en qué navegadores o dispositivos me voy a cen-
trar? Conforme empieces a desarrollar tu historyboard, verás que te surgirán más preguntas, y
pensarás, si hago esto así me ahorro parte de código y además, puedo ampliarla si en un futuro
fuera necesario.
Depende de la envergadura del proyecto, de tu tiempo libre y de las ganas que tengas 609
de formar un proyecto colaborativo, tendrás que responderte a esta pregunta.
Por ejemplo, en una aplicación pueden existir muchas secciones que son muy importan-
tes, divisibles y que a simple vista puede no tener importancia. Imaginemos que vamos hacer
una aplicación para niños entre 2 y 5 años. Sería muy interesante a nivel pedagógico tener una
persona experta en el desarrollo evolutivo del niño, comprender la evolución y cómo puede ser
realmente atractiva, beneficiosa y constructiva. También, necesitarás de una persona encargada
del diseño, la combinación de colores, la usabilidad, y el formato que se le va a dar, otra de
la parte propia de la implementación, y dependen de la necesidad es posible necesitar incluso
gente experta en servidores, seguridad, bases de datos, etc.
He visto a personas de forma individual crear proyectos propios muy interesantes y gra-
cias a que han tenido la posibilidad de dedicarle muchas horas, han realizado un trabajo mag-
nífico. Pero no debes desechar de primera instancia pertenecer a algún proyecto colaborativo
algún día, independientemente que por ti mismo estés creando otro. Seguro que éste te aportará
mucho beneficio y si no estás acostumbrado a trabajar en equipo, descubriras sus beneficios y
sus resultados.
5. Limitaciones y tendencias.
Es necesario comentar que existe diferencia entre las aplicaciones nativas y las aplica-
ciones web creadas por los medios que estamos comentando. Debes saber que los dispositivos
tienen un hardware (parte física del dispositivo, cpu, memoria, etc) y un sistema operativo que
interactúa con el hardware. Las aplicaciones nativas, se integran dentro del sistema operativo
y pueden interactuar con él, por ejemplo: usar los sensores internos, detectores luminosidad,
batería, estado de cpu o memoría libre, etc.
Aula Mentor
Todas estas acciones no las podremos hacer sin ayuda de algún Framework intermedio,
pero si es verdad que la tendencia es que se vaya abriendo más la posibilidad de unificar todo y
finalmente se pueda programar con estos lenguajes a un nivel más bajo. Para ello, los framework
multiplataforma realizarán un trabajo mayor y convertirán en nativas o híbridas, lo que tan sen-
cillamente hemos realizado nosotros con HTML5, CSS3, JavaScript o Jquery Mobile. Tendrán una
forma de acceder al código nativo, que el framework automáticamente convertirá en código
nativo.
Pero a no ser que necesites usar el hardware del propio dispositivo a un nivel muy extre-
mo o alguna funcionalidad nativa del dispositivo, podrás desarrollar una gran cantidad de apli-
caciones multiplataforma, de una forma muy rápida, con un lenguaje en su mayoría conocido
y si eres cuidadoso en el diseño, es posible que la mayoría de los usuarios no distingan en una
aplicación web o una aplicación nativa.
610