🚀 Curso HTML · Nivel N4–N5 Avanzado / Experto

Bloque 4: Proyecto final

La última recta: pasas de hacer ejercicios a construir como profesional. Plantillas reutilizables, cómo se alimenta una web real desde un CMS headless, y tu proyecto final: un sitio corporativo multiplana, accesible y auditado, con examen global y defensa técnica para cerrar tu aprendizaje.

⏱ ≈ 15 horas 🧭 4 lecciones ✍️ Reto final integrador 📝 Examen global del curso
Lección 1 · Teoría

Plantillas reutilizables y arquitectura documental

Hasta ahora cada página vivía sola. Un sitio real es un sistema de documentos que comparten cabecera, menú, pie y estilos. La diferencia entre un aficionado y un profesional está en cómo se organiza ese sistema antes de escribir la primera línea.

1.1 · Arquitectura de carpetas

mi-sitio/
├── index.html          ← portada
├── servicios.html      ← páginas interiores…
├── equipo.html         ← …todas comparten estructura
├── contacto.html
├── css/
│   └── styles.css      ← UNA hoja de estilos compartida
├── js/
│   └── main.js         ← comportamiento común
└── img/
    ├── logo.png        ← recursos organizados por tipo
    ├── equipo/
    └── servicios/
✅ Nombres en minúsculas, sin espacios ni acentos: servicios.html, no «Servi cios.HTML».
✅ Rutas siempre relativas dentro del proyecto: img/equipo/maria.jpg.
❌ Carpetas tipo nueva-carpeta-final-v2: el nombre debe describir el contenido.

1.2 · El problema de repetirse (y tres soluciones)

El mismo <header> y <footer> se repiten en cada página. Cuando cambie algo tendrás que tocarlas todas… a menos que uses una estrategia de plantilla:

  1. Copia disciplinada: mantén una página maestra (_plantilla.html) y duplica. Es lo que harás en este curso.
  2. Includes por JavaScript: un main.js inyecta header/footer comunes en un contenedor. Funciona, pero depende de JS.
  3. Generadores y plantillas de servidor: PHP, includes o generadores estáticos componen la página antes de enviarla. Lo verás en los cursos correspondientes.

Para piezas internas reutilizables (una tarjeta, una fila de tabla), HTML5 trae el elemento <template>: define marcado dormido —no se pinta hasta que JavaScript lo clona—. Es la base de los componentes modernos:

plantilla-tarjeta.html
<template id="tplTarjeta">
  <article class="tarjeta">
    <h3></h3>
    <p></p>
  </article>
</template>

<script>
  // Vista previa: esto es JavaScript (curso propio 😉)
  const tpl = document.getElementById('tplTarjeta');
  const clon = tpl.content.cloneNode(true);
  clon.querySelector('h3').textContent = 'Diseño web';
  document.querySelector('#lista').append(clon);
</script>
💡 Marca las zonas variables de tu plantilla con comentarios: <!-- TÍTULO ÚNICO DE PÁGINA -->, <!-- CONTENIDO -->. Duplicar y sustituir se vuelve mecánico y sin olvidos.
Lección 2 · Conceptos

Integración HTML + CMS headless

Un CMS (Content Management System) permite que personas sin conocimientos técnicos publiquen contenido. Un CMS headless («sin cabeza») solo gestiona el contenido: no pinta páginas, sino que las sirve mediante una API que devuelve JSON. Tu HTML es la «cabeza» que decide cómo mostrarlo.

  1. El editor crea contenido (un post, un servicio) en el panel del CMS: campos como título, texto e imagen.
  2. El CMS expone una API: una URL tipo /api/posts devuelve el contenido en JSON.
  3. Tu frontend lo consume: JavaScript obtiene ese JSON y lo vierte en tu marcado semántico.
  4. El navegador muestra la página final con tu diseño y estructura.
GET /api/posts → JSON
[
  {
    "titulo": "Abrimos nueva oficina",
    "fecha": "2026-08-10",
    "resumen": "Ya atendemos en el centro de Valencia."
  },
  {
    "titulo": "Nuevo servicio de auditoría",
    "fecha": "2026-07-28",
    "resumen": "Revisamos tu web contra WCAG AA."
  }
]
tu página lo convierte en HTML
<article>
  <h2>Abrimos nueva oficina</h2>
  <p>
    <time datetime="2026-08-10">10 ago 2026</time>
  </p>
  <p>Ya atendemos en el centro de Valencia.</p>
</article>

