1 · Navbar fluida con “scroll hide”
Objetivo: Grid, clamp()
y JS ligero.
- Crea
navbar.html
. - Diseña una barra de navegación con logo, enlaces y botón hamburguesa; el alto debe calcularse con
clamp()
. - Ocúltala al hacer scroll hacia abajo y muéstrala al volver a subir (JS con
scrollY
). - Debe funcionar sin JS si se desactiva: la barra permanece fija arriba.
- Añade transición suave y conserva el foco accesible en todos los controles.
2 · Galería de productos con “scroll‑snap” y miniaturas sincronizadas
Objetivo: scroll-snap
, atributos aria-selected
y eventos click
.
- Crea
galeria.html
con un carrusel horizontal de imágenes grandes. - Debajo, coloca miniaturas; al pulsar una miniatura, el carrusel debe desplazarse hasta la imagen correspondiente.
- Usa
scroll-snap-align: center;
para centrar cada imagen. - Marca la miniatura activa con
aria-selected="true"
. - Implementa teclas ←/→ para avanzar sin ratón.
3 · Web Component “x‑alert” personalizable
Objetivo: Custom Elements, Shadow DOM y atributos observados.
- Crea
x-alert.js
que defina un elemento<x-alert>
con estilo interno (Shadow DOM cerrado). - Acepta atributos
type="info|warning|error"
ydismissable
. - Si
dismissable
, muestra un botón “×” que borre el elemento con animación. - Expone un método
.flash(ms)
que lo muestre y oculte trasms
milisegundos. - Usa el componente en
alerts.html
con tres ejemplos distintos.
4 · Visor CSV en tabla sortable
Objetivo: fetch
, parseo de texto y ordenación de columnas.
- Crea
csv‑viewer.html
. - El usuario debe poder elegir un fichero
.csv
local (input file). - Muestra los datos en una tabla; la primera fila es encabezado.
- Al pulsar cualquier
th
, la tabla se ordena asc/desc, detectando números y fechas. - Añade contador de filas visibles y barra de búsqueda que filtre por texto.
5 · PWA “notas rápidas”
Objetivo: manifest, Service Worker y IndexedDB.
- Crea
notas/
conindex.html
,app.js
,sw.js
ymanifest.webmanifest
. - La app permite crear, editar y borrar notas cortas; almacena los datos en IndexedDB.
- Instálala como PWA (botón “Agregar a inicio”) y muestra iconos a 192 y 512 px.
- Implementa caché “offline first” para los recursos estáticos.
- Al volver online, sincroniza notas pendientes y muestra notificación.
6 · Tabla responsive que colapsa a “cards”
Objetivo: media queries, pseudo‑elementos y atributos data-label
.
- Crea
tabla-card.html
con una tabla de pedidos (5‑7 filas). - Por encima de 640 px se ve como tabla normal.
- Por debajo, cada fila debe mostrarse como “card” apilada; los títulos de columna se generan con
::before
leyendodata-label
. - Mantén orden semántico para lectores de pantalla.
- Sombrea las filas impares con CSS variable que el usuario pueda cambiar.
7 · Pestañas ARIA solo con radio buttons
Objetivo: accesibilidad, :focus-visible
y animación fade
.
- Crea
pestanas.html
con 3 pestañas (Descripción, Especificaciones, Opiniones). - Usa un grupo de radios ocultos y etiquetas
label
como disparadores. - Cada panel debe tener
role="tabpanel"
yaria-labelledby
. - El panel activo se muestra con opacidad 1 y los demás se ocultan con
opacity:0
, transicionando .3 s. - Asegura navegación con Tab y flechas ←/→.
8 · Imagen “lazy‑load” con IntersectionObserver y efecto blur + fade‑in
Objetivo: rendimiento y transición accesible.
- Crea
lazy.html
con 6 imágenes de alta resolución que se carguen sólo al entrar en viewport. - Muestra primero una versión tiny (32 px) muy borrosa; reemplázala por la grande cuando cargue.
- Añade transición
filter: blur(20px) → blur(0)
yopacity
en .5 s. - Si JS está desactivado, las imágenes deben seguir cargando (fallback
<img>
normal). - Registra en consola el porcentaje de imágenes cargadas.
📝 Consejos para resolver
- Analiza cada requisito y planifica el orden de construcción (HTML → CSS → JS).
- Usa commits frecuentes describiendo lo implementado.
- Testea en móvil y con herramientas de accesibilidad (lupa, contraste, lector de pantalla).
- Publica tu solución en un repo; si necesitas revisión, pásame el enlace y te doy feedback.
