| 1234567891011121314151617181920212223242526272829303132333435363738394041 |
- const observerOptions = {
- root: null, // Observa en relación al viewport
- threshold: 0,
- rootMargin: "0px 0px 150px 0px"
- };
- /**
- * Callback que se ejecuta cuando un elemento observado entra
- * o sale del área de observación.
- */
- const lazyLoadCallback = (entries, observer) => {
- entries.forEach(entry => {
- // Comprueba si el elemento está ahora visible (o a punto de estarlo)
- if (entry.isIntersecting) {
- const element = entry.target;
- const imageElement = document.createElement('img');
- const imageUrl = element.dataset.src;
- if (imageUrl) {
- imageElement.onload = () => {
- // Asigna la imagen de fondo. Aquí es donde el navegador la descarga.
- element.style.backgroundImage = `url('${imageUrl}')`;
- }
- imageElement.onerror = () => {
- element.style.backgroundImage = `url('/express/assets/no_image.png')`;
- };
- // (Opcional) Añade una clase para animar la aparición
- element.classList.add('bg-loaded');
- imageElement.src = imageUrl;
- observer.unobserve(element);
- }
- }
-
- });
- };
- // Crea la instancia del observer
- export const imageObserver = new IntersectionObserver(lazyLoadCallback, observerOptions);
|