HTML. Unidad 7. Formato de texto avanzado.

Presentación

Infografías

Diapositivas y vídeos

Podrás familiarizarte con los contenidos clave de esta unidad a través de esta presentación y esta otra; estas diapositivas; y este vídeo y finalmente, este otro .

Introducción

HTML dispone de numerosos elementos para dar formato al texto que no abordamos en las unidades anteriores. Aunque las etiquetas que se describen en esta unidad son menos conocidas o de uso más específico, conocerlas resulta de gran utilidad para enriquecer nuestros documentos. Aprenderás a realizar el marcado semántico correcto de abreviaturas, citas y referencias, fragmentos de código informático, ecuaciones matemáticas y datos de contacto.

Abreviaturas

El elemento de abreviatura de HTML (<abbr>) representa una abreviatura o un acrónimo. A través del atributo opcional title, podemos proporcionar el significado desarrollado del término o una descripción legible para el usuario.

Por lo general, los navegadores presentan este texto mediante una etiqueta emergente (tooltip) que aparece automáticamente cuando se pasa el cursor del ratón sobre el elemento. Es importante tener en cuenta que, si se incluye el atributo title, este debe contener única y exclusivamente la descripción completa, sin añadir texto adicional.

A continuación, veamos algunos ejemplos prácticos en los que resulta adecuado el uso de abreviaturas o acrónimos:

Usamos HTML para estructurar nuestros documentos web.
Puedes utilizar CSS para dar estilo a tu HTML.
La NASA realiza un trabajo fascinante, sin duda.
El chiste de Ashok me hizo LOL muchísimo.

Veamos ahora qué código HTML debemos escribir para conseguir ese resultado:

<p>Usamos <abbr title="Lenguaje de Marcado de Hipertexto">HTML</abbr> para estructurar nuestros documentos web.</p>

<p>Puedes utilizar <abbr title="Hojas de Estilo en Cascada">CSS</abbr> para dar estilo a tu <abbr title="Lenguaje de Marcado de Hipertexto">HTML</abbr>.</p>

<p>La <abbr title="Administración Nacional de Aeronáutica y el Espacio">NASA</abbr> realiza un trabajo fascinante, sin duda.</p>

<p>El chiste de Ashok me hizo <abbr title="Reír a carcajadas">LOL</abbr> muchísimo.</p>

El objetivo principal de este elemento es aportar valor semántico y facilitar información adicional. Aunque todos los navegadores lo muestran como un elemento en línea (inline) de forma predeterminada, su estilo visual por defecto no es consistente y varía según el navegador (si bien esto siempre puede unificarse añadiendo reglas CSS).

Las diferencias de estilo más comunes son las siguientes:

  • Sin estilo visual: Algunos navegadores, como Internet Explorer, no le aplican ninguna apariencia distintiva, mostrándolo exactamente igual que si fuera un elemento <span>.
  • Subrayado: Navegadores como Opera o Firefox suelen añadir un subrayado de puntos al texto de la abreviatura para diferenciarlo.
  • Versalitas: Unos pocos navegadores van un paso más allá y, además del subrayado punteado, transforman el texto a versalitas (small caps).

Ejercicio propuesto: Ejemplo de uso de abreviaturas

Crea una página web utilizando el código del ejemplo anterior, y añade varios párrafos nuevos que contengan algunas abreviaturas y verifica el resultado en tu navegador. Recuerda incluir el resto de etiquetas básicas de HTML necesarias para la estructura del documento y no olvides validar tu código.

Ejercicio propuesto: Abreviaturas para chatear

El mundo del correo electrónico, los mensajes de texto y la mensajería instantánea han dado lugar a toda una serie de acrónimos y abreviaturas que permiten a los usuarios redactar sus mensajes con mayor rapidez. En este ejercicio deberás crear un par de listas. La primera incluirá la relación de abreviaturas que se enumeran a continuación (puedes añadir otras que conozcas). La segunda lista deberá contener al menos veinte frases que ilustren cómo se utilizan dichas abreviaturas en una conversación de chat.

Además, utiliza encabezados <h1> y <h2> para añadir títulos a las listas y proporcionar así un texto descriptivo previo.

Por ejemplo, la primera lista podría mostrar las abreviaturas de la siguiente manera:

  • bn – Bien
  • bss – Besos
  • finde – Fin de semana
  • hl – Hola
  • kdms – Quedamos
  • npi – Ni puñetera idea
  • ns / nc – No sabe / No contesta
  • pf / xfa – Por favor
  • pq / xq – Por qué
  • q tal – Qué tal
  • rt – Retuit (compartido / de acuerdo)
  • salu2 – Saludos
  • tb – También
  • tqm – Te quiero mucho
  • tpc – Tampoco
  • vdd – Verdad
  • xo – Pero
  • +o- – Más o menos

La segunda lista deberá incluir al menos veinte frases en las que se empleen dichas abreviaturas. Por ejemplo:

  • Espero que te encuentres bn, hace tiempo que no hablamos.
  • Me tengo que ir corriendo, hablamos luego. ¡bss!
  • ¿Tenéis algún plan interesante para este finde?
  • hl, ¿te ha llegado ya el paquete que te envié?
  • Si os parece bien, kdms a las 20:00 en la plaza mayor.
  • No me preguntes cómo arreglarlo porque no tengo npi.
  • Le he preguntado si vendrá a la cena de empresa, pero de momento ns / nc.

Puedes utilizar el siguiente código como ejemplo para saber qué etiquetas debes utilizar para obtener ambas listas:

<h1>Algunas abreviaturas que uso para chatear</h1>

<h2>Las abreviaturas</h2>

<ul>
    <li>bn - Bien</li>
    <li>bss - Besos</li>
    <li>finde - Fin de semana</li>
    <li>hl - Hola</li>
    <li>kdms - Quedamos</li>
    <li>npi - Ni puñetera idea</li>
    <li>ns / nc - No sabe / No contesta</li>
    <li>...</li>
</ul>

<h2>Algunos ejemplos</h2>

<ul>
    <li>Espero que te encuentres <abbr title="Bien">bn</abbr>, hace tiempo que no hablamos.</li>
    <li>Me tengo que ir corriendo, hablamos luego. ¡<abbr title="Besos">bss</abbr>!</li>
    <li>¿Tenéis algún plan interesante para este <abbr title="Fin de semana">finde</abbr>?</li>
    <li><abbr title="Hola">hl</abbr>, ¿te ha llegado ya el paquete que te envié?</li>
    <li>Si os parece bien, <abbr title="Quedamos">kdms</abbr> a las 20:00 en la plaza mayor.</li>
    <li>No me preguntes cómo arreglarlo porque no tengo <abbr title="Ni puñetera idea">npi</abbr>.</li>
    <li>Le he preguntado si vendrá a la cena de empresa, pero de momento <abbr title="No sabe / No contesta">ns / nc</abbr>.</li>
    <li>...</li>
</ul>

Citas

El elemento <q>

El elemento HTML <q> indica que el texto que encierra es una cita corta en línea (inline). La gran mayoría de los navegadores modernos interpretan este elemento envolviendo automáticamente el texto entre comillas.

Asimismo, puedes utilizar el atributo cite para especificar una URL que señale el documento de origen o la fuente de la información citada, aunque es importante tener en cuenta que, por defecto, el navegador no muestra esta URL al usuario de forma visible.

A continuación mostramos un par de ejemplos analizando primero el resultado visual (en la mayoría de los casos la única diferencia es que las comillas aparecen automáticamente para acotar la cita):

Cuando Dave le pide a HAL que abra las compuertas de la cápsula, HAL responde: "Lo siento, Dave. Me temo que no puedo hacerlo".

Según el sitio web de Mozilla, "Firefox 1.0 se lanzó en 2004 y se convirtió en un gran éxito".


Y ahora el código fuente correspondiente:

<p>
    Cuando Dave le pide a HAL que abra las compuertas de la cápsula, HAL responde: <q cite="https://www.imdb.com/es-es/title/tt0062622/">"Lo siento, Dave. Me temo que no puedo hacerlo"</q>.
</p>

<p>
    Según el sitio web de Mozilla,
    <q cite="https://www.mozilla.org/en-US/about/history/details/">"Firefox 1.0 se lanzó en 2004 y se convirtió en un gran éxito"</q>.
</p>

Importante: El elemento <q> está diseñado para citas breves que no requieren saltos de párrafo. Para citas extensas, utiliza el elemento <blockquote>.

Ejercicio propuesto: Citas en línea

Crea una página web utilizando el código del ejemplo anterior, y luego añade varios párrafos que contenga citas de tu elección y verifica el resultado en el navegador. Recuerda incluir el resto de etiquetas básicas de HTML para estructurar el documento y no olvides validar tu código.

Puedes usar por ejemplo citas de tu película favorita, tal como aparecen en «https://www.fotogramas.es/noticias-cine/g32183447/star-wars-mejores-frases-de-la-saga/«.

El elemento <blockquote>

El elemento HTML <blockquote> (o elemento de cita en bloque) indica que el texto que encierra constituye una cita extensa. Por lo general, los navegadores representan este elemento visualmente aplicando una sangría o indentación al texto.

Es posible especificar la URL de la fuente de la cita mediante el atributo cite, pero para indicar la referencia de la fuente en formato de texto visible se emplea el elemento completo <cite>. Por ejemplo:

