Skip to content

Commit

Permalink
feat(core): new slidesPerGroupAuto feature
Browse files Browse the repository at this point in the history
fixes #4168
  • Loading branch information
nolimits4web committed Aug 9, 2021
1 parent 1b11429 commit 2b6f133
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 8 deletions.
24 changes: 19 additions & 5 deletions src/core/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -302,9 +302,9 @@ class Swiper {
swiper.emit('_slideClasses', updates);
}

slidesPerViewDynamic() {
slidesPerViewDynamic(view = 'current', exact = false) {
const swiper = this;
const { params, slides, slidesGrid, size: swiperSize, activeIndex } = swiper;
const { params, slides, slidesGrid, slidesSizesGrid, size: swiperSize, activeIndex } = swiper;
let spv = 1;
if (params.centeredSlides) {
let slideSize = slides[activeIndex].swiperSlideSize;
Expand All @@ -324,9 +324,23 @@ class Swiper {
}
}
} else {
for (let i = activeIndex + 1; i < slides.length; i += 1) {
if (slidesGrid[i] - slidesGrid[activeIndex] < swiperSize) {
spv += 1;
// eslint-disable-next-line
if (view === 'current') {
for (let i = activeIndex + 1; i < slides.length; i += 1) {
const slideInView = exact
? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize
: slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;
if (slideInView) {
spv += 1;
}
}
} else {
// previous
for (let i = activeIndex - 1; i >= 0; i -= 1) {
const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;
if (slideInView) {
spv += 1;
}
}
}
}
Expand Down
1 change: 1 addition & 0 deletions src/core/defaults.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ export default {
slidesPerView: 1,
slidesPerGroup: 1,
slidesPerGroupSkip: 0,
slidesPerGroupAuto: false,
centeredSlides: false,
centeredSlidesBounds: false,
slidesOffsetBefore: 0, // in px
Expand Down
8 changes: 6 additions & 2 deletions src/core/slide/slideNext.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
/* eslint no-unused-vars: "off" */
export default function slideNext(speed = this.params.speed, runCallbacks = true, internal) {
const swiper = this;
const { params, animating, enabled } = swiper;
const { animating, enabled, params } = swiper;
if (!enabled) return swiper;
const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup;
let perGroup = params.slidesPerGroup;
if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);
}
const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;
if (params.loop) {
if (animating && params.loopPreventsSlide) return false;
swiper.loopFix();
Expand Down
10 changes: 9 additions & 1 deletion src/core/slide/slidePrev.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,18 @@ export default function slidePrev(speed = this.params.speed, runCallbacks = true
prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];
}
}
let prevIndex;
let prevIndex = 0;
if (typeof prevSnap !== 'undefined') {
prevIndex = slidesGrid.indexOf(prevSnap);
if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;
if (
params.slidesPerView === 'auto' &&
params.slidesPerGroup === 1 &&
params.slidesPerGroupAuto
) {
prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;
prevIndex = Math.max(prevIndex, 0);
}
}
return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
}
7 changes: 7 additions & 0 deletions src/types/swiper-options.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,13 @@ export interface SwiperOptions {
*/
slidesPerGroupSkip?: number;

/**
* This param intended to be used only with `slidesPerView: 'auto' and `slidesPerGroup: 1`. When enabled, it will skip all slides in view on `.slideNext()` & `.slidePrev()` methods calls, on Navigation "buttons" clicks and in autoplay.
*
* @default false
*/
slidesPerGroupAuto?: boolean;

/**
* If `true`, then active slide will be centered, not always on the left side.
*
Expand Down

0 comments on commit 2b6f133

Please sign in to comment.