DEV Community

Cómo crear un Loader Esqueleto con CSS y mejorar la UX de tu app

Vale, al lío.
Si estás currando en algo de frontend y quieres darle un toque más molón a tu web o app, los "loaders esqueleto" son la caña.
Vamos, mucho mejor que los típicos spinners que no dicen nada.
Estos loaders hacen que parezca que algo se está cargando ya, y encima quedan bien pro.

Aquí te voy a enseñar a montarte uno fácilmente con HTML y CSS.
Nada de librerías ni historias raras, puro "a pelo".


🔬 El Resultado Final

Antes de darte la chapa, aquí tienes lo que vamos a hacer:

Image description

Básicamente, es una tarjeta que parece que se está cargando.
Una imagen, un título y un poco de texto falso.
Pero oye, queda de lujo.


🔎 Por qué molan los Loaders Esqueleto

  • Parece más rápido: Al usuario le das algo que ver mientras espera. Mucho mejor que dejarle mirando un spinner aburrido.
  • Quedan más currados: Das una idea de lo que está viniendo, así no piensan que tu app se ha roto.
  • Son fáciles de hacer: Te lo montas con CSS puro y tirando millas.

✍️ Venga, manos a la obra

Vamos a hacer un loader que imite una tarjeta con una imagen, un título y un poco de texto.

1. HTML Base

Primero monta esta estructura en un archivo HTML:

<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Skeleton Loader</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <div class="card">
    <div class="skeleton image"></div>
    <div class="skeleton title"></div>
    <div class="skeleton text"></div>
  </div>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

2. CSS para el Loader

Ahora crea un archivo styles.css y mete este CSS:

/* Estilos básicos */
body {
  font-family: Arial, sans-serif;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  margin: 0;
  background-color: #f4f4f4;
}

.card {
  width: 300px;
  padding: 20px;
  border-radius: 8px;
  background-color: #fff;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

/* Skeleton loader */
.skeleton {
  background-color: #e0e0e0;
  border-radius: 4px;
  position: relative;
  overflow: hidden;
}

.skeleton::before {
  content: '';
  display: block;
  position: absolute;
  top: 0;
  left: -100%;
  width: 100%;
  height: 100%;
  background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.4) 50%, rgba(255, 255, 255, 0) 100%);
  animation: shimmer 1.5s infinite;
}

/* Animación del brillo */
@keyframes shimmer {
  0% {
    left: -100%;
  }
  100% {
    left: 100%;
  }
}

/* Variantes del skeleton */
.skeleton.image {
  width: 100%;
  height: 150px;
  margin-bottom: 16px;
}

.skeleton.title {
  width: 70%;
  height: 20px;
  margin-bottom: 12px;
}

.skeleton.text {
  width: 100%;
  height: 14px;
  margin-bottom: 8px;
}
Enter fullscreen mode Exit fullscreen mode

3. Qué hace este CSS

  1. Color y bordes: Usamos un gris claro (#e0e0e0) y bordes redondeados para que parezca algo real.
  2. Brillo molón: La magia está en el linear-gradient que se mueve de lado a lado con la animación shimmer.
  3. Tamaños realistas: Hacemos que cada parte (imagen, título, texto) tenga proporciones similares a las de un contenido real.

⚖️ Extra: Cargar contenido real

Si quieres que después del loader salga el contenido real, mete este script al final del HTML:

<script>
  setTimeout(() => {
    document.querySelector('.card').innerHTML = `
      <img src="https://via.placeholder.com/300x150" alt="Imagen de ejemplo">
      <h3>Título del contenido</h3>
      <p>Este es un texto de ejemplo para la tarjeta.</p>
    `;
  }, 3000); // Simula que tarda 3 segundos en cargar
</script>
Enter fullscreen mode Exit fullscreen mode

Con esto, después de 3 segundos (simulado, claro), el loader desaparece y aparece el contenido real.


📊 Conclusión

Y ya estaría.
Los loaders esqueleto son una manera fácil y elegante de hacer que tu app parezca más rápida y más profesional.
Además, te los montas con cuatro líneas de CSS, así que no hay excusa.

Pruébalo en tus proyectos, y si te mola o tienes alguna duda, cuéntamelo en los comentarios.
¡Nos vemos!

Top comments (0)