Vuestro trabajo va a llenar gran parte de vuestra vida, y la única forma de estar realmente satisfecho es hacer lo que creéis que es un gran trabajo. Y la única forma de hacer un gran trabajo es amar lo que hacéis. Si aún no lo habéis encontrado, seguid buscando. No os conforméis. Como con todo lo que tiene que ver con el corazón, lo sabréis cuando lo encontréis. Steve Jobs
<blockquote cite="https://www.brainyquote.com/quotes/steve_jobs_416859">
    Vuestro trabajo va a llenar gran parte de vuestra vida, y la única forma de estar realmente satisfecho es hacer lo que creéis que es un gran trabajo. Y la única forma de hacer un gran trabajo es amar lo que hacéis. Si aún no lo habéis encontrado, seguid buscando. No os conforméis. Como con todo lo que tiene que ver con el corazón, lo sabréis cuando lo encontréis.
    <a href="https://www.brainyquote.com/quotes/steve_jobs_416859"><cite>Steve Jobs</cite></a>
</blockquote>

Ejercicio propuesto: Citas célebres

Crea una página web que recopile al menos veinte de las citas más famosas de la historia. Puedes encontrar muchas de ellas en sitios como «https://www.proverbia.net«, «https://www.mundifrases.com/«, o también puedes utilizar cualquier otra fuente que prefieras.

Debes utilizar el elemento <blockquote> para envolver la cita completa, y el elemento <cite> dentro de cada cita para indicar el nombre del autor, tal como se muestra en el ejemplo anterior y en los siguientes:
La mayor gloria de vivir no radica en no caer nunca, sino en levantarnos cada vez que caemos. Nelson Mandela

La manera de empezar es dejar de hablar y comenzar a actuar. Walt Disney

Vuestro tiempo es limitado, así que no lo malgastéis viviendo la vida de otro. No os dejéis atrapar por el dogma, que es vivir según los resultados del pensamiento de otros. No dejéis que el ruido de las opiniones de los demás ahogue vuestra propia voz interior. Y lo más importante, tened el coraje de seguir a vuestro corazón y vuestra intuición. Steve Jobs

Si la vida fuera predecible, dejaría de ser vida y no tendría sabor. Eleanor Roosevelt

Si miras lo que tienes en la vida, siempre tendrás más. Si miras lo que no tienes en la vida, nunca tendrás suficiente. Oprah Winfrey

Combinando los elementos <q>, <blockquote> y <cite>

El elemento de cita HTML (<cite>) se utiliza para referenciar el título de una obra creativa citada (como un libro, un artículo, un ensayo, una película, etc.). Según las convenciones de metadatos más apropiadas para el contexto, esta referencia puede presentarse de forma abreviada. Veamos un ejemplo práctico en el que resulta útil combinar estos tres elementos para crear una mejor estructura semántica:

Hola y bienvenidos a mi página de motivación. Como dice el sitio Citas de Confucio :

No importa lo lento que vayas mientras no te detengas.

También me encanta el concepto del pensamiento positivo y la necesidad de «mantener tus pensamientos positivos» (como se menciona en Citas Positivas ).


Y ahora echemos un vistazo al código fuente que debemos escribir para obtener ese resultado:

<p>
    Hola y bienvenidos a mi página de motivación. Como dice el sitio 
    <a href="https://proverbia.net/autor/frases-de-confucio">
        <cite>Citas de Confucio</cite>
    </a>:
</p>

<blockquote cite="https://www.proverbia.net/citasautor/confucio">
    No importa lo lento que vayas mientras no te detengas.
</blockquote>

<p>
    También me encanta el concepto del pensamiento positivo y la necesidad de 
    <q cite="https://www.mundifrases.com/tema/pensamiento-positivo/">
        mantener tus pensamientos positivos
    </q> 
    (como se menciona en 
    <a href="https://psicologiaymente.com/reflexiones/frases-positivas">
        <cite>Citas Positivas</cite>
    </a>).
</p>

Ejercicio propuesto: Ejemplo de citas completas

Crea una página web utilizando primero el código del ejemplo anterior y verifica el resultado en tu navegador. A continuación añade otro bloque similar combinando las tres etiquetas mencionadas, y vuelve a comprobar el resultado en el navegador.

No olvides incluir el resto de las etiquetas básicas de HTML (incluyendo títulos <h1> y <h2>) y valida tu código para asegurar que es correcto.

Representación de código informático

HTML pone a nuestra disposición una serie de elementos específicos para el marcado de código informático:

  • <code>: Se utiliza para marcar fragmentos genéricos de código informático.
  • <pre>: Se usa para preservar los espacios en blanco (generalmente empleado para bloques de código). Si utilizas sangría o espacios en blanco adicionales dentro del texto, los navegadores los ignorarán por defecto y no se verán reflejados en la página renderizada. No obstante, como ya explicamos en una unidad anterior, si envuelves el texto entre etiquetas <pre></pre>, los espacios en blanco se mostrarán idénticos a como aparecen en tu editor de texto.
  • <var>: Sirve para marcar específicamente nombres de variables.
  • <kbd>: Se utiliza para marcar la entrada de teclado (u otros tipos de entrada de datos) introducida en el ordenador.
  • <samp>: Se emplea para marcar la salida (output) de un programa informático.

El elemento <code>

El elemento HTML <code> muestra su contenido con un estilo visual diseñado para indicar que el texto es un fragmento breve de código informático. Por defecto, los navegadores muestran el texto de este elemento utilizando la fuente monoespaciada predeterminada del sistema.

Veamos un par de ejemplos:

El método push() añade uno o más elementos al final de un array y devuelve la nueva longitud del mismo.

La función selectAll() resalta todo el texto en el campo de entrada para que el usuario pueda, por ejemplo, copiar o eliminar el texto.


Y este sería el código HTML del ejemplo anterior:

<p>
    El método <code>push()</code> añade uno o más elementos al final de un array y devuelve la nueva longitud del mismo.
</p>

<p>
    La función <code>selectAll()</code> resalta todo el texto en el campo de entrada para que el usuario pueda, por ejemplo, copiar o eliminar el texto.
</p>

Ejercicio propuesto: Código en línea

Crea una página web con el código del ejemplo anterior, luego añade algunos ejemplos más, y verifica los resultados en tu navegador.

No olvides incluir el resto de las etiquetas básicas de HTML y validar tu código.

Los elementos <pre> + <code>

El elemento <code> por sí solo representa únicamente una instrucción o una única línea de código. Para representar múltiples líneas de código (un bloque), debemos envolver el elemento <code> dentro de un elemento <pre>. De esta forma, respetaremos los espacios y saltos de línea. Por ejemplo:

if (a > b) {
    console.log('¡Hola!'); // Ejemplo de código en el lenguaje JavaScript
}

Código HTML del ejemplo:

<pre><code>
if (a > b) {
    console.log('¡Hola!'); // Ejemplo de código en el lenguaje JavaScript
}
</code></pre>

Ejercicio propuesto: Bloque de código

Crea una página web con el código del ejemplo anterior, añade algunos bloque adicionales con cualquier fragmento de código de cualquier lenguaje y comprueba los resultados en tu navegador.

No olvides incluir el resto de las etiquetas básicas de HTML y validar tu código

El elemento <var>

El elemento de variable HTML (<var>) representa el nombre de una variable dentro de una expresión matemática o en un contexto de programación. Por lo general, se presenta visualmente utilizando una versión en cursiva de la tipografía actual, aunque este comportamiento depende de cada navegador.

Por ejemplo:

Una ecuación simple: x = y + 2

El volumen de una caja es l × w × h, donde l representa la longitud, w la anchura y h la altura de la caja.

Las variables minSpeed y maxSpeed controlan la velocidad mínima y máxima del aparato en revoluciones por minuto (RPM).


Código HTML del ejemplo:

<p>
    Una ecuación simple: <var>x</var> = <var>y</var> + 2
</p>

<p>
    El volumen de una caja es <var>l</var> × <var>w</var> × <var>h</var>, donde <var>l</var> 
    representa la longitud, <var>w</var> la anchura y <var>h</var> la 
    altura de la caja.
</p>

<p>
    Las variables <var>minSpeed</var> y <var>maxSpeed</var> controlan la velocidad mínima y máxima 
    del aparato en revoluciones por minuto (RPM).
</p>

Ejercicio propuesto: Ecuaciones y variables

Crea una página web con el código del ejemplo anterior, y añade un par de párrafos adicionales con cualquier ecuación que desees y comprueba los resultados en tu navegador.

No olvides incluir el resto de las etiquetas básicas de HTML y validar tu código

El elemento <kbd>

El elemento HTML de entrada de teclado (<kbd>) representa un fragmento de texto en línea que denota una entrada del usuario, ya sea a través de un teclado convencional, comandos de voz o cualquier otro dispositivo de entrada de texto.

Por convención, el navegador renderiza el contenido de un elemento <kbd> utilizando su fuente monoespaciada predeterminada para que destaque visualmente. Veamos algunos ejemplos:

Por favor, pulsa Ctrl + Mayús + R para recargar una página de MDN.

Usa el comando help micomando para ver la documentación del comando «micomando».

Puedes crear un nuevo documento utilizando el atajo de teclado Ctrl + N.


<p>
    Por favor, pulsa <kbd>Ctrl</kbd> + <kbd>Mayús</kbd> + <kbd>R</kbd> para recargar una página de MDN.
</p>

<p>
    Usa el comando <kbd>help micomando</kbd> para ver la documentación del comando "micomando".
