Vivimos en la época de la inmediatez, queremos tenerlo todo aquí, ahora y ya, si es posible. Y, por supuesto, esto se refleja directamente en nuestra forma de relacionarnos con las aplicaciones.
Los usuarios odiamos esperar, eso es algo que todos sabemos. ¿Cuántas veces te has salido de una página cuando tardaba demasiado en cargar?
De hecho, un estudio realizado por Google nos da una idea aproximada del tiempo que un usuario está dispuesto a esperar en una pantalla de carga:
Como podemos ver, ¡el 32% de los usuarios abandona la página cuando la web tarda entre 1 y 3 segundos!
Así que aquí es donde nosotros, los desarrolladores, entramos en juego.
Hay cosas que no podemos cambiar, como el tiempo que tarda nuestra página en hacer fetch a la API que nos proporciona la información que se cargará en la web. Pero hay técnicas que podemos utilizar para agilizar los tiempos de carga o, en su defecto, hacer más ameno el tiempo de carga.
Aquí es donde aparecen los Loading Skeletons (Esqueletos de carga). Probablemente hayas visto esto en muchos sitios, pero es posible que nunca les hayas prestado atención.
Si te fijas, hay elementos grises que simulan el contenido que debería aparecer cuando la página carga.
A estos elementos se les llama Skeleton Loader, y se utilizan para mostrar contenido en la página mientras los datos se cargan, evitando así tener una página en blanco mientras se cargan los datos. Esto brinda una sensación de tranquilidad al usuario, indicándole que el contenido está casi terminado de cargar.
Para ello, vamos a utilizar como ejemplo una aplicación que estoy construyendo. Es una web que se conecta a la API de IMDB para cargar las portadas de películas, como si se tratara de una web de streaming como Netflix o HBO.
Veamos un ejemplo de cada caso:
Como podemos ver, al usar los Skeletons, la espera se vuelve más amena, no solo porque la web no se ve vacía, sino también porque con los efectos de movimiento con CSS, el usuario entiende que la información está cargando y que la página no se ha quedado "pillada”
Para hacer esto, implementaremos la siguiente lógica:
Halconearemos los skeletons en los contenedores donde cargaremos la información, como las portadas de las películas.
<article class="trendingPreview-movieList">
<div class="movie-container movie-container--loading "></div>
<div class="movie-container movie-container--loading "></div>
<div class="movie-container movie-container--loading "></div>
<!--<div class="movie-container">
<img
src="https://image.tmdb.org/t/p/w300/adOzdWS35KAo21r9R4BuFCkLer6.jpg"
class="movie-img"
alt="Nombre de la película"
/>
</div>
<div class="movie-container">
<img
src="https://image.tmdb.org/t/p/w300/adOzdWS35KAo21r9R4BuFCkLer6.jpg"
class="movie-img"
alt="Nombre de la película"
/>
</div>-->
</article>
Les aplicaremos una clase con una animación CSS para que los skeletons se muevan, dando así un efecto un poco más dinámico.
.movie-container--loading {
background: var(--grey);
border-radius: 8px;
height: 225px;
min-height: 225px;
max-height: 225px;
width: 15px;
min-width: 150px;
max-width: 150px;
margin-bottom: 15px;
animation: loading-skeleton infinite 1.5s
}
/* Animation */
@keyframes loading-skeleton {
0%, 100% {
opacity: 100%;
}
50% {
opacity: 0%;
}
}
Cuando cargue el contenido, sobrescribiremos los skeletons con la información que realmente queremos mostrar, es decir, las portadas de las películas en este caso.
function createMovies(movies, container) {
container.innerHTML = '' // <-- Borraremos el contenido del contenedor que enviemos como parámetro
movies.forEach(movie => {
const movieContainer = document.createElement('div');
movieContainer.classList.add('movie-container')
movieContainer.addEventListener("click",() => {
location.hash = "#movie=" + movie.id
})
const movieImg = document.createElement('img')
movieImg.classList.add('movie-img')
movieImg.alt = movie.title
movieImg.src = 'https://image.tmdb.org/t/p/w300' + movie.poster_path
movieContainer.appendChild(movieImg);
container.appendChild(movieContainer);
});
}
I am particularly drawn to developing applications that are not only functional but also visually appealing and easy to use. I accomplish this by implementing SOLID principles and clean architecture, and applying testing to ensure quality.