Saltar al contenido
Inicio 100 Días de Código en Python — Día 42: Fundamentos web — HTML intermedio

100 Días de Código en Python — Día 42: Fundamentos web — HTML intermedio

Nivel: Grado décimo Área: Tecnología e Informática Modalidad: Tutorial práctico Fuente: Curso "100 Days of Code: The Complete Python Pro Bootcamp" (Angela Yu, App Brewery). Contenido del Día 42 (bloque Web Foundation).

Este tutorial adapta pedagógicamente el Día 42. Las secciones 📝 Ejercicio original del curso provienen de los archivos del curso (transcripciones de las lecciones 316 a 321). Los archivos de inicio se descargan desde Udemy y no están en la carpeta, así que los fragmentos de los ejercicios originales son reconstrucciones a partir de lo que describe la profesora. Los retos 🟢🟡🟠🔴, el proyecto extra y el proyecto integrador son creaciones de esta adaptación. Las correcciones al material original aparecen como 🛠️ Nota técnica.

Nota sobre las verificaciones: el 26 de septiembre de 2026 se comprobó con Google Chrome 153 (modo headless) el comportamiento de los ejemplos marcados como "verificado".


Tabla de contenidos

  1. Antes de empezar: de etiquetas sueltas a documentos completos
  2. La plantilla HTML (boilerplate)
  3. Listas: ul, ol y li
  4. Anidamiento e indentación
  5. Atributos y el elemento ancla: a
  6. El elemento imagen: img
  7. 🚀 Proyecto del día: invitación de cumpleaños
  8. 🌟 Proyecto extra: la Feria de Emprendimiento del colegio
  9. 🏆 Proyecto integrador del bloque web (Días 41 a 44) — Etapa 2
  10. 🧩 Comprueba lo aprendido
  11. 🤖 Programar con apoyo de IA
  12. 🛠️ Correcciones técnicas al material original
  13. 📋 Matriz de trazabilidad
  14. 📦 Evidencias de aprendizaje del Día 42

0. Antes de empezar: de etiquetas sueltas a documentos completos

(Adaptación pedagógica.)

Ayer escribimos etiquetas "sueltas" (h1, p, hr, br). Funcionaban porque el navegador es tolerante, pero una página profesional tiene una estructura completa. Hoy aprenderemos:

  1. La plantilla que debe tener todo archivo HTML.
  2. Listas con viñetas y numeradas, y listas dentro de listas.
  3. Atributos: información extra que se escribe dentro de una etiqueta.
  4. Enlaces e imágenes, lo que convierte un documento en una página web de verdad.

Conexión con Python: el anidamiento de HTML se parece a las estructuras anidadas que ya conoces (listas dentro de listas, diccionarios dentro de diccionarios, Día 9), y la indentación cumple el mismo papel que en Python: mostrar qué está dentro de qué. La gran diferencia es que en HTML la indentación no es obligatoria (el navegador la ignora), mientras que en Python un error de indentación detiene el programa.

Prerequisito: Día 41 (etiquetas, elementos, encabezados, párrafos y elementos vacíos).


1. La plantilla HTML (boilerplate)

(Fuente: 316 - HTML Boilerplate.md)

🎯 Objetivo de aprendizaje

Escribir de memoria la plantilla básica de un documento HTML5 y explicar la función de cada línea.

🧠 ¿Qué aprenderemos?

<!DOCTYPE html>, html y el atributo lang, head, meta charset, title, meta viewport, body, anidamiento e indentación, y el atajo ! de VS Code.

📖 Explicación conceptual

Así como una carta tiene partes fijas (dirección, saludo, cuerpo, despedida y firma), un archivo HTML tiene una estructura fija llamada boilerplate:

HTML
<!DOCTYPE html>
<html lang="es">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Mi sitio web</title>
  </head>
  <body>
    <h1>Hola</h1>
  </body>
</html>
Línea Qué hace
<!DOCTYPE html> Declaración del tipo de documento: indica al navegador que el archivo está escrito en HTML5. Va siempre en la primera línea
<html lang="es"> Elemento raíz: todo lo demás va dentro de él. lang indica el idioma del contenido; los lectores de pantalla lo usan para pronunciar bien ("es" español, "en" inglés)
<head> Información sobre la página que el usuario no ve como contenido
<meta charset="UTF-8" /> Codificación de caracteres. Con UTF-8 se ven bien tildes, la ñ, emojis y símbolos como × o ÷
<meta name="viewport" ...> Cómo mostrar la página según el tamaño de la pantalla (importante en celulares)
<title> El texto que aparece en la pestaña del navegador
<body> Todo el contenido visible: títulos, párrafos, imágenes, enlaces

La analogía de la hamburguesa (del curso): <html> y </html> son el pan de arriba y el de abajo; head y body son capas intermedias; el contenido del body es "la carne". Todo lo que se abre dentro de algo debe cerrarse dentro de ese mismo algo.

