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.htmlcon 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.jsque 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 trasmsmilisegundos. - Usa el componente en
alerts.htmlcon 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
.csvlocal (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.jsymanifest.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.htmlcon 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
::beforeleyendodata-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.htmlcon 3 pestañas (Descripción, Especificaciones, Opiniones). - Usa un grupo de radios ocultos y etiquetas
labelcomo 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.htmlcon 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)yopacityen .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.
