Skip to content

Commit 1fde9d3

Browse files
fix(core): slideTo function does not work when grid.rows > 1 (#8030)
* Fix slideTo function when grid.rows > 1 * use getSlideIndexWhenGrid helper --------- Co-authored-by: Vladimir Kharlampidi <nolimits4web@gmail.com>
1 parent 377d53c commit 1fde9d3

File tree

4 files changed

+27
-5
lines changed

4 files changed

+27
-5
lines changed

src/core/core.mjs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,17 @@ class Swiper {
258258
);
259259
}
260260

261+
getSlideIndexWhenGrid(index) {
262+
if (this.grid && this.params.grid && this.params.grid.rows > 1) {
263+
if (this.params.grid.fill === 'column') {
264+
index = Math.floor(index / this.params.grid.rows);
265+
} else if (this.params.grid.fill === 'row') {
266+
index = index % Math.ceil(this.slides.length / this.params.grid.rows);
267+
}
268+
}
269+
return index;
270+
}
271+
261272
recalcSlides() {
262273
const swiper = this;
263274
const { slidesEl, params } = swiper;

src/core/slide/slideToClickedSlide.mjs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ export default function slideToClickedSlide() {
88
const slidesPerView =
99
params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
1010
let slideToIndex = swiper.clickedIndex;
11+
1112
let realIndex;
1213
const slideSelector = swiper.isElement ? `swiper-slide` : `.${params.slideClass}`;
14+
const isGrid = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1;
1315
if (params.loop) {
1416
if (swiper.animating) return;
1517
realIndex = parseInt(swiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);
@@ -29,7 +31,11 @@ export default function slideToClickedSlide() {
2931
} else {
3032
swiper.slideTo(slideToIndex);
3133
}
32-
} else if (slideToIndex > swiper.slides.length - slidesPerView) {
34+
} else if (
35+
slideToIndex > isGrid
36+
? (swiper.slides.length - slidesPerView) / 2 - (swiper.params.grid.rows - 1)
37+
: swiper.slides.length - slidesPerView
38+
) {
3339
swiper.loopFix();
3440
slideToIndex = swiper.getSlideIndex(
3541
elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0],

src/core/update/updateClickedSlide.mjs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@ export default function updateClickedSlide(el, path) {
2525
if (slide && slideFound) {
2626
swiper.clickedSlide = slide;
2727
if (swiper.virtual && swiper.params.virtual.enabled) {
28-
swiper.clickedIndex = parseInt(slide.getAttribute('data-swiper-slide-index'), 10);
28+
swiper.clickedIndex = swiper.getSlideIndexWhenGrid(
29+
parseInt(slide.getAttribute('data-swiper-slide-index'), 10),
30+
);
2931
} else {
30-
swiper.clickedIndex = slideIndex;
32+
swiper.clickedIndex = swiper.getSlideIndexWhenGrid(slideIndex);
3133
}
3234
} else {
3335
swiper.clickedSlide = undefined;

src/modules/a11y/a11y.mjs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,9 +263,12 @@ export default function A11y({ swiper, extendParams, on }) {
263263
requestAnimationFrame(() => {
264264
if (preventFocusHandler) return;
265265
if (swiper.params.loop) {
266-
swiper.slideToLoop(parseInt(slideEl.getAttribute('data-swiper-slide-index')), 0);
266+
swiper.slideToLoop(
267+
swiper.getSlideIndexWhenGrid(parseInt(slideEl.getAttribute('data-swiper-slide-index'))),
268+
0,
269+
);
267270
} else {
268-
swiper.slideTo(swiper.slides.indexOf(slideEl), 0);
271+
swiper.slideTo(swiper.getSlideIndexWhenGrid(swiper.slides.indexOf(slideEl)), 0);
269272
}
270273

271274
preventFocusHandler = false;

0 commit comments

Comments
 (0)