Indentación: cada nivel de anidamiento se desplaza (por ejemplo, dos espacios) para ver de un vistazo qué está dentro de qué. Un elemento corto puede ir en una sola línea (<title>Mi sitio</title>); sigue teniendo apertura y cierre.

Atajo de VS Code: en un archivo que termine en .html, escribe ! y presiona Enter: VS Code (con su herramienta Emmet) inserta la plantilla. La profesora recomienda escribirla a mano las primeras veces para aprenderla.

🛠️ Nota técnica: en el video, el atajo ! inserta también <meta http-equiv="X-UA-Compatible" content="IE=edge">. Esa línea solo servía para Internet Explorer, que ya no tiene soporte. La profesora recomienda borrarla, y las versiones recientes de VS Code ya no la incluyen. Además, el atajo pone lang="en": si tu página está en español, cámbialo a lang="es".

💡 Ver el código de cualquier página: clic derecho → Ver código fuente de la página. Verás el DOCTYPE, el html, el head con su charset y el title.

⚠️ Errores frecuentes

Error Qué ocurre Cómo solucionarlo
Poner contenido visible dentro de head El navegador lo mueve al body o lo oculta; el código queda confuso Todo lo visible va en body
Olvidar <meta charset="UTF-8" /> Tildes y ñ pueden verse como ó o ñ en algunos servidores Inclúyelo siempre como primera línea del head
Dejar lang="en" en una página en español El lector de pantalla pronuncia el español con acento inglés lang="es"
Escribir ! en un archivo .txt El atajo no aparece Guarda primero el archivo como .html

📝 Ejercicio original del curso: construye tu propia hamburguesa

  • Enunciado: escribe en VS Code una "hamburguesa" en código HTML, inventando elementos como <bun>, <tomato> o <lettuce>, cada uno con etiqueta de apertura y de cierre, y agrega atributos (nombre, signo igual y valor).
  • Objetivo: practicar anidamiento, indentación y la sintaxis de los atributos.
  • Condición: mantener la indentación correcta; todo lo que se abre, se cierra.

Ejemplo del formato que muestra la profesora (el resto lo inventas tú):

HTML
<bun type="sesame">
  <lettuce fresh="true"></lettuce>
  <!-- ...tus capas... -->
</bun>

🛠️ Nota técnica: los elementos inventados como <bun> no son HTML válido. El navegador no da error: los trata como elementos desconocidos sin significado. Sirven para practicar la sintaxis del anidamiento, pero no se usan en páginas reales. (Existen los custom elements de JavaScript, pero su nombre debe llevar un guion, como <mi-hamburguesa>, y se estudian mucho más adelante.)

🔍 Antes de programar

  • ¿Qué capa es "la raíz" de tu hamburguesa, la que contiene a todas las demás?
  • ¿Qué capas van dentro de otras y cuáles están al mismo nivel?
  • ¿Qué información extra (atributo) tiene sentido para cada ingrediente?

Retos adicionales (creados para esta adaptación)

  • 🟢 Reto 1: escribe de memoria la plantilla completa, sin usar el atajo !. Compárala con la de esta guía y anota qué olvidaste.
  • 🟡 Reto 2: cambia lang a "en" en una página escrita en español y escúchala con el lector de pantalla (Narrador: Ctrl + Win + Enter). Describe qué cambia.
  • 🟠 Reto 3 — Depuración: esta plantilla tiene cuatro errores. Encuéntralos:
HTML
  <html lang="es">
  <!DOCTYPE html>
    <head>
      <title>Club de lectura</title>
      <h1>Bienvenidos</h1>
    </head>
    <body>
      <p>Nos reunimos los martes.</p>
    </html>
  </body>
  • 🔴 Reto 4 — Pensamiento computacional: representa el horario semanal de tu curso como una hamburguesa HTML inventada (<semana>, <dia nombre="lunes">, <clase hora="7:00">…). Luego responde: ¿cómo representarías la misma información en Python? Escribe la estructura equivalente con listas y diccionarios y compara ambas.

2. Listas: ul, ol y li

(Fuente: 317 - The List Element.md)

🎯 Objetivo de aprendizaje

Elegir entre lista desordenada y lista ordenada según el significado del contenido.

📖 Explicación conceptual

Internet está lleno de listas: los artículos de "10 cosas que…", la lista de "Los diez más buscados del FBI" (que, como muestra la profesora con Inspeccionar, está hecha con una lista)…

Elemento Nombre Se ve como Úsalo cuando…
<ul> Unordered list (lista desordenada) Viñetas • El orden no importa (lista de mercado)
<ol> Ordered list (lista ordenada) Números 1, 2, 3 El orden sí importa (pasos de una receta)
<li> List item (elemento de lista) Cada ítem Siempre, dentro de ul u ol
HTML
<ul>
  <li>Leche</li>
  <li>Huevos</li>
  <li>Pan</li>
