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/
servicios.html, no «Servi cios.HTML».img/equipo/maria.jpg.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:
- Copia disciplinada: mantén una página maestra (
_plantilla.html) y duplica. Es lo que harás en este curso. - Includes por JavaScript: un
main.jsinyecta header/footer comunes en un contenedor. Funciona, pero depende de JS. - 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:
<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>
<!-- TÍTULO ÚNICO DE PÁGINA -->, <!-- CONTENIDO -->.
Duplicar y sustituir se vuelve mecánico y sin olvidos.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.
- El editor crea contenido (un post, un servicio) en el panel del CMS: campos como título, texto e imagen.
- El CMS expone una API: una URL tipo
/api/postsdevuelve el contenido en JSON. - Tu frontend lo consume: JavaScript obtiene ese JSON y lo vierte en tu marcado semántico.
- El navegador muestra la página final con tu diseño y estructura.
[
{
"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."
}
]
<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 -->
| Herramienta | Tipo | Idea clave |
|---|---|---|
| Strapi / Directus | Open source, autoalojado | Tú defines colecciones y campos |
| Contentful / Sanity | SaaS en la nube | Panel editorial + API global |
| WordPress headless | CMS clásico sin tema visual | Su API REST sirve el contenido |
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
- Día 1 — Arquitectura: sitemap, nombres de archivos y plantilla maestra con zonas marcadas.
- Día 2 — Páginas núcleo: portada y servicios con su head SEO completo desde el inicio.
- Día 3 — Equipo y contacto: galería accesible + formulario validado.
- Día 4 — Auditoría: W3C + Lighthouse en cada página; corrige y documenta el antes/después.
- Día 5 — Defensa: documento breve justificando tus decisiones técnicas.
| Criterio | Peso | Se evalúa con… |
|---|---|---|
| Semántica y accesibilidad | 35 % | Lighthouse Accessibility + revisión manual de teclado y ARIA |
| SEO técnico | 25 % | Lighthouse SEO + metadatos y JSON-LD presentes |
| Calidad del código | 20 % | Validación W3C sin errores; consistencia entre páginas |
| Defensa técnica | 20 % | Justificación razonada de decisiones (ver lección 4) |
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:
Al superar examen + proyecto + defensa habrás demostrado un dominio completo de HTML. Enhorabuena por llegar hasta aquí 🎉.
✍️ 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
- Base: duplica la plantilla en las cuatro páginas y personaliza heads y contenidos.
- Componentes: galería de equipo accesible (figure + figcaption + alts) y formulario validado.
- SEO: canonical + OG por página y JSON-LD «Dentist» en la portada.
- Auditoría: W3C en las cuatro URLs y Lighthouse mobile en cada una; guarda informes.
- Entrega: carpeta del proyecto + PDF de evidencias + documento de defensa.
📝 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 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