</p>

<p>
    Puedes crear un nuevo documento utilizando el atajo de teclado <kbd>Ctrl</kbd> + <kbd>N</kbd>.
</p>

Ejercicio propuesto: Atajos de teclado

Crea una página web con el código del ejemplo anterior, añade un par de párrafos con cualquier atajo de teclado que conozcas y comprueba los resultados en tu navegador.

No olvides incluir el resto de las etiquetas básicas de HTML y validar tu código.

El elemento <samp>

El elemento de muestra HTML (<samp>) se utiliza para encerrar texto en línea que representa la salida (output) de muestra o el resultado devuelto por un programa informático. Su contenido se muestra habitualmente utilizando la fuente monoespaciada predeterminada del navegador (como Courier o Lucida Console) para diferenciarlo del texto normal.

Veamos un par de ejemplos:

Estaba intentando arrancar mi ordenador, pero me salió este mensaje tan irónico:

Teclado no encontrado
Pulse F1 para continuar

Cuando el proceso finalice, la utilidad mostrará el texto Escaneo completado. Se han encontrado N resultados. Entonces podrás proceder al siguiente paso.


Código HTML del ejemplo:

<p>Estaba intentando arrancar mi ordenador, pero me salió este mensaje tan irónico:</p>

<p>
    <samp>Teclado no encontrado <br>Pulse F1 para continuar</samp>
</p>

<p>...</p>

<p>
    Cuando el proceso finalice, la utilidad mostrará el texto <samp>Escaneo completado. Se han encontrado <em>N</em> resultados.</samp> Entonces podrás proceder al siguiente paso.
</p>

Ejercicio propuesto: Salida de muestra

Crea una página web con el código del ejemplo anterior, junto con un par de párrafos más, y comprueba los resultados en tu navegador.

No olvides incluir el resto de las etiquetas básicas de HTML y validar tu código para asegurar que es correcto

Un ejemplo completo

Veamos ahora un ejemplo completo que combina todos estos elementos (<code>, <pre>, <var>, <kbd>, <samp>) para ver cómo interactúan entre sí.

A continuación mostramos el resultado visual:

var para = document.querySelector('p');

para.onclick = function() {
  alert('¡Ay, deja de pincharme!');
}

No deberías utilizar elementos de presentación como <font> y <center>.

En el ejemplo de JavaScript anterior, para representa un elemento de párrafo.

Selecciona todo el texto con Ctrl/Cmd + A.

$ ping mozilla.org
PING mozilla.org (63.245.215.20): 56 data bytes
64 bytes from 63.245.215.20: icmp_seq=0 ttl=40 time=158.233 ms

Y aquí el código fuente correspondiente:

<pre><code>var para = document.querySelector('p');

para.onclick = function() {
  alert('¡Ay, deja de pincharme!');
}</code></pre>

<p>No deberías utilizar elementos de presentación como <code>&lt;font&gt;</code> y <code>&lt;center&gt;</code>.</p>

<p>En el ejemplo de JavaScript anterior, <var>para</var> representa un elemento de párrafo.</p>

<p>Selecciona todo el texto con <kbd>Ctrl</kbd>/<kbd>Cmd</kbd> + <kbd>A</kbd>.</p>

<pre>$ <kbd>ping mozilla.org</kbd>
<samp>PING mozilla.org (63.245.215.20): 56 data bytes
64 bytes from 63.245.215.20: icmp_seq=0 ttl=40 time=158.233 ms</samp></pre>

Ejercicio propuesto: Código, atajos y salida

Crea una página web con el código del ejemplo anterior, junto con algún bloque <pre>...</pre> adicional, y comprueba los resultados en tu navegador.

No olvides incluir el resto de las etiquetas básicas de HTML y validar tu código .

Ejercicio propuesto: Comandos de Linux

Crea una página web que muestre una tabla con algunos de los comandos de Linux más importantes y su descripción de uso, siguiendo aproximadamente el modelo de la tabla que se muestra a continuación.

Debes cumplir los siguientes requisitos semánticos:
1. Utiliza la etiqueta <code> para los comandos en la columna de la izquierda.
2. Utiliza la etiqueta <kbd> para los ejemplos de entrada del usuario (user’s input) dentro de las descripciones.
3. Recuerda que la tabla debe tener encabezados (<th>) y un título o leyenda (<caption>).
Comandos de Linux
Comandos Descripción
passwd Cambia tu contraseña de usuario:
1. Escribe tu antigua contraseña
2. Introduce la nueva contraseña
3. Confirma la nueva contraseña
~ Directorio personal del usuario (Home)
(atajo para: /home/usuario)
ls Lista las carpetas y archivos del directorio actual
mkdir Crea un nuevo directorio dentro del actual:
mkdir nuevodir
cd Cambia de directorio:
cd test (ir a un directorio llamado ‘test’)
cd .. (ir al directorio padre/superior)
cd ~ (ir al directorio personal)
rm Elimina el archivo o directorio especificado:
rm nombrearchivo (elimina un solo archivo)
rm *.txt (elimina TODOS los archivos .txt del directorio actual)
rm -r nombredir (elimina el directorio y sus archivos)

¡Por favor, ten cuidado al usar la opción -f!
rmdir Elimina el directorio VACÍO especificado
rmdir nombredir
pwd Imprime la ruta absoluta actual
man Muestra la página de manual del comando especificado:
man ls (muestra la ayuda de ls)
vi x.sh VI es un editor de texto. Si x.sh no existe, vi crea un nuevo archivo llamado x.sh y lo abre;
de lo contrario, simplemente abre el archivo existente.
less archivotexto less es un paginador de texto. Abre (solo lectura) el archivo archivotexto. Puedes usar las flechas arriba y abajo para desplazarte por el texto; comparte muchos comandos con VI.
chmod Cambia los permisos POSIX de un archivo o directorio. Permite proteger archivos contra accesos no deseados:
r : permiso de lectura
w : permiso de escritura
x : permiso de ejecución

chmod +x archivo.sh (permite la ejecución)
chmod -w archivo.sh (deniega la escritura)
chown Cambia el propietario de un archivo o directorio:
chown usuario archivo.sh
top Muestra los procesos en ejecución actualmente
cat Imprime el contenido de un archivo en pantalla
grep Filtra el archivo de texto especificado y muestra las líneas que contienen el patrón:
grep patron archivo.sh
También puedes usar tuberías (pipes) con la salida de otro comando:
cat archivo.sh | grep home
cat archivo.sh | grep "home page"

Marcado de datos de contacto

HTML proporciona un elemento específico para marcar semánticamente la información de contacto: <address>. Este elemento es muy versátil y puede utilizarse en diversos contextos; por ejemplo, para facilitar los datos de contacto de una empresa en el encabezado o pie de página de un sitio web, o para indicar quién es el autor de un artículo o una publicación concreta.

Su funcionamiento es sencillo: basta con envolver los detalles de contacto dentro de esta etiqueta. Veamos un ejemplo básico:

<address>
    <p>Fernando Ruiz, IES San Vicente, España</p>
</address>

No obstante, el contenido del elemento <address> puede albergar un marcado mucho más complejo. De hecho, la información suministrada puede adoptar la forma que mejor se ajuste al contexto, incluyendo cualquier dato necesario: dirección física, URL, correo electrónico, número de teléfono, redes sociales, coordenadas geográficas, etc. .

Regla importante: Debes tener en cuenta que siempre hay que incluir, como mínimo, el nombre de la persona, grupo u organización a la que hacen referencia dichos datos de contacto.

Veamos un ejemplo más completo y estructurado:

<address>
    <p>
        Juan Pérez<br>
        Calle Mayor, 10<br>
        Madrid, 28013<br>
        España
    </p>

    <ul>
        <li>Tel: 91 123 45 67</li>
        <li>Email: [email protected]</li>
    </ul>
</address>

También es correcto utilizar este elemento para referenciar información de contacto que se encuentra en otra página o enlace, como en el siguiente caso:

<address>
    Puedes contactar con el autor en <a href="http://www.midominio.com/contacto">www.midominio.com</a>.<br>

    Si encuentras algún error, por favor <a href="mailto:[email protected]">contacta con el webmaster</a>.<br>

    También puedes visitarnos en:<br>
    Fundación Mozilla<br>
    331 E Evelyn Ave<br>
    Mountain View, CA 94041<br>
    EE. UU.
</address>

Ejercicio propuesto: Información de contacto

Crea una página web utilizando el código de los ejemplos anteriores y verifica el resultado en tu navegador.

No olvides incluir el resto de las etiquetas básicas de HTML y validar tu código para asegurar que la estructura es correcta .

El elemento <figure>

El elemento HTML <figure> (Figura con leyenda opcional) representa contenido independiente (self-contained content), el cual puede ir acompañado de un título o leyenda opcional especificado mediante el elemento <figcaption>.

La figura, su leyenda y su contenido se referencian semánticamente como una única unidad.

Figuras con imágenes

Este es el uso más común: asociar imágenes con sus pies de foto. Por ejemplo:

Paisaje nórdico.
Paisaje nórdico

Perro pidiendo algo de comida
Perro pidiendo comida

Código HTML del ejemplo:

<figure>
    <img src="https://picsum.photos/id/235/300/200"
         alt="Paisaje nórdico.">
    <figcaption>Paisaje nórdico</figcaption>
</figure>

<hr>