</ul>

ul y ol no llevan texto directamente: su contenido son elementos li. En una ol, el número de cada ítem depende de su posición.

Estilo de escritura: la profesora prefiere cada <li> en una sola línea para contar los ítems de un vistazo. Si el texto es largo, VS Code puede pasar el cierre a la siguiente línea. Las dos formas son válidas.

🔎 Ejemplo explicado

HTML
<h2>Para la salida pedagógica</h2>
<ul>
  <li>Gorra</li>
  <li>Bloqueador solar</li>
  <li>Agua</li>
</ul>

<h2>Protocolo en caso de sismo</h2>
<ol>
  <li>Mantén la calma.</li>
  <li>Aléjate de ventanas.</li>
  <li>Sigue la ruta de evacuación.</li>
</ol>

¿Por qué dos tipos? Da igual si empacas primero la gorra o el agua, pero en un protocolo de sismo el orden salva vidas.

⚠️ Errores frecuentes

Error Qué ocurre Solución
Escribir texto directamente dentro de <ul> sin <li> HTML inválido; el texto aparece sin viñeta Cada ítem va en un <li>
Escribir los números a mano dentro de una ol (<li>1. Mezclar</li>) Aparecen dos números: "1. 1. Mezclar" Deja que ol numere
Usar ol para algo sin orden Comunica un orden que no existe Pregúntate: ¿cambia el significado si reordeno?

📝 Ejercicio original del curso: receta de rollos de canela (3.0 List Elements)

  • Enunciado: el index.html trae el texto de una receta de rollos de canela. Hay que convertirlo en una página con encabezados y listas.
  • Resultado esperado (según el video):
    • Un h1 para el nombre de la receta.
    • h2 para "Ingredientes" e "Instrucciones".
    • h3 para las subsecciones de ingredientes (la masa y el relleno). El nivel exacto de los encabezados es libre; lo que importa son las listas.
    • Una ul con los ingredientes de la masa y otra ul con los tres ingredientes del relleno.
    • Una ol con los pasos de preparación.
  • Restricción: el texto ya está escrito; solo se agregan etiquetas.

🔍 Antes de programar

  • ¿Importa el orden en que se listan los ingredientes? ¿Y el de los pasos?
  • ¿Cuántas listas hay en total? ¿De qué tipo es cada una?
  • Si alguien leyera solo los encabezados, ¿entendería cómo está organizada la receta?

Retos adicionales (creados para esta adaptación)

  • 🟢 Reto 1: escribe la receta de un plato típico de tu región (arepas, sancocho, empanadas…) con ingredientes en ul y pasos en ol.
  • 🟡 Reto 2: consulta en MDN el atributo reversed de <ol> y úsalo para un "conteo regresivo" de las 5 mejores canciones del año.
  • 🟠 Reto 3: convierte los útiles escolares pedidos para grado décimo en una lista agrupada por asignatura. ¿Cuál es la forma más clara sin usar todavía listas anidadas?
  • 🔴 Reto 4: escribe un programa en Python que reciba una lista de Python (["Leche", "Huevos", "Pan"]) y un valor booleano ordenada, y genere el código HTML de la lista (<ol> o <ul> con sus <li>). Pruébalo con dos listas distintas.

3. Anidamiento e indentación

(Fuente: 318 - Nesting and Indentation.md)

🎯 Objetivo de aprendizaje

Crear listas anidadas correctamente y usar la indentación para encontrar errores de cierre.

📖 Explicación conceptual

Se puede poner una lista dentro de un elemento de lista. La regla clave del curso:

Cuando anidas una lista, el </li> del elemento "padre" no va justo después de su texto: va después de cerrar la lista anidada.

HTML
<ul>
  <li>A</li>
  <li>
    B
    <ol>
      <li>B1</li>
      <li>B2</li>
    </ol>
  </li>          <!-- aquí se cierra el li de "B" -->
  <li>C</li>
</ul>

¿Por qué indentar? Mira este mismo código sin sangría:

HTML
<ul><li>A</li><li>B<ol><li>B1</li><li>B2</li></ol></li><li>C</li></ul>

Funciona igual, pero para entenderlo hay que leer cada etiqueta. Con indentación, la estructura se ve a simple vista. "Cuando escribes código, piensa en cómo lo van a leer otras personas" (idea de la profesora).

VS Code te ayuda: al guardar (Ctrl + S), el formateador vuelve a indentar todo, y unas líneas verticales guía conectan cada apertura con su cierre.

🔎 Ejemplo explicado: diagnosticar un cierre faltante (del curso)

La profesora muestra que, si falta un </ol>, la letra C aparece dentro de la lista numerada en vez de en la lista principal. Siguiendo las líneas guía de VS Code descubre que un <ol> "se empareja" con un </li>: señal de que falta una etiqueta de cierre. A esto se le llama depuración.

