observer.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. const observerOptions = {
  2. root: null, // Observa en relación al viewport
  3. threshold: 0,
  4. rootMargin: "0px 0px 150px 0px"
  5. };
  6. /**
  7. * Callback que se ejecuta cuando un elemento observado entra
  8. * o sale del área de observación.
  9. */
  10. const lazyLoadCallback = (entries, observer) => {
  11. entries.forEach(entry => {
  12. // Comprueba si el elemento está ahora visible (o a punto de estarlo)
  13. if (entry.isIntersecting) {
  14. const element = entry.target;
  15. const imageElement = document.createElement('img');
  16. const imageUrl = element.dataset.src;
  17. if (imageUrl) {
  18. imageElement.onload = () => {
  19. // Asigna la imagen de fondo. Aquí es donde el navegador la descarga.
  20. element.style.backgroundImage = `url('${imageUrl}')`;
  21. }
  22. imageElement.onerror = () => {
  23. element.style.backgroundImage = `url('/express/assets/no_image.png')`;
  24. };
  25. // (Opcional) Añade una clase para animar la aparición
  26. element.classList.add('bg-loaded');
  27. imageElement.src = imageUrl;
  28. observer.unobserve(element);
  29. }
  30. }
  31. });
  32. };
  33. // Crea la instancia del observer
  34. export const imageObserver = new IntersectionObserver(lazyLoadCallback, observerOptions);