diff --git a/src/lg-utils.ts b/src/lg-utils.ts index e8402dc9..ccedbcf7 100644 --- a/src/lg-utils.ts +++ b/src/lg-utils.ts @@ -579,7 +579,6 @@ const utils = { dynamicEl.alt = alt || title || ''; dynamicElements.push(dynamicEl); }); - console.log(dynamicElements, 'dynamicElements'); return dynamicElements; }, isMobile(): boolean { diff --git a/src/plugins/thumbnail/lg-thumbnail-settings.ts b/src/plugins/thumbnail/lg-thumbnail-settings.ts index 3255b372..85f4f160 100644 --- a/src/plugins/thumbnail/lg-thumbnail-settings.ts +++ b/src/plugins/thumbnail/lg-thumbnail-settings.ts @@ -84,6 +84,11 @@ export interface ThumbnailsSettings { * Custom translation strings for aria-labels */ thumbnailPluginStrings: ThumbnailStrings; + + /** + * Enables thumbnail lazy loading when in view + */ + thumbnailLazyLoad: boolean; } export const thumbnailsSettings: ThumbnailsSettings = { @@ -107,6 +112,8 @@ export const thumbnailsSettings: ThumbnailsSettings = { loadYouTubeThumbnail: true, youTubeThumbSize: 1, + thumbnailLazyLoad: false, + thumbnailPluginStrings: { toggleThumbnails: 'Toggle thumbnails', } as ThumbnailStrings, diff --git a/src/plugins/thumbnail/lg-thumbnail.ts b/src/plugins/thumbnail/lg-thumbnail.ts index e34611f0..f06a43d4 100644 --- a/src/plugins/thumbnail/lg-thumbnail.ts +++ b/src/plugins/thumbnail/lg-thumbnail.ts @@ -31,10 +31,23 @@ export default class Thumbnail { private thumbClickable = false; private settings!: ThumbnailsSettings; private $LG!: LgQuery; + + private observer: IntersectionObserver; + constructor(instance: LightGallery, $LG: LgQuery) { // get lightGallery core plugin instance this.core = instance; this.$LG = $LG; + this.observer = new IntersectionObserver(function (entries, observer) { + entries.forEach(function (entry) { + if (entry.isIntersecting) { + const lazyImage = entry.target; + lazyImage.src = lazyImage.dataset.src; + lazyImage.classList.remove("lg-lazy-thumb"); + observer.unobserve(lazyImage); + } + }); + }); return this; } @@ -435,7 +448,16 @@ export default class Thumbnail { const img = document.createElement('img'); img.alt = alt || ''; img.setAttribute('data-lg-item-id', index + ''); - img.src = thumbImg; + + if (this.settings.thumbnailLazyLoad) { + let placeholder = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"; + img.className = "lg-lazy-thumb"; + img.setAttribute('data-src', thumbImg); + img.src = placeholder; + } else { + img.src = thumbImg; + } + div.appendChild(img); return div; } @@ -444,6 +466,13 @@ export default class Thumbnail { for (let i = 0; i < items.length; i++) { const thumb = this.getThumbHtml(items[i].thumb, i, items[i].alt); this.$lgThumb.append(thumb); + + if (this.settings.thumbnailLazyLoad) { + const thumbImg = thumb.querySelector('img.lg-lazy-thumb'); + if (thumbImg != null) { + this.observer.observe(thumbImg); + } + } } }