⚠️ Errores frecuentes

Error Síntoma Solución
Cerrar el </li> del padre antes de la lista anidada La sublista queda "suelta" dentro de la ul, fuera de cualquier li: HTML inválido, con sangría rara Cierra el li después de la sublista
Olvidar el cierre de una sublista Los ítems siguientes quedan dentro de la sublista (el síntoma de la "C" del curso) Sigue las líneas guía y cuenta aperturas y cierres
Cerrar un <ol> con </ul> Según lo que haya alrededor, el navegador ignora ese cierre (y la lista sigue abierta) o cierra una lista distinta a la esperada Cada cierre debe coincidir con su apertura

📝 Ejercicio original del curso: la lista anidada compleja

  • Enunciado: reproducir exactamente la estructura de la imagen objetivo.
  • Estructura esperada (según el video):
    • Lista desordenada: A, B, C.
    • Dentro de B: lista ordenada B1, B2, B3.
    • Dentro de B2: lista desordenada B2a, B2b, B2c.
    • Dentro de B2a: lista desordenada B2aa, B2ab.
    • Dentro de B3: lista ordenada B31, B32.
  • Consejo del curso: los nombres (B2a, B2ab…) indican dónde va cada ítem. Usa la vista previa mientras escribes.
  • Palabras de la profesora: "No vas a aprender a programar solo viéndome programar". Inténtalo antes de ver cualquier solución.

🔍 Antes de programar

  • Dibuja la estructura como un árbol en papel. ¿Cuántos niveles de profundidad tiene?
  • ¿Cuántas listas (ul + ol) hay en total? ¿Cuántos li?
  • Para cada li que contiene una sublista, ¿dónde irá su </li>?

Pista para comprobar

Hay 5 listas en total (3 ul y 2 ol) y 13 elementos li. Si tus números no coinciden, revisa tu árbol.

Retos adicionales (creados para esta adaptación)

  • 🟢 Reto 1: crea el plan de estudios del área de Tecnología: periodos (lista ordenada) y, dentro de cada uno, los temas (lista desordenada).
  • 🟡 Reto 2: representa la organización del gobierno escolar (rector, consejo directivo, consejo académico, personero, consejo estudiantil con sus representantes) con al menos tres niveles de anidamiento.
  • 🟠 Reto 3 — Depuración: este código muestra "Postres" dentro de "Bebidas". Encuentra el error sin abrir el navegador y corrígelo:
HTML
  <ul>
    <li>Bebidas
      <ul>
        <li>Jugo</li>
        <li>Agua</li>
    </li>
    <li>Postres</li>
  </ul>
  • 🔴 Reto 4 — Pensamiento computacional: escribe en Python la estructura del ejercicio original como listas anidadas (por ejemplo, ["A", ["B", [...]], "C"]) y una función recursiva que imprima cada ítem con una sangría proporcional a su profundidad. ¿Qué tienen en común la recursión y el anidamiento de HTML?

4. Atributos y el elemento ancla: a

(Fuente: 319 - Anchor Elements.md)

🎯 Objetivo de aprendizaje

Crear enlaces con <a href="..."> y distinguir entre atributos específicos y globales.

📖 Explicación conceptual

Atributo: información adicional sobre un elemento. Se escribe en la etiqueta de apertura, después del nombre y separado por un espacio:

HTML
<a href="https://www.mintic.gov.co">Ministerio TIC</a>
<!-- nombre de la etiqueta · nombre del atributo = "valor" · contenido -->
  • Puede haber varios atributos, separados por espacios.
  • El valor va entre comillas dobles porque es un texto. Así se distingue de las palabras reservadas del lenguaje (a, li, href…).

El elemento ancla (a): crea hipervínculos. Sin el atributo href, el texto aparece pero no es un enlace activo. Con href, el navegador lo muestra en azul y subrayado, y al hacer clic lleva a la dirección indicada.

Tipo de atributo Ejemplos ¿Dónde se usa?
Específico href (en a), src y alt (en img), start (en ol) Solo en ciertos elementos
Global draggable, id, class, style, lang En cualquier elemento

La documentación de MDN lista los atributos de cada elemento. Algunos están marcados como obsoletos (deprecated): no se deben usar en HTML5.

🛠️ Nota técnica: el video demuestra el atributo global draggable="true" sobre un enlace y dice que, sin él, el enlace no se puede arrastrar. En realidad, en Chrome los enlaces con href y las imágenes ya son arrastrables por defecto (verificado: draggable vale true sin escribir nada). El atributo sí cambia el comportamiento en elementos que no lo son, como un <p> o un <a> sin href. Prueba <p draggable="true">Arrástrame</p>.

🔎 Ejemplo explicado

