maximo galarza
intente hacerlo por mi mismo y fracase estrepitosamente
Juan David Reyes
X2 lo importante es aprender de los errores :3
Raycris Maldonado
RT hermano
Aprende a implementar loading skeletons en una aplicación web usando solo HTML y CSS, una técnica que mejora la percepción de velocidad y mantiene al usuario informado sobre qué contenido está por aparecer mientras carga la API.
Por qué usar loading skeletons en lugar de un spinner
Un rectángulo gris animado que imita la forma del contenido final comunica mucho más que un círculo girando. El usuario ya intuye qué va a aparecer en cada lugar y la espera se vuelve tolerable, no frustrante.
En una conexión rápida, el efecto apenas se percibe: un grisecito por una fracción de segundo. Pero al simular una conexión lenta desde las DevTools del navegador, los skeletons aparecen claramente con una animación suave de opacidad mientras el HTML se renderiza y la API responde.
¿Qué es un loading skeleton? Es un placeholder visual con la forma del contenido final, normalmente un rectángulo gris con animación sutil, que se muestra mientras los datos cargan desde una API.
Cómo se estructura el HTML para mostrar el estado de carga
La idea es dejar la estructura del contenedor lista, pero sin contenido real. Dentro de la sección Trending Preview Movie List se triplica un div con dos clases combinadas: movie-container y movie-container--loading. Aunque no haya imagen dentro, esa segunda clase activa la animación que emula la pieza de contenido por venir.
Lo mismo aplica para las categorías: se triplica el contenedor con category-container--loading y se comenta el h3 del título, porque aún no se conoce el nombre de la categoría. Solo queda un rectángulo animado.
Esta misma técnica se replica en tres zonas del proyecto [04:30]:
Cómo se construye la animación con CSS y keyframes
El CSS hace todo el trabajo visual. La clase movie-container--loading recibe un color de fondo gris claro definido por una variable, un border-radius de 8 píxeles y el mismo tamaño exacto que tendrán las imágenes finales: 225 por 150 píxeles. Mantener las dimensiones idénticas evita que el scroll salte cuando la información real reemplace al skeleton.
También se añade un margin-bottom para que los elementos no queden pegados, y se aplica una animación llamada loading-skeleton.
Qué hace exactamente el keyframe de la animación
El @keyframes es minimalista pero efectivo [07:45]:
Esto crea un parpadeo suave que dura un segundo en bucle. No es divertido, pero comunica que algo está pasando y que la app no se quedó congelada.
¿Para qué sirve animation-delay en los skeletons? Sirve para que los elementos no parpadeen al mismo tiempo. Aplicando un retraso al segundo y tercer contenedor, se crea una sensación de carga progresiva más natural.
Cómo se diferencian las animaciones por sección
El category-container--loading usa la misma lógica con un tamaño distinto. Aquí los delays se reparten distinto: todos los de la columna izquierda parpadean a la vez y los de la derecha un instante después. Cargar uno por uno se veía raro en piezas pequeñas, mientras que en las películas grandes el efecto secuencial sí funciona.
Cómo desaparecen los skeletons cuando llega la información
Esta parte no requirió tocar JavaScript, y ahí está lo elegante de la solución. La función createMovies ya estaba escrita para limpiar el contenedor antes de inyectar las películas reales. Esto se hace con container.innerHTML = '', que vacía el HTML inicial, incluyendo los divs con la clase --loading.
El flujo queda así:
navigation.js.createMovies o createCategories limpia el contenedor.La misma lógica funciona para películas similares, que vienen de un endpoint distinto, y para todas las vistas de la aplicación. Un solo patrón, replicado consistentemente.
Buenas prácticas que cumple esta solución
La propuesta es sencilla, pero cumple con varios principios de UX y rendimiento que vale la pena destacar:
La próxima optimización va por otro lado: dejar de cargar todas las imágenes apenas entras a la app y cargar solo las que el usuario alcanza a ver, aplicando lazy loading con scroll. Cuéntame en los comentarios qué estrategia usaste tú para resolver tus pantallas de carga.
maximo galarza
intente hacerlo por mi mismo y fracase estrepitosamente
Juan David Reyes
X2 lo importante es aprender de los errores :3
Raycris Maldonado
RT hermano
Creo que más allá de elegir entre usar loading skeletons y loadinf spinners, cada tipo de laoding screens tiene su forma más común de usarse, he visto mucho que como dice el profe los loading skeletons se usan muchos cuando cargamos grillas con muchos elementos con imágenes, vídeos o tarjetas de información, en cambio los loadings spinners se usan mucho cuando queremos cargar un sólo componente con gran información. Por ejemplo. . . Loading skeletons: grilla de card de vídeos en youtube
Ricardo Andres Ojeda Silva
Quisiera mencionar también que, según lo que he leído, las investigaciones recientes sobre UX indican que cuando se utilizan loading skeletons la percepción del usuario es que el producto carga "más rápido"
Jorge Garcia
siento que me complico demasiado... jajaj yo queriendo agregar todo con JS y el profe solo añadio mas html al index..
mi solucion era dinamicamente añadir el skeleton a lo que genera y con un setimeout quitar la propiedad css
Julian Franco
la solución que habia pensado era a la clase de moviecontainer agregarle en el CSS esto:
Junto con replicar el HTML
.loading-skelenton{ border-radius: 8px; background-color: var(--grey); animation: skelenton; animation-duration: 3s; animation-iteration-count: infinite; } @keyframes skelenton{ 0%{ background-color: var(--grey); } 50%{ background-color: var(--light-grey); } 100%{ background-color: var(--grey); } }``` Pero la del profe obviamente es mucho más optima ! jeje
Natalia Gallego Heras
Tengo que decir que no mereció la pena porque tardaba casi lo mismo en cargar mi imagen que en volver con la respuesta del API, pero lo que yo intenté fue esto:
Marcelo Jorge Bellizia
En las devtools, en la ruedita de settings, se van abajo de todo, tienen la opción de disable javascript, para no tener que estar recargando en el caso de que estén creando la animación
Johan Arena
Lo hice!! jsjsj fue mas fácil de lo que creí :3
Ricardo Daniel Baró Soto
hola podrian ayudarme con esto, me pasa lo mismo y no se como solucionarlo.
César Augusto Cortés Labrada
Estoy tratando de resolver el problema del minuto 8:35, cuando se recarga la página en la vista de detalles, por un instante deja ver la vista del home en modo pantalla de carga y luego pasa a mostrar la vista de detalles de película en modo pantalla de carga que es el objetivo en ese momento. La cosa es que alguien podría notar que al recargar aparecen cosas que no son de esa vista en un instante. Al momento he fallado en cada cosa que intento, como ponerle un display none a las secciones del home cuando estoy en otra vista antes de recibir el evento DOMContentLoaded.
Patricia Julliete Rangel Mujica
Me pasa lo mismo. Ya lo solucionaste?
Christian Velázquez
Honestamente, creo que, es una forma "sutil" de aplicar la carga. Pude ver otras formas ( otros tutoriales), y no son muy sutiles. Sin embrago, lo bueno del código, es que existen varias formas de hacerlo.
Julian Franco
Total yo me puse a averiguar e intente agregarlo con JS incluso jaja luego vi este video y mi frustracion fue como, It's easy !! y yo dure media tarde :C
Christian Velázquez
Voy a dejar uno con CSS ( https://www.youtube.com/watch?v=AZnOA3b1u0o )
Ulqernesh Karvenae
Lisbeth Quintero
Aquì mi intento:
Victor Hugo Cruz Carballo
Julian Franco
Yo lo pense diferente y use muchos backgrounds, creo que me falta más creatividad pero que CAPO es este profe !!
Valentina Llorente Hernández
Lo intente pero no progrese u.U
Dario Paladines
Tengo dos dudas y es que no se si haya una forma de "controlar" que archivos se carguen primero es decir si quiero que cargue primero determinado html, css (en caso de tener varios). Y la otra duda es que si dentro de un archivo hay igualmente una forma de controlar que se cargue algo primero, ya que en mi app al momento de cargar la pagina de la película, antes de eso se carga otras secciones (categories, tendencias), y después se carga la página que corresponde
Juan Castro
Profesor¡Sí que hay forma! Eso es justo lo que aprendemos en el Curso de Optimización Web: https://platzi.com/cursos/web-performance/. :wink:
Cristian Mauricio Cavanzo Arias
Yo cree lo siguiente en el css lo siguiente
.skeleton { background-color: var(--purple-light-2); animation: loading 1.5s infinite; } @keyframes loading { 0% { background-color: var(--purple-light-1); } 50% { background-color: var(--purple-light-2); } 100% { background-color: var(--purple-light-1); } } ```const movieImgExtra = document.createElement('div');movieImgExtra.classList.add('movie-img', 'skeleton');const categoryTitleExtra = document.createElement('h3');categoryTitleExtra.classList.add('category-title');loadingSkeeleton(trendingMoviesPreviewList, 'movie-container', movieImgExtra);loadingSkeeleton( categoriesPreviewList, 'category-container', categoryTitleExtra); y en el js  ```js const movieImgExtra = document.createElement('div'); movieImgExtra.classList.add('movie-img', 'skeleton'); const categoryTitleExtra = document.createElement('h3'); categoryTitleExtra.classList.add('category-title'); loadingSkeeleton(trendingMoviesPreviewList, 'movie-container', movieImgExtra); loadingSkeeleton( categoriesPreviewList, 'category-container', categoryTitleExtra ); ```asi sera dinamico 
Ricardo Alfonso Chavez Vilcapoma
Sin querer queriendo uno se vuelve así 🙄😜