<figure>
    <img src="https://picsum.photos/id/237/300/200"
         alt="Perro pidiendo algo de comida">
    <figcaption>Perro pidiendo comida</figcaption>
</figure>

Ejercicio propuesto: Imágenes con leyendas

Crea una página web utilizando el código del ejemplo anterior, añade un par de figuras (<figure>) nuevas con imágenes y elige una leyenda adecuada (<figcaption>) para cada una. Finalmente, comprueba los resultados en tu navegador. No olvides incluir el resto de las etiquetas básicas de HTML y validar tu código.

Puedes utilizar cualquier imagen que te guste; por ejemplo, las del servicio «https://picsum.photos/images«, tal como hicimos en ejercicios de la unidad anterior.

Figuras con poemas

El elemento <figure> no sirve solo para imágenes; también es excelente para enmarcar poemas o fragmentos literarios, como por ejemplo:

Caminante, son tus huellas
el camino y nada más;
Caminante, no hay camino,
se hace camino al andar.
Al andar se hace el camino,
y al volver la vista atrás
se ve la senda que nunca
se ha de volver a pisar.

Proverbios y cantares, de Antonio Machado

Código HTML del ejemplo:

<figure>
    <p>
        Caminante, son tus huellas<br>
        el camino y nada más;<br>
        Caminante, no hay camino,<br>
        se hace camino al andar.<br>
        Al andar se hace el camino,<br>
        y al volver la vista atrás<br>
        se ve la senda que nunca<br>
        se ha de volver a pisar.
    </p>
    <figcaption>
        <cite>Proverbios y cantares</cite>, de Antonio Machado
    </figcaption>
</figure>

Ejercicio propuesto: Poemas

Crea una página web con el código del ejemplo anterior (el de Machado), añade una nueva figura con otro poema que te guste (quizás de Lorca, Bécquer o Neruda) y comprueba los resultados en tu navegador.

No olvides incluir el resto de las etiquetas básicas de HTML y validar tu código .

Figuras con código

El elemento <figure> es ideal para mostrar fragmentos de código que tienen un título descriptivo o que funcionan como ejemplos independientes.

Veamos un ejemplo práctico:

Obtener detalles del navegador usando navigator:
function EjemploNavigator() {
  var txt;
  txt = "Nombre en clave: " + navigator.appCodeName + "; ";
  txt+= "Nombre del navegador: " + navigator.appName + "; ";
  txt+= "Versión del navegador: " + navigator.appVersion + "; ";
  txt+= "Cookies habilitadas: " + navigator.cookieEnabled + "; ";
  txt+= "Plataforma: " + navigator.platform + "; ";
  txt+= "Cabecera User-agent: " + navigator.userAgent + "; ";
  
  console.log("EjemploNavigator", txt);
}

Código HTML del ejemplo:

<figure>
    <figcaption>Obtener detalles del navegador usando <code>navigator</code>:</figcaption>
    
    <pre><code>
      function EjemploNavigator() {
        var txt;
        txt = "Nombre en clave: " + navigator.appCodeName + "; ";
        txt+= "Nombre del navegador: " + navigator.appName + "; ";
        txt+= "Versión del navegador: " + navigator.appVersion + "; ";
        txt+= "Cookies habilitadas: " + navigator.cookieEnabled + "; ";
        txt+= "Plataforma: " + navigator.platform + "; ";
        txt+= "Cabecera User-agent: " + navigator.userAgent + "; ";
  
        console.log("EjemploNavigator", txt);
      }
    </code></pre>

</figure>

Ejercicio propuesto: Bloque de código en figura

Crea una página web con el código del ejemplo anterior, junto con otro más, y comprueba los resultados en tu navegador.

No olvides incluir el resto de las etiquetas básicas de HTML y validar tu código .

Figuras con citas

Como vimos anteriormente, podemos usar <blockquote> por sí solo, pero si envolvemos la cita dentro de un elemento <figure>, podemos usar <figcaption> para indicar el autor o la fuente con mayor implicación semánticamente. Por ejemplo:

Edsger Dijkstra:

Si depurar es el proceso de eliminar errores de software, entonces programar debe ser el proceso de introducirlos.

Código HTML del ejemplo:

<figure>
    <figcaption><cite>Edsger Dijkstra:</cite></figcaption>
    <blockquote>
        Si depurar es el proceso de eliminar errores de software, 
        entonces programar debe ser el proceso de introducirlos.
    </blockquote>
</figure>

Ejercicio propuesto: Citas famosas (versión con figuras)

Crea una página web con el código del ejemplo anterior y añade algunas citas famosas más utilizando este mismo formato (<figure> + <figcaption> + <blockquote>) para mostrar al menos diez citas.

Finalmente, comprueba los resultados en tu navegador. No olvides incluir el resto de las etiquetas básicas de HTML y validar tu código.

Puedes reutilizar las citas que empleaste en ejercicios anteriores o buscar nuevas en los sitios que recomendamos previamente «https://proverbia.net/«, «https://www.mundifrases.com/«, o alguna en inglés como «https://www.brainyquote.com/«, o cualquier otra página web que conozcas.

Test

Comprueba tus conocimientos con este test sobre tablas y otros conceptos relacionados con esta unidad.

Instant buttons con HTML+CSS+Javascript

En esta unidad crearemos una aplicación con una galería interactiva de botones de audio, diseñada para reproducir sonidos de Halloween y Navidad. La interfaz está organizada en dos tablas temáticas: una para Halloween y otra para Navidad, cada una con imágenes representativas que, al hacer clic, activan la reproducción de un sonido específico.

Imágenes y sonidos

A continuación se muestran posibles imágenes y audios que puedes usar. Además, puedes hacer clic en estos enlaces para descargarte un zip con todas las imágenes y todos los sonidos.

Halloween

Navidad

Fichero «index.html»

El archivo index.html define la estructura básica de la aplicación, que es una galería de botones de audio con imágenes interactivas. A continuación explicamos cada parte del archivo.

Cabecera (<head>)

El código que se encuentra en esta primera sección del archivo se encarga de lo siguiente:

  • Define el título de la página («Instant buttons»).
  • Incluye enlaces a fuentes personalizadas de Google Fonts:
    • Creepster: utilizada para el tema de Halloween.
    • Mountains of Christmas: utilizada para el tema de Navidad.
  • Vincula la hoja de estilos style.css, donde están los estilos para el fondo, las fuentes, y los efectos visuales de las imágenes.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Instant buttons</title>

    <!-- Fuentes personalizadas desde Google Fonts -->
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Creepster&family=Mountains+of+Christmas:wght@400;700&display=swap" rel="stylesheet">

    <!-- Archivo de estilos CSS -->
    <link rel="stylesheet" href="style.css">
</head>
<body>
    ...
</body>
</html>

Cuerpo de la página (<body>)

Dentro del cuerpo, se encuentran dos tablas temáticas: una de Halloween y otra de Navidad.

Tabla de Halloween

  • Utiliza la clase halloween para aplicar estilos específicos desde style.css, como el color rojo y la fuente Creepster.
  • Cada celda (<td>) contiene una imagen y tiene un evento onclick que ejecuta la función play con dos parámetros: el nombre del archivo de sonido y el volumen de reproducción.
  • Los archivos de imagen se encuentran en una carpeta llamada img y están nombrados de forma consecutiva para cada botón (por ejemplo, halloween1.webp, halloween2.webp, etc.).
<table class="halloween">
    <caption>Halloween</caption>
    <!-- Fila 1 de botones de Halloween -->
    <tr>
        <td onclick="play('halloween1', 0.5)"><img src="img/halloween1.webp"></td>
        <td onclick="play('halloween2', 0.7)"><img src="img/halloween2.webp"></td>
        <td onclick="play('halloween3', 0.7)"><img src="img/halloween3.webp"></td>
    </tr>
    <!-- Fila 2 de botones de Halloween -->
    <tr>
        <td onclick="play('halloween4', 0.7)"><img src="img/halloween4.webp"></td>
        <td onclick="play('halloween5', 0.7)"><img src="img/halloween5.webp"></td>
        <td onclick="play('halloween6', 0.7)"><img src="img/halloween6.webp"></td>
    </tr>
    <!-- Fila 3 de botones de Halloween -->
    <tr>
        <td onclick="play('halloween7', 0.7)"><img src="img/halloween7.webp"></td>
        <td onclick="play('halloween8', 1.0)"><img src="img/halloween8.webp"></td>
        <td onclick="play('halloween9', 1.0)"><img src="img/halloween9.webp"></td>
    </tr>
</table>

Tabla de Navidad

  • Sigue la misma estructura que la tabla de Halloween, pero está estilizada con la clase christmas, que aplica un color azul y la fuente Mountains of Christmas.
  • Las imágenes de Navidad también están organizadas en una cuadrícula de tres filas y tres columnas, cada una con un archivo de audio distinto.
<table class="christmas">
    <caption>Christmas</caption>
    <tr>
        <td onclick="play('christmas1', 0.7)"><img src="img/christmas1.webp"></td>
        <td onclick="play('christmas2', 1.0)"><img src="img/christmas2.webp"></td>
        <td onclick="play('christmas3', 0.7)"><img src="img/christmas3.webp"></td>
    </tr>
    <tr>
        <td onclick="play('christmas4', 0.7)"><img src="img/christmas4.webp"></td>
        <td onclick="play('christmas5', 0.7)"><img src="img/christmas5.webp"></td>
        <td onclick="play('christmas6', 1.0)"><img src="img/christmas6.webp"></td>
    </tr>
    <tr>
        <td onclick="play('christmas7', 0.7)"><img src="img/christmas7.webp"></td>
        <td onclick="play('christmas8', 1.0)"><img src="img/christmas8.webp"></td>
        <td onclick="play('christmas9', 1.0)"><img src="img/christmas9.webp"></td>
    </tr>