HTML
<ol>
  <li><a href="https://www.colombiaaprende.edu.co">Colombia Aprende</a></li>
  <li><a href="https://developer.mozilla.org/es/">MDN en español</a></li>
</ol>

Hay tres capas de anidamiento: a dentro de li, dentro de ol. El número de la lista no es azul, porque pertenece al li, no al enlace.

⚠️ Errores frecuentes

Error Qué ocurre Solución
<a>Google</a> sin href Texto normal, no se puede hacer clic Agrega href
<a href="www.google.com"> El navegador lo interpreta como un archivo local llamado www.google.com y el enlace falla Escribe la URL completa: https://www.google.com
Poner el atributo en el cierre: </a href="..."> No funciona Los atributos van solo en la etiqueta de apertura
Olvidar las comillas o una de ellas El atributo se "come" el resto de la etiqueta Revisa que cada valor tenga comillas de apertura y cierre
Texto del enlace "clic aquí" El lector de pantalla puede listar los enlaces fuera de contexto: diez veces "clic aquí" no dice nada El texto del enlace debe describir el destino

📝 Ejercicio original del curso: mis 5 sitios web favoritos

  • Enunciado: el h1 ya está escrito. Crea una lista ordenada con cinco enlaces a tus sitios web favoritos.
  • Resultado esperado: números del 1 al 5 (no azules) y el nombre de cada sitio como enlace que funcione. (La profesora usa, por ejemplo, Product Hunt.)
  • Reto extra del curso: consulta en MDN los atributos de <ol> y usa start para que la lista empiece en 5 (y termine en 9).

🔍 Antes de programar

  • ¿En qué orden se anidan ol, li y a?
  • ¿Qué parte del enlace ve el usuario y qué parte usa el navegador?
  • Para el reto extra: ¿en qué etiqueta va el atributo start, en ol o en li?

Retos adicionales (creados para esta adaptación)

  • 🟢 Reto 1: crea una lista de recursos para estudiar (diccionario de la RAE, calculadora en línea, biblioteca digital) con enlaces cuyo texto describa el destino.
  • 🟡 Reto 2: investiga en MDN el atributo target="_blank" y úsalo para abrir un enlace en una pestaña nueva. Averigua qué se recomienda escribir en el atributo rel en ese caso y por qué.
  • 🟠 Reto 3: investiga cómo crear un enlace que abra el correo (mailto:) y otro que marque un teléfono (tel:). Úsalos en una tarjeta de contacto de la secretaría del colegio (con datos ficticios).
  • 🔴 Reto 4 — Pensamiento computacional: crea dos archivos, index.html y horario.html, en la misma carpeta, enlazados entre sí (pista: href="horario.html"). ¿Por qué aquí no hace falta escribir https://? Esta idea de rutas relativas se profundiza en el Día 43.

5. El elemento imagen: img

(Fuente: 320 - Image Elements.md)

🎯 Objetivo de aprendizaje

Insertar imágenes con src y escribir textos alternativos (alt) útiles.

📖 Explicación conceptual

HTML
<img src="https://picsum.photos/200" alt="Paisaje aleatorio de ejemplo" />
  • img es un elemento vacío (como hr y br): una imagen no tiene "contenido de texto", su contenido es el archivo que indica src.
  • src (source, fuente): la ubicación de la imagen.
  • alt (texto alternativo): lo que el lector de pantalla lee a una persona ciega o con baja visión. También aparece si la imagen no carga. La profesora lo muestra con la extensión Silktide en el sitio de la BBC: el lector anuncia "Delfín saltando del mar — Imagen", y ese texto está en el alt.
  • picsum.photos: "el Lorem ipsum de las fotos". https://picsum.photos/200 entrega una imagen aleatoria de 200 × 200 píxeles.
  • Los GIF animados funcionan igual que JPG o PNG: se ponen en src y se animan solos.
  • alt vacío (alt=""): para imágenes decorativas que no aportan información. Así el lector de pantalla las omite. Vacío no es lo mismo que ausente: si falta el atributo, algunos lectores leen el nombre del archivo.

⚠️ Errores frecuentes

Error Qué ocurre Solución
<img src="foto.jpg"></img> img no tiene cierre <img src="foto.jpg" alt="..." />
Ruta equivocada (src="Foto.JPG" si el archivo es foto.jpg) Ícono de imagen rota. En servidores reales las mayúsculas importan Copia el nombre exacto del archivo
alt="imagen" o alt="foto123.jpg" No describe nada útil Describe lo que muestra y para qué está: alt="Estudiantes plantando árboles en la huerta"
Usar imágenes de Internet sin permiso Problemas de derechos de autor Usa imágenes propias, de bancos libres o con licencia Creative Commons, y cita la fuente