<!-- Cada campo JSON tiene su etiqueta semántica natural -->
CMS headless conocidos (concepto, sin entrar aún)
HerramientaTipoIdea clave
Strapi / DirectusOpen source, autoalojadoTú defines colecciones y campos
Contentful / SanitySaaS en la nubePanel editorial + API global
WordPress headlessCMS clásico sin tema visualSu API REST sirve el contenido
⚠️ Si JavaScript renderiza TODO el contenido tras cargar la página, Google puede tardar más en indexarlo (y sin JS no hay nada). Por eso existen los generadores estáticos: componen el HTML final en el servidor al publicar. Concepto que retomarás en el curso de JavaScript y en backend.
💡 Lo importante ahora es entender el mapa: contenido (CMS) ≠ presentación (tu HTML/CSS). Ese desacoplamiento es exactamente lo que practica cualquier equipo profesional.
Lección 3 · Proyecto

Proyecto final: sitio corporativo multiplana

Tu entrega final es el sitio corporativo completo de una empresa ficticia: mínimo cuatro páginas conectadas (portada, servicios, equipo y contacto), construidas con todo lo aprendido y auditadas con evidencias.

3.1 · Requisitos obligatorios

  • Estructura semántica completa en todas las páginas: landmarks, un h1, jerarquía limpia.
  • Accesibilidad AA: skip link, navegación total por teclado, contraste, formularios etiquetados.
  • SEO técnico: title/description únicos por página, canonical, Open Graph y JSON-LD de Organization o LocalBusiness.
  • Formulario funcional con validación nativa (el de contacto, nivel examen del Bloque 2).
  • Calidad demostrada: W3C sin errores y Lighthouse ≥ 90 en Accessibility y ≥ 95 en SEO.

3.2 · Plan de trabajo recomendado

  1. Día 1 — Arquitectura: sitemap, nombres de archivos y plantilla maestra con zonas marcadas.
  2. Día 2 — Páginas núcleo: portada y servicios con su head SEO completo desde el inicio.
  3. Día 3 — Equipo y contacto: galería accesible + formulario validado.
  4. Día 4 — Auditoría: W3C + Lighthouse en cada página; corrige y documenta el antes/después.
  5. Día 5 — Defensa: documento breve justificando tus decisiones técnicas.
Rúbrica de evaluación del proyecto
CriterioPesoSe evalúa con…
Semántica y accesibilidad35 %Lighthouse Accessibility + revisión manual de teclado y ARIA
SEO técnico25 %Lighthouse SEO + metadatos y JSON-LD presentes
Calidad del código20 %Validación W3C sin errores; consistencia entre páginas
Defensa técnica20 %Justificación razonada de decisiones (ver lección 4)
Lección 4 · Examen global

Examen global y defensa técnica

El cierre del curso HTML pone a prueba todo lo aprendido en los cuatro bloques (N1 → N5) con dos partes finales:

4.1 · El examen global

Un test que recorre los cuatro bloques a la vez: estructura básica, semántica, tablas y formularios, accesibilidad, SEO, HTML5 avanzado y calidad. Mismo formato que conoces: autoevaluable, mínimo 70 %, con reintentos ilimitados hasta dominarlo.

4.2 · La defensa técnica

Como en una entrevista técnica real, presentarás tu proyecto y responderás preguntas sobre él. Tu instructor/a evalúa que entiendas por qué, no solo cómo. Preguntas típicas:

«¿Por qué elegiste <article> aquí y <section> allí?»
«¿Qué harías si Lighthouse te marca contraste insuficiente?»
«Explica qué aporta tu JSON-LD y cómo lo validarías.»
«Si mañana el cliente gestiona el catálogo, ¿cómo encajaría un CMS headless?»
💡 Prepara un documento de 1–2 páginas con: decisiones tomadas, alternativas descartadas y evidencias (capturas W3C/Lighthouse). Es exactamente lo que pedirás y darás en entrevistas de trabajo reales.

Al superar examen + proyecto + defensa habrás demostrado un dominio completo de HTML. Enhorabuena por llegar hasta aquí 🎉.

Práctica guiada

✍️ Práctica del bloque: camino al reto integrador

Los ejercicios 1–5 construyen piezas de tu proyecto; el 6 es el reto final integrador que ensambla todo.

1 Arquitectura documental

Diseña la estructura de carpetas y archivos del sitio «Clínica Dental Sonrisa» (recuerda el ejercicio 5 del Bloque 3): cuatro páginas, recursos organizados y nombre coherente para cada cosa.

Ver solución
dental-sonrisa/
├── index.html          ← portada
├── servicios.html
├── equipo.html
├── contacto.html
├── _plantilla.html     ← maestra interna, no se publica
├── css/styles.css
├── js/main.js
└── img/
    ├── logo.png
    ├── og/             ← imágenes de Open Graph
    └── equipo/         ← fotos del staff

2 La plantilla maestra

Escribe el esqueleto de _plantilla.html: head SEO con zonas comentadas («TÍTULO», «DESCRIPCIÓN»), header + nav comunes, <main> vacío con comentario «CONTENIDO», footer y scripts. Debe bastar duplicar y sustituir.

