Vamos a crear una pantalla de carga que parte con una imagen desenfocada y un texto de porcentaje que va de 0% a 100%. A medida que avanza la carga, el desenfoque disminuye y el texto se desvanece. Es un micro‑proyecto perfecto para practicar transformaciones lineales, filter: blur(), y animaciones con JavaScript sin dependencias.
1) ¿Qué es el efecto Blurry Loading?
Es un patrón de loading visual que “suaviza” la espera del usuario. En lugar de ver una pantalla vacía, mostramos una versión desenfocada del contenido de fondo y un contador que indica progreso. Al llegar a 100%, el fondo queda nítido y el contador desaparece.
Qué practicas con este proyecto:
Manipulación del DOM y setInterval / requestAnimationFrame.
Uso de filtros CSS (blur, brightness) y transiciones.
Mapeo de rangos (llevar un valor 0→100 a otro rango, p.ej. 30px→0px de blur y 1→0 de opacidad).
2) Demo mínima (copia y pega)
A continuación tienes una versión autosuficiente (un solo archivo). Puedes usar una imagen local (recomendado) o una URL pública ligera. Cambia background-image por la tuya.
Notas rápidas
Para evitar “bordes” feos con blur, aplicamos un ligero scale(1.05) sobre el fondo.
Con requestAnimationFrame obtienes una animación más suave y eficiente que con setInterval.
La función scale() te permite trasladar fácilmente el rango 0–100 del contador a cualquier otro rango (blur, opacidad, brillo, etc.).
2.1) Código por separado (HTML / CSS / JS)
Si prefieres tener los archivos individuales, usa esta estructura:
Index.html
Styles.css
app.js
3) Explicación paso a paso
Marcado: cuatro capas: bg (imagen), scrim (oscurecedor opcional), counter (porcentaje) y un hint.
Estilos:
El desenfoque inicia alto (blur(30px)) y lo reducimos a 0.
El texto empieza totalmente visible (opacity: 1) y se desvanece a 0.
Usamos clamp() para que el tamaño del contador sea fluido en móviles y escritorio.
Lógica:
Variable load avanza de 0→100 (un tick por cuadro con requestAnimationFrame).
Convertimos load a otros rangos: blur (30→0) y opacidad (1→0) con scale().
Al llegar a 100, podemos remover el contador o transicionar a la UI real.
4) Variantes útiles
Carga real: Si quieres que el número refleje progreso “real” (fetch de assets), conecta load a eventos de progreso (XHR, fetch con ReadableStreams, progress de <img>/<video> cuando sea viable) y avanza el valor según bytes descargados.
Brillo y saturación: además de blur, puedes animar filter: brightness() o saturate() para un efecto más cinematográfico.
Placeholder sólido: reemplaza la imagen por un degradado bonito y luego, al llegar a 100, intercambia por la imagen final (evita saltos bruscos si la imagen tarda).
Accesibilidad: añade aria-live="polite" al contador si necesitas anunciar progreso a lectores de pantalla. O bien, provee una alternativa textual fuera de pantalla.
5) Buenas prácticas de rendimiento
Usa imágenes optimizadas (WebP/AVIF, tamaño acorde al viewport).
Evita filter: blur() sobre elementos muy grandes en equipos de bajos recursos; considera reducir el blur inicial (p.ej., 20px en vez de 30px) si notas jank.
Mantén el número de capas y sombras al mínimo durante el loading.
6) Integración rápida en tu blog
Inserta el snippet anterior como bloque HTML en tu CMS.
Si necesitas aislar estilos, pon el demo en un <iframe>.
Cambia la fuente de la imagen a una local para evitar flash por CORS o latencias.
7) Checklist de depuración
¿No se ve el desenfoque? Verifica que no haya un backdrop-filter en vez de filter.
¿Ves bordes raros en los extremos? Mantén transform: scale(1.05).
¿Se “salta” el contador? Comprueba que tick() sólo se programe una vez al inicio.
8) Retos para practicar
Añade una barra de progreso radial o lineal sincronizada con load.
Aplica un fade extra del scrim de #0007 a #0000 conforme carga.
Reemplaza el contador por una palabra que cambie: “Cargando…”, “Casi listo…”, “¡Listo!”.
Implementa una API de progreso real (por ejemplo, precarga de varias imágenes).
9) Ejemplo
Finalmente tu implementación debería de quedar similar a esta
Blurry Loading