📝 Ejercicio original del curso: ¿gatos o perros?

  • Enunciado: el index.html trae dos URL de ejemplo (un perro y un gato). Crea un h1 que diga "Me gustan los gatos" o "Me gustan los perros" y, debajo, un img con la URL correspondiente.
  • Detalles del video: el perro es un GIF animado (un cachorro cavando en la arena); el gato es un JPG estático.
  • Parte final: agrega un alt que describa la imagen. Visualmente no cambia nada, pero la página se vuelve accesible.

🔍 Antes de programar

  • ¿Qué atributos necesita la imagen como mínimo?
  • ¿Cómo describirías la imagen a alguien por teléfono? Ese es tu alt.

Retos adicionales (creados para esta adaptación)

  • 🟢 Reto 1: descarga una imagen libre, guárdala en una carpeta imagenes/ junto a tu index.html y muéstrala con una ruta local (src="imagenes/huerta.jpg").
  • 🟡 Reto 2: convierte una imagen en enlace: pon el <img> dentro de un <a>. ¿Qué debería decir el alt en ese caso: lo que muestra la imagen o a dónde lleva?
  • 🟠 Reto 3 — Evaluación de accesibilidad: escribe el alt de estas cinco imágenes y justifica cuál debería tener alt="": (a) el logo del colegio en el encabezado; (b) una línea decorativa de flores; (c) un gráfico con los resultados de las elecciones del personero; (d) la foto del equipo campeón; (e) un ícono de lupa junto a la palabra "Buscar".
  • 🔴 Reto 4: investiga en MDN los atributos width y height de img. ¿Por qué se recomienda indicarlos aunque luego se cambie el tamaño con CSS? (Pista: lo que pasa con el resto de la página mientras la imagen carga.)

6. 🚀 Proyecto del día: invitación de cumpleaños

(Fuente: 321 - Day 42 Project - Birthday Invite Website.md)

Problema

"Las invitaciones de papel y las de WhatsApp son para quien no sabe crear sitios web", bromea la profesora. Vas a crear una página de invitación para tu próxima celebración.

Contexto

El resultado tendrá un aspecto "retro de los 90", porque aún no sabemos dar estilo (eso llega mañana con CSS). La página debe informar de qué se trata, cuándo es, qué llevar y dónde es.

Objetivo

Combinar en una sola página todo lo aprendido: plantilla, encabezados, listas, enlaces e imágenes.

Requisitos funcionales (originales del curso)

El curso lo plantea como proyecto, no como ejercicio evaluado: "no hay nada bueno o malo". Como mínimo debe tener:

  1. Una imagen.
  2. Una lista.
  3. Un enlace (ancla).

El código de inicio trae una URL de imagen de ejemplo y un enlace de Google Maps de ejemplo (con una "sorpresa": un lugar de Tokio lleno de palomas).

Solución de la profesora (resumen del video): h1 "¡Es mi cumpleaños!"; h2/h3 para la fecha, "qué llevar" y "dónde"; una imagen con src y alt; una ul con lo que hay que llevar; y un <a href="..."> al mapa.

Restricciones técnicas

  • Plantilla HTML completa con lang="es" y charset UTF-8.
  • Solo HTML (nada de CSS todavía).
  • Toda imagen con alt descriptivo.

Planificación

  1. Comprender: ¿qué necesita saber un invitado?
  2. Entradas: motivo, fecha, hora, lugar, qué llevar, una imagen.
  3. Proceso: decidir qué elemento HTML representa cada dato.
  4. Salida: una página clara que se entienda en 10 segundos.
  5. Dividir: plantilla / encabezado / imagen / fecha / lista / ubicación.
  6. Diseñar en papel → 7. Implementar → 8. Probar → 9. Corregir → 10. Mejorar.

Construcción paso a paso

  • Versión 1 — Plantilla: ! o escrita a mano. Cambia el title y el lang.
  • Versión 2 — Encabezados: el h1 y los h2 de cada sección, sin contenido.
  • Versión 3 — Contenido: la fecha en un párrafo, la imagen con su alt.
  • Versión 4 — Lista: "Qué llevar" en una ul.
  • Versión final — Ubicación: enlace al mapa con un texto descriptivo ("Ver la ubicación en Google Maps", no "clic aquí").

Pruebas

Prueba Resultado esperado
Hacer clic en el enlace Abre el mapa correcto
Desconectar Internet y recargar La imagen no carga y aparece el texto alt
Leer la página con el Narrador Se entiende la invitación sin ver la pantalla
Revisar el título de la pestaña Muestra tu title, no "Document"
Validar en validator.w3.org (pestaña Validate by Direct Input) Sin errores

🧪 Prueba y depuración

Encuentra los cinco problemas de esta invitación (cuatro son errores; uno no rompe la página, porque el navegador cierra ciertos elementos solo, pero es mala práctica y hace el código inconsistente):