Ver solución
<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <title><!-- TÍTULO --> | Dental Sonrisa</title>
  <meta name="description" content="<!-- DESCRIPCIÓN -->">
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>
  <a class="skip-link" href="#principal">Saltar al contenido</a>
  <header><!-- NAV COMÚN --></header>
  <main id="principal" tabindex="-1">
    <!-- CONTENIDO ÚNICO DE CADA PÁGINA -->
  </main>
  <footer><!-- PIE COMÚN --></footer>
  <script src="js/main.js"></script>
</body>
</html>

3 Del JSON al HTML semántico

La API del CMS devuelve este objeto. Escribe el fragmento HTML semántico que lo representaría dentro de una sección de noticias:

{
  "titulo": "Nuevo servicio de ortodoncia invisible",
  "fecha": "2026-06-02",
  "autor": "Dra. Elena Ferrer",
  "resumen": "Alineadores transparentes con seguimiento digital."
}
Ver solución
<article>
  <header>
    <h3>Nuevo servicio de ortodoncia invisible</h3>
    <p>
      <time datetime="2026-06-02">2 jun 2026</time>
      · Por <address>Dra. Elena Ferrer</address>
    </p>
  </header>
  <p>Alineadores transparentes con seguimiento digital.</p>
</article>

4 Head único para «Servicios»

Usando la plantilla del ejercicio 2, redacta el head completo de servicios.html: título con palabra clave local, description comercial, canonical y Open Graph con imagen propia og/servicios.png.

Ver solución
<title>Ortodoncia, implantes y estética dental en Valencia | Sonrisa</title>
<meta name="description"
      content="Descubre todos los tratamientos de Clínica Dental Sonrisa en
               Valencia: ortodoncia invisible, implantes y estética dental.">
<link rel="canonical" href="https://dentalsorrisa.es/servicios.html">
<meta property="og:title" content="Nuestros tratamientos · Dental Sonrisa">
<meta property="og:image" content="https://dentalsorrisa.es/img/og/servicios.png">
<meta property="og:type" content="website">

5 Datos estructurados de negocio local

JSON-LD @type: «Dentist» (negocio local) para la portada: nombre, dirección en Valencia, teléfono y horario de apertura de lunes a viernes 9–19.

Ver solución
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Dentist",
  "name": "Clínica Dental Sonrisa",
  "telephone": "+34 963 000 000",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "Calle Colón 12",
    "addressLocality": "Valencia",
    "addressCountry": "ES"
  },
  "openingHours": "Mo-Fr 09:00-19:00"
}
</script>

6 🔥 Reto final integrador: el proyecto completo

Construye el sitio entero siguiendo la lección 3: cuatro páginas desde tu plantilla, formulario de contacto nivel AA, JSON-LD de negocio, auditorías con capturas y el documento de defensa. Es la entrega que acompaña a la Parte B del examen global.

Ver plan de ejecución modelo
  1. Base: duplica la plantilla en las cuatro páginas y personaliza heads y contenidos.
  2. Componentes: galería de equipo accesible (figure + figcaption + alts) y formulario validado.
  3. SEO: canonical + OG por página y JSON-LD «Dentist» en la portada.
  4. Auditoría: W3C en las cuatro URLs y Lighthouse mobile en cada una; guarda informes.
  5. Entrega: carpeta del proyecto + PDF de evidencias + documento de defensa.
Prueba final

📝 Examen global del curso

Recorre los cuatro bloques. Mínimo 70 % + proyecto defendido según la Parte B. Reintentos ilimitados: el objetivo es dominarlo.

Parte A · Test global (aprueba con 9/12)

1 · El contenido exclusivo de la página vive en…
2 · El título descriptivo de una tabla se declara en…
3 · Un formulario que envía datos sensibles usa…
4 · Primera regla de ARIA
5 · Una imagen decorativa correcta lleva…
6 · Buen <title> para SEO
7 · La tarjeta al compartir en redes se controla con…
8 · Para dibujar en <canvas> hace falta…
9 · El validador oficial de HTML es el del…
10 · ¿Cuál NO es una categoría de Lighthouse?
11 · Con un CMS headless, tu HTML recibe el contenido vía…
12 · La etiqueta <template> sirve para…

Parte B · Proyecto final y defensa técnica

Autocorrige tu entrega con esta rúbrica. Mínimo para aprobar: 7 de 8 casillas. El laboratorio valida la página que pegues (usa la portada); las notas de Lighthouse y el documento de defensa (casillas 7 y 8) se marcan a mano.

Cumplidos: 0 / 8

🏆 ¡Curso de HTML completado! Si superaste las dos partes y defendiste tu proyecto, has demostrado dominio total del lenguaje. Dominas el que sostiene toda la web… y estás listo para darle estilo con el Curso de CSS.