Skip to content

Commit 6d08635

Browse files
feat: lazyPreloadPrevNext option to preload prev/next images
1 parent 8f4f07b commit 6d08635

File tree

8 files changed

+45
-1
lines changed

8 files changed

+45
-1
lines changed

src/components-shared/params-list.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ const paramsList = [
8383
'slidePrevClass',
8484
'wrapperClass',
8585
'lazyPreloaderClass',
86+
'lazyPreloadPrevNext',
8687
'runCallbacksOnInit',
8788
'observer',
8889
'observeParents',

src/core/core.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import checkOverflow from './check-overflow/index.js';
3030

3131
import defaults from './defaults.js';
3232
import moduleExtendParams from './moduleExtendParams.js';
33-
import { processLazyPreloader } from '../shared/process-lazy-preloader.js';
33+
import { processLazyPreloader, preload } from '../shared/process-lazy-preloader.js';
3434

3535
const prototypes = {
3636
eventsEmitter,
@@ -581,6 +581,7 @@ class Swiper {
581581
});
582582
}
583583
});
584+
preload(swiper);
584585

585586
// Init Flag
586587
swiper.initialized = true;

src/core/defaults.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ export default {
127127
slidePrevClass: 'swiper-slide-prev',
128128
wrapperClass: 'swiper-wrapper',
129129
lazyPreloaderClass: 'swiper-lazy-preloader',
130+
lazyPreloadPrevNext: 0,
130131

131132
// Callbacks
132133
runCallbacksOnInit: true,

src/core/update/updateActiveIndex.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import preload from '../../shared/process-lazy-preloader.js';
2+
13
export function getActiveIndexByTranslate(swiper) {
24
const { slidesGrid, params } = swiper;
35
const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
@@ -84,6 +86,9 @@ export default function updateActiveIndex(newActiveIndex) {
8486
previousIndex,
8587
activeIndex,
8688
});
89+
90+
preload(swiper);
91+
8792
swiper.emit('activeIndexChange');
8893
swiper.emit('snapIndexChange');
8994
if (previousRealIndex !== realIndex) {

src/shared/process-lazy-preloader.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,27 @@ export const processLazyPreloader = (swiper, imageEl) => {
77
if (lazyEl) lazyEl.remove();
88
}
99
};
10+
11+
const unlazy = (swiper, index) => {
12+
const imageEl = swiper.slides[i].querySelector('loading="lazy"');
13+
if (imageEl) imageEl.removeAttribute('loading');
14+
};
15+
16+
export const preload = (swiper) => {
17+
if (!swiper || swiper.destroyed || !swiper.params) return;
18+
var amount = swiper.params.lazyPreloadPrevNext;
19+
const len = swiper.slides.length;
20+
if (!len || !amount || amount < 0) return;
21+
amount = Math.min(amount, len);
22+
const active = swiper.activeSlide;
23+
if (swiper.params.rewind) {
24+
for (var i = active - amount; i <= active + amount; i++) {
25+
const reali = ((i % len) + len) % len;
26+
if (reali != active) unlazy(swiper, reali);
27+
}
28+
} else {
29+
for (var i = Math.max(active - amount, 0); i <= Math.min(active + amount, len - 1); i++) {
30+
if (i != active) unlazy(swiper, i);
31+
}
32+
}
33+
};

src/types/swiper-options.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -820,6 +820,13 @@ export interface SwiperOptions {
820820
*/
821821
lazyPreloaderClass?: string;
822822

823+
/**
824+
* Number of next and previous slides to preload. Only applicable if using lazy loading.
825+
*
826+
* @default 0
827+
*/
828+
lazyPreloadPrevNext?: number;
829+
823830
/**
824831
* Object with a11y parameters or boolean `true` to enable with default settings.
825832
*

src/vue/swiper-vue.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,10 @@ declare const Swiper: DefineComponent<
318318
type: StringConstructor;
319319
default: undefined;
320320
};
321+
lazyPreloadPrevNext: {
322+
type: NumberConstructor;
323+
default: undefined;
324+
};
321325
runCallbacksOnInit: {
322326
type: BooleanConstructor;
323327
default: undefined;

src/vue/swiper.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ const Swiper = {
106106
slidePrevClass: { type: String, default: undefined },
107107
wrapperClass: { type: String, default: undefined },
108108
lazyPreloaderClass: { type: String, default: undefined },
109+
lazyPreloadPrevNext: { type: Number, default: undefined },
109110
runCallbacksOnInit: { type: Boolean, default: undefined },
110111
observer: { type: Boolean, default: undefined },
111112
observeParents: { type: Boolean, default: undefined },

0 commit comments

Comments
 (0)