HTML
<!DOCTYPE html>
<html lang="es">
  <head>
    <meta charset="UTF-8" />
    <title>Fiesta de Sofía</title>
  </head>
  <body>
    <h1>¡Cumpleaños de Sofía!</h1>
    <img href="https://picsum.photos/300" />
    <h2>Qué llevar</h2>
    <ol>
      <li>Traje de baño
      <li>Toalla</li>
    </ul>
    <a>Ver ubicación</a>
  </body>
</html>

⭐ Extensión del proyecto

  • Agrega un cronograma de la fiesta en una ol (llegada, juegos, torta…).
  • Agrega un enlace mailto: para confirmar asistencia.
  • Crea una segunda página, galeria.html, con fotos de la celebración anterior, y enlaza ambas páginas.

7. 🌟 Proyecto extra: la Feria de Emprendimiento del colegio

(Proyecto creado para esta adaptación; no existe en el curso original.)

Situación

El colegio organiza una Feria de Emprendimiento con puestos de estudiantes. Necesitan una página informativa para compartir con las familias.

Requisitos

  1. Plantilla completa y válida.
  2. Una presentación de la feria (fecha, lugar, objetivo).
  3. Una agenda del día (lista ordenada).
  4. Los emprendimientos agrupados por categoría (alimentos, artesanías, tecnología…) en una lista anidada: categoría → emprendimiento → datos (curso, qué venden).
  5. Al menos dos imágenes con alt adecuado (una puede ser decorativa, con alt="").
  6. Al menos tres enlaces: la ubicación del colegio en un mapa, una página interna (reglamento.html) y un recurso externo (por ejemplo, información sobre emprendimiento juvenil de una entidad oficial).

Decisiones que debes tomar (y justificar)

  • ¿Qué tipo de lista usas en cada caso y por qué?
  • ¿Qué imagen es informativa y cuál decorativa?
  • ¿Cuántos niveles de anidamiento son necesarios sin volver la página confusa?

Casos de prueba

  • El validador W3C no reporta errores.
  • Todos los enlaces funcionan, incluido el enlace a reglamento.html.
  • Leyendo solo la estructura (encabezados y listas), un familiar entiende la organización de la feria.

8. 🏆 Proyecto integrador del bloque web (Días 41 a 44) — Etapa 2

(Proyecto creado para esta adaptación. La situación problema, la pregunta orientadora y la etapa 1 están en el tutorial del Día 41.)

Recordatorio: estás construyendo el sitio web de un grupo o proyecto del colegio.

Etapa 2 (hoy): un documento HTML completo

  1. Envuelve tu index.html de la etapa 1 en la plantilla completa (lang="es", charset, viewport, un title descriptivo).
  2. Convierte en listas la información que lo permita (actividades, logros, requisitos para unirse). Usa al menos una lista anidada.
  3. Agrega al menos dos imágenes con alt bien escrito (preferiblemente fotos propias o con licencia libre, en una carpeta imagenes/).
  4. Crea una segunda página, unete.html, con los pasos para unirse (lista ordenada), y enlaza ambas páginas en los dos sentidos.
  5. Agrega un enlace externo relacionado con el tema del grupo.
  6. Entregable de la etapa: carpeta del proyecto con index.html, unete.html, imagenes/ y una captura del validador W3C sin errores.

9. 🧩 Comprueba lo aprendido

Conceptuales

  1. ¿Qué pasa si falta <!DOCTYPE html>? ¿Y si falta <meta charset="UTF-8" />?
  2. ¿Cuál es la diferencia entre head y body?
  3. ¿Cuándo usarías ul y cuándo ol? Da un ejemplo de cada una tomado del colegio.
  4. ¿Qué es un atributo? ¿En qué se diferencian los atributos específicos de los globales?
  5. ¿Para qué sirve alt? ¿Cuándo debe estar vacío?

Análisis de código

Explica qué muestra este código y cuántos niveles de anidamiento tiene:

HTML
<ol start="3">
  <li>Revisar la tarea</li>
  <li>Resolver dudas
    <ul>
      <li>Matemáticas</li>
      <li>Física</li>
    </ul>
  </li>
</ol>

Predicción

¿Qué número tendrá "Resolver dudas"? ¿Qué símbolo tendrán "Matemáticas" y "Física"? Compruébalo en el navegador.

Depuración

HTML
<ul>
  <li><a href="https://www.sena.edu.co">SENA</li></a>
  <li><img src="logo.png"></img></li>
</ul>

Encuentra tres problemas (uno de anidamiento, uno de sintaxis de un elemento vacío y uno de accesibilidad).

Modificación

Toma tu lista de "5 sitios favoritos" y haz que cada sitio tenga debajo una sublista con dos razones por las que te gusta.

Creación

Crea la página "Ruta del bus escolar": una lista ordenada de paradas; en cada parada, una sublista con la hora de paso; un enlace a un mapa, y una imagen del bus con su alt.


10. 🤖 Programar con apoyo de IA

