Skip to content

Commit d472144

Browse files
committed
feat(virtual): add slidesPerViewAutoSlideSize parameter for fixed slide dimensions with slidesPerView auto
fixes #8041 fixes #7796
1 parent 74cc297 commit d472144

File tree

2 files changed

+45
-17
lines changed

2 files changed

+45
-17
lines changed

src/core/update/updateSlides.mjs

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,26 @@ export default function updateSlides() {
8888

8989
for (let i = 0; i < slidesLength; i += 1) {
9090
slideSize = 0;
91-
let slide;
92-
if (slides[i]) slide = slides[i];
93-
if (gridEnabled) {
94-
swiper.grid.updateSlide(i, slide, slides);
91+
const slide = slides[i];
92+
if (slide) {
93+
if (gridEnabled) {
94+
swiper.grid.updateSlide(i, slide, slides);
95+
}
96+
if (elementStyle(slide, 'display') === 'none') continue; // eslint-disable-line
9597
}
96-
if (slides[i] && elementStyle(slide, 'display') === 'none') continue; // eslint-disable-line
9798

98-
if (params.slidesPerView === 'auto') {
99+
if (isVirtual && params.slidesPerView === 'auto') {
100+
if (params.virtual.slidesPerViewAutoSlideSize) {
101+
slideSize = params.virtual.slidesPerViewAutoSlideSize;
102+
}
103+
if (slideSize && slide) {
104+
if (params.roundLengths) slideSize = Math.floor(slideSize);
105+
106+
slide.style[swiper.getDirectionLabel('width')] = `${slideSize}px`;
107+
}
108+
} else if (params.slidesPerView === 'auto') {
99109
if (shouldResetSlideSize) {
100-
slides[i].style[swiper.getDirectionLabel('width')] = ``;
110+
slide.style[swiper.getDirectionLabel('width')] = ``;
101111
}
102112
const slideStyles = getComputedStyle(slide);
103113
const currentTransform = slide.style.transform;
@@ -144,12 +154,12 @@ export default function updateSlides() {
144154
slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;
145155
if (params.roundLengths) slideSize = Math.floor(slideSize);
146156

147-
if (slides[i]) {
148-
slides[i].style[swiper.getDirectionLabel('width')] = `${slideSize}px`;
157+
if (slide) {
158+
slide.style[swiper.getDirectionLabel('width')] = `${slideSize}px`;
149159
}
150160
}
151-
if (slides[i]) {
152-
slides[i].swiperSlideSize = slideSize;
161+
if (slide) {
162+
slide.swiperSlideSize = slideSize;
153163
}
154164
slidesSizesGrid.push(slideSize);
155165

src/modules/virtual/virtual.mjs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export default function Virtual({ swiper, extendParams, on, emit }) {
1212
enabled: false,
1313
slides: [],
1414
cache: true,
15+
slidesPerViewAutoSlideSize: 320,
1516
renderSlide: null,
1617
renderExternal: null,
1718
renderExternalUpdate: true,
@@ -65,16 +66,16 @@ export default function Virtual({ swiper, extendParams, on, emit }) {
6566

6667
function update(force, beforeInit, forceActiveIndex) {
6768
const {
68-
slidesPerView,
6969
slidesPerGroup,
7070
centeredSlides,
71+
slidesPerView,
7172
loop: isLoop,
7273
initialSlide,
7374
} = swiper.params;
7475
if (beforeInit && !isLoop && initialSlide > 0) {
7576
return;
7677
}
77-
const { addSlidesBefore, addSlidesAfter } = swiper.params.virtual;
78+
const { addSlidesBefore, addSlidesAfter, slidesPerViewAutoSlideSize } = swiper.params.virtual;
7879
const {
7980
from: previousFrom,
8081
to: previousTo,
@@ -93,14 +94,31 @@ export default function Virtual({ swiper, extendParams, on, emit }) {
9394
if (swiper.rtlTranslate) offsetProp = 'right';
9495
else offsetProp = swiper.isHorizontal() ? 'left' : 'top';
9596

97+
let slidesPerViewNumeric;
98+
if (slidesPerView === 'auto') {
99+
if (slidesPerViewAutoSlideSize) {
100+
let swiperSize = swiper.size;
101+
if (!swiperSize) {
102+
swiperSize = swiper.isHorizontal()
103+
? swiper.el.getBoundingClientRect().width
104+
: swiper.el.getBoundingClientRect().height;
105+
}
106+
slidesPerViewNumeric = Math.max(1, Math.ceil(swiperSize / slidesPerViewAutoSlideSize));
107+
} else {
108+
slidesPerViewNumeric = 1;
109+
}
110+
} else {
111+
slidesPerViewNumeric = slidesPerView;
112+
}
113+
96114
let slidesAfter;
97115
let slidesBefore;
98116
if (centeredSlides) {
99-
slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;
100-
slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;
117+
slidesAfter = Math.floor(slidesPerViewNumeric / 2) + slidesPerGroup + addSlidesAfter;
118+
slidesBefore = Math.floor(slidesPerViewNumeric / 2) + slidesPerGroup + addSlidesBefore;
101119
} else {
102-
slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter;
103-
slidesBefore = (isLoop ? slidesPerView : slidesPerGroup) + addSlidesBefore;
120+
slidesAfter = slidesPerViewNumeric + (slidesPerGroup - 1) + addSlidesAfter;
121+
slidesBefore = (isLoop ? slidesPerViewNumeric : slidesPerGroup) + addSlidesBefore;
104122
}
105123
let from = activeIndex - slidesBefore;
106124
let to = activeIndex + slidesAfter;

0 commit comments

Comments
 (0)