Skip to content

Commit e48daa5

Browse files
authored
feat(virtual): patch for very large sliders using virtual slides (#6533)
* patch for large virtual slide containers exceeding browser position limits functional for my purposes * should also fix some of the effects I have no idea what I'm doing * effects not working * Update updateSlidesOffset.js
1 parent 642b455 commit e48daa5

File tree

5 files changed

+20
-5
lines changed

5 files changed

+20
-5
lines changed

src/core/core.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,12 @@ class Swiper {
164164
velocity: 0,
165165
animating: false,
166166

167+
cssOverflowAdjustment() {
168+
// Returns 0 unless `translate` is > 2**23
169+
// Should be subtracted from css values to prevent overflow
170+
return Math.trunc(this.translate / 2**23) * 2**23;
171+
},
172+
167173
// Locks
168174
allowSlideNext: swiper.params.allowSlideNext,
169175
allowSlidePrev: swiper.params.allowSlidePrev,

src/core/translate/getTranslate.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export default function getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y
1313
}
1414

1515
let currentTranslate = getTranslate(wrapperEl, axis);
16+
currentTranslate += swiper.cssOverflowAdjustment();
1617
if (rtl) currentTranslate = -currentTranslate;
1718

1819
return currentTranslate || 0;

src/core/translate/setTranslate.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,19 @@ export default function setTranslate(translate, byController) {
1616
y = Math.floor(y);
1717
}
1818

19+
swiper.previousTranslate = swiper.translate;
20+
swiper.translate = swiper.isHorizontal() ? x : y;
21+
1922
if (params.cssMode) {
2023
wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;
2124
} else if (!params.virtualTranslate) {
25+
if (swiper.isHorizontal()) {
26+
x -= swiper.cssOverflowAdjustment();
27+
} else {
28+
y -= swiper.cssOverflowAdjustment();
29+
}
2230
wrapperEl.style.transform = `translate3d(${x}px, ${y}px, ${z}px)`;
2331
}
24-
swiper.previousTranslate = swiper.translate;
25-
swiper.translate = swiper.isHorizontal() ? x : y;
2632

2733
// Check if we need to update progress
2834
let newProgress;

src/core/update/updateSlidesOffset.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ export default function updateSlidesOffset() {
99
: 0;
1010
for (let i = 0; i < slides.length; i += 1) {
1111
slides[i].swiperSlideOffset =
12-
(swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop) - minusOffset;
12+
(swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop)
13+
- minusOffset
14+
- swiper.cssOverflowAdjustment();
1315
}
1416
}

src/modules/virtual/virtual.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ export default function Virtual({ swiper, extendParams, on, emit }) {
119119
if (previousFrom === from && previousTo === to && !force) {
120120
if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {
121121
swiper.slides.forEach((slideEl) => {
122-
slideEl.style[offsetProp] = `${offset}px`;
122+
slideEl.style[offsetProp] = `${offset - Math.abs(swiper.cssOverflowAdjustment())}px`;
123123
});
124124
}
125125
swiper.updateProgress();
@@ -209,7 +209,7 @@ export default function Virtual({ swiper, extendParams, on, emit }) {
209209
});
210210
}
211211
elementChildren(swiper.slidesEl, '.swiper-slide, swiper-slide').forEach((slideEl) => {
212-
slideEl.style[offsetProp] = `${offset}px`;
212+
slideEl.style[offsetProp] = `${offset - Math.abs(swiper.cssOverflowAdjustment())}px`;
213213
});
214214
onRendered();
215215
}

0 commit comments

Comments
 (0)