Recuerda el ciclo: formula el problema → inténtalo tú → consulta a la IA → lee y entiende → prueba → compara con MDN → modifica → explica con tus palabras.

Actividad 1 — Comprobar una afirmación del curso con la IA y con el navegador. Pregúntale a una IA: "¿Un enlace <a href> se puede arrastrar si no tiene el atributo draggable?". Luego compruébalo tú: crea un enlace sin draggable e intenta arrastrarlo a la barra de direcciones. ¿Quién acertó: la IA, el video o ninguno? ¿Qué dice MDN sobre el valor por defecto de draggable?

Actividad 2 — Revisar el alt generado. Pide a una IA que escriba el alt de una foto de tu colegio describiéndosela. Evalúa la respuesta: ¿describe lo importante?, ¿es demasiado larga?, ¿empieza con "Imagen de…" (algo innecesario, porque el lector ya anuncia que es una imagen)? Mejórala.

Actividad 3 — Listas anidadas. Pide a una IA el código del ejercicio de la lista anidada compleja (sección 3) describiéndole la estructura. Antes de aceptarlo, cuenta las listas y los li (deben ser 5 y 13) y revisa dónde puso cada </li>. Si hay diferencias, explica cuál es el error.


11. 🛠️ Correcciones técnicas al material original

Archivo Afirmación o comportamiento del curso Observación Tratamiento
316 El atajo ! inserta X-UA-Compatible Solo servía para Internet Explorer (sin soporte). La profesora recomienda borrarlo; las versiones recientes de VS Code ya no lo incluyen Nota técnica de la sección 1
316 El atajo pone lang="en" Para páginas en español debe ser lang="es" Nota técnica de la sección 1
316 Hamburguesa con elementos inventados (<bun>) No son HTML válido; el navegador los trata como desconocidos. Válido solo como práctica de sintaxis Nota técnica de la sección 1
319 Sin draggable="true", un enlace no se puede arrastrar Los enlaces con href y las imágenes son arrastrables por defecto en Chrome 153 (verificado) Nota técnica de la sección 4; Actividad 1 de IA
319 Nombre del atributo start en la narración ("inicio") La transcripción traduce el nombre, pero en el código es start; los nombres de atributos no se traducen Sección 4
320 "Etiqueta alt" alt es un atributo, no una etiqueta Sección 5

12. 📋 Matriz de trazabilidad

Contenido original Archivo de origen Concepto desarrollado Ejercicio original Reto adicional Proyecto relacionado
Plantilla: DOCTYPE, html y lang, head, meta charset, title, body, viewport, X-UA-Compatible, atajo !, analogía de la hamburguesa, indentación 316 Sección 1 Construye tu propia hamburguesa Retos 1–4 de la sección 1 Secciones 6, 7 y 8
ul, ol, li, sitio del FBI, estilo de una línea por li 317 Sección 2 3.0 Receta de rollos de canela Retos 1–4 de la sección 2 Secciones 6, 7 y 8
Listas anidadas, cierre del li padre, indentación, líneas guía de VS Code, depuración de un </ol> faltante 318 Sección 3 Lista anidada compleja (A–C, B1–B3, B2a–B2c, B2aa–B2ab, B31–B32) Retos 1–4 de la sección 3 Secciones 7 y 8
Atributos, a y href, atributos específicos y globales, draggable, MDN 319 Sección 4 5 sitios favoritos; reto extra start="5" Retos 1–4 de la sección 4 Secciones 6, 7 y 8
img, src, alt, picsum.photos, GIF, lector de pantalla (Silktide, BBC), alt vacío 320 Sección 5 ¿Gatos o perros? Retos 1–4 de la sección 5 Secciones 6, 7 y 8
Proyecto de invitación: imagen, lista y enlace como mínimo 321 Sección 6 Proyecto del día 🧪 y ⭐ de la sección 6 Sección 6
(No existe en el curso original) — — — Feria de Emprendimiento Sección 7
(No existe en el curso original) — — — Sitio web de un grupo del colegio, etapa 2 Sección 8

13. 📦 Evidencias de aprendizaje del Día 42

  • Plantilla HTML escrita de memoria (Reto 1 de la sección 1) con tus anotaciones de lo que olvidaste.
  • Los cinco ejercicios originales resueltos: hamburguesa, receta, lista anidada, 5 sitios favoritos (con start="5") y gatos o perros.
  • El árbol dibujado de la lista anidada compleja.
  • La invitación de cumpleaños con la tabla de pruebas diligenciada y el ejercicio 🧪 corregido.
  • La Feria de Emprendimiento (proyecto extra) o la etapa 2 del proyecto integrador, con captura del validador W3C.
  • Resultado de la Actividad 1 de IA (comprobación de draggable).
  • Cuaderno de errores: li padre cerrado antes de la sublista, cierres que no coinciden, href sin https://, img con etiqueta de cierre, alt ausente o inútil, lang equivocado.