process-lazy-preloader.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. export const processLazyPreloader = (swiper, imageEl) => {
  2. if (!swiper || swiper.destroyed || !swiper.params) return;
  3. const slideSelector = () => swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;
  4. const slideEl = imageEl.closest(slideSelector());
  5. if (slideEl) {
  6. const lazyEl = slideEl.querySelector(`.${swiper.params.lazyPreloaderClass}`);
  7. if (lazyEl) lazyEl.remove();
  8. }
  9. };
  10. const unlazy = (swiper, index) => {
  11. if (!swiper.slides[index]) return;
  12. const imageEl = swiper.slides[index].querySelector('[loading="lazy"]');
  13. if (imageEl) imageEl.removeAttribute('loading');
  14. };
  15. export const preload = swiper => {
  16. if (!swiper || swiper.destroyed || !swiper.params) return;
  17. let amount = swiper.params.lazyPreloadPrevNext;
  18. const len = swiper.slides.length;
  19. if (!len || !amount || amount < 0) return;
  20. amount = Math.min(amount, len);
  21. const slidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(swiper.params.slidesPerView);
  22. const activeIndex = swiper.activeIndex;
  23. if (swiper.params.grid && swiper.params.grid.rows > 1) {
  24. const activeColumn = activeIndex;
  25. const preloadColumns = [activeColumn - amount];
  26. preloadColumns.push(...Array.from({
  27. length: amount
  28. }).map((_, i) => {
  29. return activeColumn + slidesPerView + i;
  30. }));
  31. swiper.slides.forEach((slideEl, i) => {
  32. if (preloadColumns.includes(slideEl.column)) unlazy(swiper, i);
  33. });
  34. return;
  35. }
  36. const slideIndexLastInView = activeIndex + slidesPerView - 1;
  37. if (swiper.params.rewind || swiper.params.loop) {
  38. for (let i = activeIndex - amount; i <= slideIndexLastInView + amount; i += 1) {
  39. const realIndex = (i % len + len) % len;
  40. if (realIndex < activeIndex || realIndex > slideIndexLastInView) unlazy(swiper, realIndex);
  41. }
  42. } else {
  43. for (let i = Math.max(activeIndex - amount, 0); i <= Math.min(slideIndexLastInView + amount, len - 1); i += 1) {
  44. if (i !== activeIndex && (i > slideIndexLastInView || i < activeIndex)) {
  45. unlazy(swiper, i);
  46. }
  47. }
  48. }
  49. };