</table>

Elemento de audio y JavaScript

Antes de cerrar el elemento <body> de nuestra página web, deberemos incluir un elemento <audio> que utilizaremos para reproducir los sonidos, y también deberemos enlazar el fichero con el código JavaScript:

...
<body>
    ...
    <audio id="player"></audio>
    <script src="script.js"></script>
</body>
</html>
  • Elemento <audio>: Este elemento, con el id="player", se usa para reproducir los archivos de sonido. Al hacer clic en cada imagen, la función JavaScript play modifica su fuente (src) y volumen, y luego reproduce el audio seleccionado.
  • JavaScript: Al final del archivo se carga el script script.js, que contiene la función play para controlar la reproducción de audio cuando se hace clic en una imagen.

En resumen…

El archivo index.html estructura la página, definiendo tablas temáticas interactivas para reproducir sonidos festivos de Halloween y Navidad mediante el uso de JavaScript y estilos en CSS para mejorar la experiencia visual y sonora.

El archivo script.js es un código JavaScript sencillo que controla la reproducción de sonidos al hacer clic en las imágenes de la galería. A continuación, explicamos la función principal de este archivo.

Fichero «script.js»

Nuestra aplicación de instant buttons utiliza sólo una sencilla función javascript para reproducir los audios con ajuste de volumen incluido. A continuación se muestra todo el código necesario agrupado en la función play:

function play(soundName, soundVolume) {
    // Obtener el elemento de audio
    const player = document.getElementById("player");

    // Cambiar el archivo de audio a reproducir
    player.src = `audio/${soundName}.mp3`;

    // Cambiar el volumen del audio
    player.volume = soundVolume;

    // Reproducir el audio
    player.play();
}

Explicación detallada de la función play

Esta función play recibe dos parámetros, soundName y soundVolume, y se ejecuta cada vez que se hace clic en una de las imágenes en el archivo index.html. La función realiza los siguientes pasos:

  1. Obtener el elemento de audio:
   const player = document.getElementById("player");

Utiliza document.getElementById("player") para obtener el elemento de audio <audio id="player"> en el archivo HTML. Este elemento de audio es el que realmente reproduce los sonidos.

  1. Cambiar el archivo de audio:
   player.src = `audio/${soundName}.mp3`;

Modifica la propiedad src del elemento player para cambiar el archivo de audio que se va a reproducir. La función construye la ruta del archivo de audio usando el nombre del archivo pasado como parámetro soundName (por ejemplo, halloween1, christmas2, etc.). Así, si soundName es halloween1, la función buscará y cargará el archivo audio/halloween1.mp3.

  1. Ajustar el volumen:
   player.volume = soundVolume;

Cambia el volumen de reproducción del audio estableciendo la propiedad volume del elemento player. Este valor se toma del parámetro soundVolume, que es un número entre 0 (silencio) y 1 (volumen máximo). Por ejemplo, algunos sonidos tienen un volumen de 0.7 y otros de 1.0 en función de la experiencia que se quiera dar al usuario.

  1. Reproducir el sonido:
   player.play();

Finalmente, llama al método play() del elemento player para iniciar la reproducción del archivo de audio con el archivo y volumen especificados.

En resumen…

La función play es un controlador de reproducción de sonido que:

  • Cambia el archivo de audio a reproducir.
  • Ajusta el volumen de la reproducción.
  • Inicia la reproducción del archivo de audio.

Esta función permite que, al hacer clic en las imágenes de la galería, cada imagen reproduzca un sonido específico asociado a la festividad (Halloween o Navidad) con el volumen predefinido en la función onclick del HTML.

Fichero «style.css»

El archivo style.css contiene los estilos visuales de la aplicación, desde el fondo animado hasta los efectos visuales para cada imagen y tabla temática. A continuación, explicamos cada sección del código CSS.

Fondo animado con gradiente

body {
    background: linear-gradient(90deg, #1a1a1a, #003c5a, #0086c9, #9001d7);
    background-size: 200% 100%;
    animation: aurora 2.5s infinite alternate;
}
  • Gradiente de colores: El fondo de la página es un gradiente lineal que pasa por varios tonos oscuros y fríos (negro, azul oscuro, azul brillante y morado). Esto crea un ambiente visual similar a una aurora boreal.
  • Tamaño del fondo: background-size: 200% 100%; hace que el gradiente se duplique en ancho, lo que permite que el fondo se mueva de lado a lado.
  • Animación: animation: aurora 2.5s infinite alternate; activa una animación de ida y vuelta cada 2.5 segundos, creando el efecto de movimiento en el fondo.
@keyframes aurora {
    0% { background-position: 0% 50%; }
    100% { background-position: 100% 50%; }
}
  • Animación aurora: Define una transición que mueve el gradiente de izquierda a derecha en el 100% del ancho, y luego vuelve al inicio, lo que da el efecto de aurora en movimiento.

Estilos para las imágenes de los botones

img {
    width: 100%;
    max-width: 250px;
    transition: 0.5s ease;
}

img:active {
    transform: scale(1.5);
    filter: brightness(0.75) contrast(1.25);
    box-shadow: 0 0 20px black;
}
  • Ancho de las imágenes: width: 100% asegura que las imágenes ocupen todo el ancho de la celda. max-width: 250px limita el tamaño máximo de las imágenes en pantallas grandes.
  • Transición suave: transition: 0.5s ease aplica una transición suave al hacer clic en las imágenes.
  • Efecto al hacer clic (:active): Cuando una imagen es presionada, se agranda un 50% (transform: scale(1.5)), se oscurece ligeramente (brightness(0.75)) y aumenta el contraste (contrast(1.25)), además de aplicar una sombra negra para resaltar el efecto de interacción.

Estilos para las tablas de Halloween y Navidad

Cada tabla tiene estilos específicos que incluyen una fuente, color y sombra para dar un ambiente acorde a la festividad.

Tabla de Halloween

.halloween {
    font-size: 250%;
    color: red;
    font-family: 'Creepster', cursive;
    text-shadow: 3px 3px 4px black, -3px -3px 4px #550000;
}
  • Fuente: La tabla de Halloween usa la fuente Creepster, que tiene un estilo tenebroso.
  • Color: El color del texto es rojo (color: red;).
  • Sombra de texto: Aplica una sombra oscura y difusa (text-shadow: 3px 3px 4px black, -3px -3px 4px #550000;), dando un efecto de terror al texto.

Tabla de Navidad

.christmas {
    font-size: 250%;
    font-weight: bold;
    color: blue;
    font-family: 'Mountains of Christmas', cursive;
    text-shadow: 2px 2px 5px #00aaff, -2px -2px 5px #ffffff;
}
  • Fuente: Utiliza Mountains of Christmas, que tiene un estilo festivo.
  • Color: El color del texto es azul (color: blue;).
  • Sombra de texto: Usa sombras suaves en azul claro y blanco (text-shadow: 2px 2px 5px #00aaff, -2px -2px 5px #ffffff;) para dar un efecto festivo de brillo.

Estilos generales para las tablas

table {
    margin: auto;
}
  • Centrado de las tablas: La propiedad margin: auto; centra las tablas horizontalmente en la página.

En resumen…

Este archivo CSS define la estética de la aplicación:

  • Un fondo animado tipo aurora boreal.
  • Efectos interactivos para las imágenes de los botones.
  • Estilos específicos para cada tabla (Halloween y Navidad) con colores y fuentes temáticas.

Estos estilos ayudan a crear una experiencia visual inmersiva y coherente con cada festividad.

Ejercicios propuestos

Cambiar la orientación de la animación de fondo

Prueba a cambiar la orientación de fondo para que el efecto de aurora boreal se produzca con un movimiento de arriba hacia abajo y viceversa. Para ello basta con que modifiques el ángulo del gradiente a 180 grados, el tamaño del fondo al doble de alto, y el porcentaje de la animación en el eje Y de 0% a 100%:

/* Fondo con gradiente animado vertical tipo aurora */
body {
    /* Cambiamos el ángulo del gradiente a 180 grados para que vaya de arriba hacia abajo */
    background: linear-gradient(180deg, #1a1a1a, #003c5a, #0086c9, #9001d7);
    /* Ajustamos el tamaño del fondo para que solo se duplique en altura */
    background-size: 100% 200%;
    /* Mantiene la misma animación */
    animation: aurora 2.5s infinite alternate;
}

/* Animación de gradiente tipo aurora en vertical */
@keyframes aurora {
    /* Fijamos la posición horizontal en 50% y animamos solo la posición vertical */
    0% { background-position: 50% 0%; }
    100% { background-position: 50% 100%; }
}

Animación de fondo radial

Prueba a cambiar la orientación de fondo para que el efecto de aurora boreal sea de tipo radial con movimiento diagonal. Para ello basta con que definas el gradiente con radial-gradient(circle, ...), y luego dupliques el tamaño del fondo al doble de ancho y de alto, y en último lugar cambies los porcentajes de la animación en ambos ejes de 0% a 100%:

/* Fondo con gradiente animado tipo aurora */
body {
    /* Cambiamos a un gradiente radial para un efecto más llamativo */
    background: radial-gradient(circle, #1a1a1a, #003c5a, #0086c9, #9001d7);
    /* Ajustamos el tamaño del gradiente para que cubra más área */
    background-size: 200% 200%;
    /* Mantiene la misma animación */
    animation: aurora 2.5s infinite alternate;
}

/* Animación de gradiente tipo aurora */
@keyframes aurora {
    /* Modificamos la posición inicial y final para adaptarla al gradiente radial */
    0% { background-position: 0% 0%; }
    100% { background-position: 100% 100%; }
}

Diferentes colores de fondo

Prueba a cambiar los colores de la animación de fondo. Para ello solo debes cambiar los colores de la propiedad background dentro del selector body. Por ejemplo:

/* Fondo con gradiente animado tipo aurora de Halloween */
body {
    /* Usamos colores típicos de Halloween en el gradiente radial */
    background: radial-gradient(circle, black, purple, orange, darkred);
    ...
}
...

Utiliza tus propias imágenes y graba tus propios audios

Prueba a usar otras imágenes y otros audios. Puedes encontrar imágenes y audios gratuitos en los siguientes enlaces:

También puedes grabar tus audios e incluirlos directamente en la aplicación. Puedes utilizar tu propio móvil o alguna página web online similar a la siguiente:

Compilar la aplicación para móvil

Prueba a compilar la aplicación para móvil, y así podrás pulsar sobre las imágenes como si fueran botones. Puedes seguir las instrucciones detalladas aquí.

Ten en cuenta que el tamaño máximo para la aplicación en formato móvil es de 10MB, por lo que no podrás utilizar imágenes y audios demasiado grandes. Recomendamos el formato webp para imágenes y mp3 para audio. Puedes cambiar el formato o bajar la calidad de los ficheros con alguna herramienta online. Por ejemplo:

Imágenes:

Audios:

Añadir efecto de vibración al pulsar sobre cada imagen

Puedes añadir efecto de vibración muy fácilmente añadiendo la siguiente línea dentro de la función play del fichero script.js:

function play(soundName, soundVolume) {
    ...
    // Si la vibración está disponible (en el móvil por ejemplo), vibrar durante 100 ms
    if (navigator.vibrate) navigator.vibrate(100);
}

El resultado

En este enlace puedes probar esta versión de la aplicación instant buttons.

Cookie Clicker con HTML+CSS+Javascript (parte 10): Comprando fábricas

En esta parte del proyecto, vamos a añadir al juego la posibilidad de comprar Fábricas que produzcan más galletas para nosotros cada segundo sin tener que hacer clic.

Imagen para activar la mejora

Al pulsar sobre esta imagen activarás la mejora de las fábricas. Puedes elegir cualquier imagen para tu juego, teniendo en cuenta simplemente que deberás colocarla dentro de la carpeta img. A continuación te proporcionamos una imagen de ejemplo:

Modificaciones del fichero «index.html»

Vamos a añadir un div adicional a nuestro código html para poder activar la mejora. De esta forma, el jugador podrá comprar fábricas pulsando sobre la imagen. Por cada fábrica que adquiera el jugador, se generarán más galletas automáticamente cada segundo:

...
<body>
    ...
    <div class="caja-mejora" onclick="comprarMejora('fabricas')">
        <img src="img/fabrica.png" width="125">
        <div id="textoFabricas"></div>
    </div>
    ...
</body>
</html>

Modificaciones del fichero «variables.js»

Añadimos la mejora de fabricas al objeto juego, con un precio inicial de 500 galletas. Cada fábrica comprada generará 20 galletas por segundo:

// Objeto que almacena toda la información relativa al progreso y configuración del juego
let juego = {
    galletas: 0, // Cantidad total de galletas conseguidas
    mejoras: {
        ...
        fabricas: { cantidad: 0, precio: 500, descripcion: "Fábricas que producen 20 galletas por segundo" } // Mejora de Fábricas
    }
}

Modificaciones del fichero «script.js»

Para conseguir que las fábricas produzcan galletas sin que tengamos que hacer clic, deberemos incrementar la cantidad de galletas de forma automática cada segundo. Para ello ya disponemos de la función «producirAutomaticamente()», que creamos en una unidad anterior, dentro del fichero «script.js». Añadiendo una sola línea a esta función podremos conseguir que por cada fábrica que hayamos comprado, consigamos 20 galletas más de forma automática cada segundo:

...

// Función para producir galletas automáticamente
// Se ejecuta cada segundo y suma galletas según las mejoras compradas
function producirAutomaticamente() {
    ...
    juego.galletas += juego.mejoras.fabricas.cantidad * 20;  // Suma las galletas por Fábricas
    guardarProgreso();  // Guarda el progreso automáticamente
}

Cookie Clicker con HTML+CSS+Javascript (parte 9): Comprando granjas

En esta parte del proyecto vamos a añadir al juego la posibilidad de comprar Granjas. De esta forma podremos conseguir más galletas cada segundo sin tener que hacer clic.

Imagen para activar la mejora

Al pulsar sobre esta imagen activarás la mejora de las granjas. Puedes elegir cualquier imagen para tu juego, teniendo en cuenta simplemente que deberás colocarla dentro de la carpeta img. A continuación te proporcionamos una imagen de ejemplo:

Modificaciones del fichero «index.html»

Vamos a añadir un div adicional a nuestro código html para poder activar la mejora. De esta forma, el jugador podrá comprar granjas pulsando sobre la imagen. Por cada granja que adquiera el jugador, se generarán más galletas automáticamente:

...
<body>
    ...
    <div class="caja-mejora" onclick="comprarMejora('granjas')">
        <img src="img/granja.png" width="125">
        <div id="textoGranjas"></div>
    </div>
    ...
</body>
</html>

Modificaciones del fichero «variables.js»

Añadimos la mejora de granjas al objeto juego, con un precio inicial de 400 galletas por cada granja que compremos. Cada una de ellas generará 10 galletas por segundo:

// Objeto que almacena toda la información relativa al progreso y configuración del juego
let juego = {
    galletas: 0, // Cantidad total de galletas conseguidas
    mejoras: {
        ...
        granjas: { cantidad: 0, precio: 400, descripcion: "Granjas que producen 10 galletas por segundo" }, // Mejora de Granjas
    }
}

Modificaciones del fichero «script.js»

Para conseguir que las granjas produzcan galletas sin que tengamos que hacer clic, deberemos incrementar la cantidad de galletas de forma automática cada segundo. Para ello ya disponemos de la función «producirAutomaticamente()», que creamos en una unidad anterior, dentro del fichero «script.js». Añadiendo una sola línea a esta función podremos conseguir que por cada granja que hayamos comprado, consigamos 10 galletas más de forma automática cada segundo:

...

// Función para producir galletas automáticamente
// Se ejecuta cada segundo y suma galletas según las mejoras compradas
function producirAutomaticamente() {
    ...
    juego.galletas += juego.mejoras.granjas.cantidad * 10;  // Suma las galletas por Granjas
    guardarProgreso();  // Guarda el progreso automáticamente
}

Cookie Clicker con HTML+CSS+Javascript (parte 8): Comprando abuelas

En esta parte del proyecto, vamos a añadir al juego la posibilidad de comprar Abuelas que cocinen varias galletas para nosotros cada segundo. De esta forma podremos conseguir incrementar nuestra cantidad de galletas sin tener que hacer clic.

Imagen para activar la mejora

Al pulsar sobre esta imagen activarás la mejora de las abuelas. Puedes elegir cualquier imagen para tu juego, teniendo en cuenta simplemente que deberás colocarla dentro de la carpeta img. A continuación te proporcionamos una imagen de ejemplo:

Modificaciones del fichero «index.html»

Vamos a añadir un div adicional a nuestro código html para poder activar la mejora. De esta forma, el jugador podrá comprar abuelas pulsando sobre la imagen. Por cada abuela que adquiera el jugador, se generarán más galletas automáticamente por segundo:

...
<body>
    ...
    <div class="caja-mejora" onclick="comprarMejora('abuelas')">
        <img src="img/abuela.png" width="150">
        <div id="textoAbuelas"></div>
    </div>
    ...
</body>
</html>

Modificaciones del fichero «variables.js»

Añadimos la mejora de abuelas al objeto juego, con un precio inicial de 300 galletas. Cada abuela comprada generará 5 galletas por segundo:

// Objeto que almacena toda la información relativa al progreso y configuración del juego
let juego = {
    galletas: 0, // Cantidad total de galletas conseguidas
    mejoras: {
        ...
        abuelas: { cantidad: 0, precio: 300, descripcion: "Abuelas que cocinan 5 galletas por segundo" }, // Mejora de Abuelas
    }
}

Modificaciones del fichero «script.js»

Para conseguir que las abuelas cocinen y produzcan galletas sin que tengamos que hacer clic, deberemos incrementar la cantidad de galletas de forma automática cada segundo. Para ello ya disponemos de la función «producirAutomaticamente()», que creamos en la unidad anterior, dentro del fichero «script.js». Añadiendo una sola línea a esta función podremos conseguir que por cada abuela que hayamos comprado, consigamos 5 galletas más de forma automática cada segundo:

...

// Función para producir galletas automáticamente
// Se ejecuta cada segundo y suma galletas según las mejoras compradas
function producirAutomaticamente() {
    ...
    juego.galletas += juego.mejoras.abuelas.cantidad * 5;  // Suma las galletas por Abuelas
    guardarProgreso();  // Guarda el progreso automáticamente
}

Cookie Clicker con HTML+CSS+Javascript (parte 7): Auto clickers

En esta parte del proyecto, vamos a añadir una mejora conocida como Auto Clicker, que permite al jugador ganar galletas automáticamente cada segundo sin tener que hacer click.

Imagen para activar la mejora

Al pulsar sobre esta imagen activarás la mejora de clicks automáticos. Puedes elegir cualquier imagen para tu juego, teniendo en cuenta simplemente que deberás colocarla dentro de la carpeta img. A continuación te proporcionamos una imagen de ejemplo:

Modificaciones del fichero «index.html»

Vamos a añadir un div adicional a nuestro código html para poder activar la mejora. De esta forma, el jugador podrá comprar Auto Clickers pulsando sobre la imagen. Por cada Auto Clicker que adquiera el jugador, se generará una galleta automáticamente por segundo:

...
<body>
    ...
    <div class="caja-mejora" onclick="comprarMejora('autoClickers')">
        <img src="img/mano.png" width="100">
        <div id="textoAutoClickers"></div>
    </div> 
    ...
</body>
</html>

Modificaciones del fichero «variables.js»

Añadimos la mejora de Auto Clickers al objeto juego, con un precio inicial de 200 galletas. Cada Auto Clicker comprado generará una galleta por segundo:

// Objeto que almacena toda la información relativa al progreso y configuración del juego
let juego = {
    galletas: 0, // Cantidad total de galletas conseguidas
    mejoras: {
        ...
        autoClickers: { cantidad: 0, precio: 200, descripcion: "Auto click cada segundo" }, // Mejora de AutoClicker
    }
}

// Variable global para controlar el intervalo de la producción automática
let intervalo = null;

Modificaciones del fichero «script.js»

Deberemos crear una nueva función de JavaScript dentro del fichero «script.js», y la ejecutaremos automáticamente cada segundo:

  • Función reiniciarJuego(): Esta función se encargaba de reiniciar el progreso del juego. Ahora además deberá encargarse de cancelar el intervalo de producción de galletas automáticamente. Para ello deberemos añadir la siguiente línea:
    • clearInterval(intervalo); // Detiene la producción automática de galletas
  • Función producirAutomaticamente(): Esta función se ejecuta cada segundo y añade galletas según la cantidad de Auto Clickers comprados.
  • Inicialización: En la función inicializar(), deberemos configurar un intervalo que ejecute producirAutomaticamente() cada segundo. Para ello utilizaremos la función nativa de JavaScript setInterval.
...

// Función para reiniciar el juego: ¡Sólo debemos añadir la línea con la llamada a 'clearInterval()'!
function reiniciarJuego() {
    // Pregunta al usuario si realmente quiere reiniciar, y si dice que sí, borra el progreso y reinicia la página
    if (confirm("...")) {
        clearInterval(intervalo);  // Detiene la producción automática de galletas
        localStorage.removeItem('juego');  // Elimina el progreso guardado
        location.reload();  // Recarga la página
    }
}

...

// Función para producir galletas automáticamente
// Se ejecuta cada segundo y suma galletas según las mejoras compradas
function producirAutomaticamente() {
    juego.galletas += juego.mejoras.autoClickers.cantidad;  // Suma las galletas por AutoClicker
    guardarProgreso();  // Guarda el progreso automáticamente
}

// Función para inicializar el juego
function inicializar() {
    cargarProgreso();  // Carga el progreso guardado al iniciar el juego
    intervalo = setInterval(producirAutomaticamente, 1000);  // Cada segundo, produce galletas automáticamente
}

inicializar();

Cookie Clicker con HTML+CSS+Javascript (parte 6): Compilando la aplicación para móvil

En esta unidad aprenderemos cómo podemos obtener la aplicación en formato «apk» para instalarla en nuestros propios dispositivos móviles.

Utilizaremos la plataforma VoltBuilder, que facilita la creación de aplicaciones nativas para Android e iOS a partir de proyectos web hechos con HTML, CSS y JavaScript. Sólo tendremos que subir un archivo zip con nuestro proyecto, y la herramienta se encargará de convertirlo en una app nativa. Además, como está disponible en la nube, no tendremos que instalar ningún tipo de software en nuestros equipos.

A continuación se enumeran los pasos que deberemos seguir para compilar nuestra aplicación y obtener el fichero de instalación «.apk».

Icono de la aplicación

Podemos utilizar el mismo icono tanto para mostrarlo en la pestaña del navegador, como para compilar e instalar nuestra aplicación en dispositivos móviles. En nuestro caso, utilizaremos la misma imagen, pero podría ser otra diferente:

Pantalla de bienvenida

La imagen que utilicemos para la pantalla de bienvenida deberá tener cierto margen alrededor, ya que se mostrará en el centro de la pantalla, y la plataforma VoltBuilder la recortará para asegurar que se muestra de manera correcta en cualquier dispositivo y orientación.

Crear fichero de configuración «config.xml»

Primero deberemos crear el archivo «config.xml» en el directorio raiz de la aplicación. A continuación se muestra un ejemplo básico (puedes cambiar el nombre, la descripción, el icono y la pantalla de bienvenida a tu gusto):

<?xml version='1.0' encoding='utf-8'?>
<widget id="com.fernandoruizrico.clicker" xmlns="http://www.w3.org/ns/widgets" version="1.0.1">
  <name>Cookie Clicker</name>
  <description>Juego Cookie Clicker</description>

  <icon src="img/icono.png" />
  <splash src="img/pantalla-bienvenida.png" />

  <preference name="SplashScreenDelay" value="2000" />
  <preference name="AutoHideSplashScreen" value="true" />
  <preference name="AndroidWindowSplashScreenAnimatedIcon" value="img/pantalla-bienvenida.png" />
  <preference name="AndroidWindowSplashScreenBackground" value="#FFFFFF" />

  <plugin name="cordova-plugin-device" />
  <plugin name="cordova-plugin-splashscreen" />
  <plugin name="cordova-plugin-vibration" />

  <preference name="Orientation" value="portrait" /> 

  <access origin="*" />
</widget>

Comprimir la aplicación en formato «.zip»

La página web VoltBuilder necesita que le proporcionemos nuestra aplicación en formato ZIP. Por ello, deberemos comprimir toda nuestra aplicación en un solo fichero ZIP, que incluirá el fichero «config.xml», y todos los ficheros html, CSS y JavaScript. No importa el nombre que tenga el fichero comprimido.

Compilar la «.apk»

El último paso que deberemos seguir para obtener nuestra aplicación en formato «apk» será subir nuestro fichero «.zip» a la página web VoltBuilder. El proceso es muy sencillo:

  1. Acceder a la página de inicio de VoltBuilder: https://volt.build/
  2. Iniciar sesión (con tu cuenta de gmail por ejemplo) haciendo click en la opción «Login/Sign Up».
  3. Hacer click en la opción «Upload».
  4. Enviar nuestra aplicación arrastrando el fichero ZIP directamente al cuadro de «Android». También se puede hacer click sobre dicho cuadro y seleccionar nuestro fichero después.
  5. Una vez la aplicación se haya compilado, podremos descargar el fichero «.apk» generado a través de un código QR, y ya podremos instalarlo en nuestro propio móvil.

Cookie Clicker con HTML+CSS+Javascript (parte 5): Añadiendo icono y estilos

En esta parte vamos a añadir un icono al juego y aplicaremos los primeros estilos CSS. Esto nos permitirá personalizar el juego, haciéndolo visualmente más atractivo e interactivo, lo que ofrece una mejor experiencia para el jugador.

Icono de la aplicación

Puedes elegir cualquier imagen para el icono de tu juego, teniendo en cuenta simplemente que deberás colocarla dentro de la carpeta img. A continuación te proporcionamos una imagen de ejemplo:

Modificar el archivo «index.html»

Realizaremos las siguientes modificaciones sobre el fichero «index.html»:

  • Añadir un icono: El icono aparecerá en la pestaña del navegador, y posteriormente también lo utilizaremos como icono de aplicación cuando instalemos el fichero «apk» en nuestros dispositivos móviles. Utilizaremos la etiqueta <link> para enlazar el archivo de imagen.
  • Fichero con estilos CSS: Usamos un archivo externo con código CSS («style.css») para aplicar estilos a la página.
  • Clases CSS: Añadiremos las correspondientes clases para aplicar estilos específicos a cada caja. Utilizaremos el atributo class sobre cada bloque div:
    • caja-galleta: Caja que contiene la galleta sobre la que hacemos click para incrementar el contador.
    • caja-mejora: Cajas que activan cada una de las mejoras del juego.
    • caja-opciones: Caja que contendrá opciones como reiniciar el juego, o más adelante, exportar e importar el progreso.
<!DOCTYPE html>
<html lang="es">
<head>
    ...
    <link rel="icon" type="image/png" href="img/icono.png">
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h1>Cookie Clicker</h1>

    <div class="caja-galleta" onclick="incrementarContador()">
        ...
    </div>

    <div class="caja-mejora" onclick="comprarMejora('galletasExtra')">
        ...
    </div>
 
    <div class="caja-opciones">
        <button onclick="reiniciarJuego()">Reiniciar el juego</button>
    </div>
 
    ...
</body>

Archivo «style.css»

Crearemos el fichero «style.css» que contendrá todos los estilos que utilizaremos para personalizar nuestro juego:

  • Estilos básicos: Centramos el contenido, aplicamos una fuente legible y hacemos que el contador de galletas destaque.
  • Estilos avanzados: Añadiremos bordes, sombras, y efectos de clic para que las cajas sean más interactivas y agradables visualmente.
body {
  text-align: center; /* Centra el contenido horizontalmente */
  font-family: Arial, sans-serif; /* Fuente básica para mantener legibilidad */
}

#contador {
  color: #991919; /* Rojo oscuro para destacar el contador, simboliza "galletas acumuladas" */
  font-weight: bold; /* El texto en negrita ayuda a que sea más legible y destaque */
  font-size: 250%; /* Tamaño grande para captar la atención del usuario */
}

/* Agrupación de estilos compartidos para cajas de galleta, mejora y opciones */
.caja-galleta, .caja-mejora, .caja-opciones {
  border-radius: 10px; /* Consistencia visual en los bordes redondeados */
  box-shadow: 2px 2px 10px; /* Sombra para simular profundidad */
  padding: 10px; /* Espacio interno suficiente para evitar que el contenido quede pegado al borde */
  margin: 20px 10px; /* Espaciado que separa visualmente las cajas, sin sobrecargar el espacio */
}

.caja-galleta {
  border: 2px solid #7837d4; /* Borde morado, un color alegre que representa el clic principal del juego */
  cursor: pointer; /* Indica que es interactivo */
}

.caja-galleta:active {
  transform: scale(0.98); /* Efecto visual de que la caja está siendo presionada */
  box-shadow: 2px 2px 5px; /* Sombra más pequeña para dar sensación de "presión" */
}

.caja-mejora {
  border: 2px solid #d4af37; /* Borde dorado para simbolizar un "logro" o mejora premium */
  cursor: pointer; /* Interactivo */
}

.caja-mejora:active {
  transform: scale(0.98); /* Efecto de clic */
  box-shadow: 2px 2px 5px; /* Sombra reducida al hacer clic */
}

.caja-opciones {
  border: 2px solid #d45e37; /* Borde naranja, un color cálido para representar acciones de configuración */
  padding: 20px; /* Mayor espacio interno para acomodar los botones y opciones de manera cómoda */
}

Cookie Clicker con HTML+CSS+Javascript (parte 4): Reiniciando el progreso del juego

En esta parte aprenderemos a reiniciar el progreso del juego. Esto permitirá que el jugador borre todo su progreso y comience desde cero si lo desea. Este enfoque enseña cómo manipular el almacenamiento local del navegador y cómo interactuar con el usuario mediante ventanas de confirmación.

Modificar el archivo «index.html»

Vamos a agregar un botón en la página que le dará al jugador la opción de reiniciar su juego. Cuando el jugador haga clic en el botón, se ejecutará la función reiniciarJuego():

...
</body>
    ...

    <div>
        <button onclick="reiniciarJuego()">Reiniciar el juego</button>
    </div>

    ...
</body>
</html>

Modificar el archivo «script.js»

Añadiremos una nueva función JavaScript que agrupará el código que se debe ejecutar cuando el usuario desee reiniciar el juego:

  • Función reiniciarJuego(): Esta función se ejecuta cuando el jugador hace clic en el botón de reiniciar. Primero, se le pregunta al jugador si realmente quiere reiniciar (usando confirm()). Si el jugador acepta, la función borra el progreso guardado en localStorage y recarga la página:
...

// Función para reiniciar el juego
function reiniciarJuego() {
    // Pregunta al usuario si realmente quiere reiniciar, y si dice que sí, borra el progreso y reinicia la página
    if (confirm("¿Estás seguro de borrar todo el progreso? (Esto no se puede deshacer)")) {
        localStorage.removeItem('juego');  // Elimina el progreso guardado
        location.reload();  // Recarga la página
    }
}

Cookie Clicker con HTML+CSS+Javascript (parte 3): Guardando el progreso

En esta parte aprenderemos a guardar el progreso del juego usando la memoria del navegador, para que el jugador no pierda su avance cuando cierre la página. Veremos cómo utilizar el almacenamiento local para almacenar cualquier tipo de información, de forma que podamos recuperarla después de actualizar o cerrar nuestra página, o incluso después de haber cerrado el navegador.

¿Qué es localStorage?

localStorage es una pequeña «libreta virtual» donde podemos guardar información directamente en el navegador del usuario. A diferencia de la memoria temporal (que se pierde al cerrar la página), los datos guardados en localStorage persisten incluso después de cerrar el navegador o apagar el ordenador.

¿Por qué usar localStorage?

En un juego como Cookie Clicker, queremos que el progreso del usuario (por ejemplo, cuántas galletas ha acumulado o cuántos ayudantes tiene) se mantenga aunque cierre el navegador. localStorage nos permite almacenar este tipo de información de manera sencilla.

¿Cómo funciona localStorage?

localStorage solo guarda datos en formato de texto. Para almacenar datos complejos (como un objeto con el estado del juego), usamos el formato JSON, convirtiendo nuestros datos a texto y viceversa con dos sencillas funciones:

  • JSON.stringify(): Convierte datos complejos a texto.
  • JSON.parse(): Convierte ese texto de vuelta a datos.

¿Qué es es JSON?

JSON es un formato utilizado para almacenar y enviar datos. Su estructura es muy sencilla y está basada en pares clave-valor:

  • Claves: Son los nombres de los datos (por ejemplo, «galletas»).
  • Valores: Son los datos asociados a cada clave (por ejemplo, 200).

Usamos JSON para convertir objetos complejos en cadenas de texto que pueden ser almacenadas en localStorage. Luego, podemos convertirlos de vuelta a objetos que podamos utilizar dentro del código.

Modificar el archivo «script.js»

Utilizando las siguientes funciones podremos guardar y recuperar la cantidad de galletas acumuladas y las mejoras o logros conseguidos durante el juego:

  • Función guardarProgreso(): Esta función guarda los datos del juego en el almacenamiento local del navegador usando localStorage. Los datos se convierten en formato JSON para que el navegador pueda almacenarlos como texto.
  • Función cargarProgreso(): Al iniciar el juego, esta función carga los datos guardados desde localStorage, conviertiendo la cadena JSON en un objeto y verificando que los datos sean correctos antes de usarlos.
...

// Función para comprar una mejora
// "mejora" es el objeto que representa la mejora que el jugador intenta comprar
function comprarMejora(nombreMejora) {
    const mejora = juego.mejoras[nombreMejora];
    if (juego.galletas >= mejora.precio) {  // Verifica si el jugador tiene suficientes galletas
        ...
        guardarProgreso();  // Guarda el progreso después de la compra
    } 
    ...
}

// Función para incrementar el contador de galletas cuando el jugador hace clic
function incrementarContador() {
    ...
    guardarProgreso();  // Guarda el progreso en la memoria del navegador para no perder las galletas conseguidas
}

// Función para guardar el progreso del juego
function guardarProgreso() {
    // Genera una cadena de texto cont todos los datos del juego y lo guarda en el navegador.
    localStorage.setItem('juego', JSON.stringify(juego));

    // Después de guardar, actualiza el progreso visualmente
    mostrarProgreso();  
}

// Función para cargar el progreso guardado
function cargarProgreso() {
    // Recupera los datos del juego guardados previamente
    let juegoGuardado = localStorage.getItem('juego');

    // Si el jugador ha guardado su progreso previamente, lo recuperamos y lo cargamos
    if (juegoGuardado) {
        juegoGuardado = JSON.parse(juegoGuardado);  // Convierte la cadena JSON a un objeto

        // Comprueba si los datos guardados previamente son correctos
        if (datosCorrectos(juegoGuardado)) {
            juego = juegoGuardado;  // Recupera los datos guardados y actualiza el estado del juego
        } else {
            guardarProgreso();  // Si los datos son incorrectos, guarda los datos actuales
        }
        mostrarProgreso();  // Actualiza visualmente el progreso
    }
}

// Función para inicializar el juego
function inicializar() {
    cargarProgreso();  // Carga el progreso guardado al iniciar el juego
}

inicializar();  // Llama a la función para iniciar el juego

Añadir la función de verificación en «utils.js»

A medida que vayamos actualizando la funcionalidad del juego, podrían haber algunas inconsistencias entre los datos guardados y los que tenga la nueva versión de nuestro juego. Por ello necesitaremos una función que compruebe si podemos recuperar la información guardada para utilizarla directamente:

  • Función datosCorrectos(datos): Esta función verifica que los datos guardados tienen las mismas propiedades que el objeto juego. De esta forma, si hay diferencias o los datos están corruptos, podremos evitar cargar datos incorrectos.
...

// Función para comprobar si los datos recibidos como parámetro tienen las mismas propiedades que el objeto 'juego'
function datosCorrectos(datos) {
    // Si no es un objeto o es null, devuelve false.
    if (typeof datos !== 'object' || datos === null) return false;

    // Obtener las claves (propiedades) de 'datos' y 'juego'.
    const keys1 = Object.keys(datos);
    const keys2 = Object.keys(juego);

    // Si el número de propiedades es distinto, devuelve false.
    if (keys1.length !== keys2.length) return false;

    // Comprobar que todas las claves de 'datos' están también en 'juego'.
    return keys1.every(key => keys2.includes(key));
}