Skip to content

Commit eadb634

Browse files
kaeizenbfintal
andauthored
fix (carousel): fix overlapping inner columns on infinite scroll (#3588)
* fix translateX value * simplify calculation of translateX * Update src/block/carousel/frontend-carousel.js --------- Co-authored-by: Benjamin Intal <[email protected]>
1 parent 01cfc4f commit eadb634

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

src/block/carousel/frontend-carousel.js

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,15 @@ class _StackableCarousel {
9393
const clone = original.cloneNode( true )
9494
clone.classList.add( `stk-slide-clone-${ slideIndex + 1 }` )
9595
clone.style.zIndex = -1
96+
97+
clone.style.willChange = 'transform'
98+
clone.style.transform = 'translateX( 0 )'
9699
original.style.willChange = 'transform'
97100
original.style.transform = 'TranslateX( 0 )'
98101

99102
// prevents flickering when changing the value of TranslateX
100103
original.style.transition = 'transform 0s'
104+
clone.style.transition = 'transform 0s'
101105

102106
this.clones.push( clone )
103107

@@ -117,11 +121,14 @@ class _StackableCarousel {
117121
}
118122
step++
119123
} else if ( step === 2 ) {
120-
const numSlides = this.slideEls.length
121-
const slideClientRect = this.slideEls[ 0 ].getBoundingClientRect()
122-
const slideWidth = slideClientRect.width
124+
// Calculate the difference between the first slide and the first clone
125+
// This is used to calculate the translateX values for the slides and clones
126+
const slideOffsetLeft = this.slideEls[ 0 ].offsetLeft
127+
const cloneOffsetLeft = this.clones[ 0 ].offsetLeft
123128

124-
this.slideTranslateX = `calc((${ slideWidth }px * ${ numSlides }) + (var(--gap) * ${ numSlides }))`
129+
const diff = Math.abs( slideOffsetLeft - cloneOffsetLeft )
130+
this.slideTranslateX = ( this.isRTL ? -diff : diff ) + 'px'
131+
this.cloneTranslateX = ( this.isRTL ? diff : -diff ) + 'px'
125132

126133
step++
127134
} else if ( step === 3 ) {
@@ -297,12 +304,12 @@ class _StackableCarousel {
297304
const needToSwap = this.needToSwapCount( slide )
298305
let startIndex = 0
299306
let endIndex = 0
300-
let slideTranslateXValue = 0
307+
let useSlideTranslateX = false
301308
if ( needToSwap > 0 && this.swappedSlides < needToSwap ) {
302309
startIndex = this.swappedSlides
303310
endIndex = needToSwap
304311

305-
slideTranslateXValue = this.slideTranslateX
312+
useSlideTranslateX = true
306313

307314
this.swappedSlides = endIndex
308315
} else if ( this.swappedSlides > needToSwap ) {
@@ -317,7 +324,10 @@ class _StackableCarousel {
317324
const runSteps = () => {
318325
if ( step === 0 ) {
319326
this.slideEls.slice( startIndex, endIndex ).forEach( slide => {
320-
slide.style.transform = `TranslateX(${ slideTranslateXValue })`
327+
slide.style.transform = `translateX(${ useSlideTranslateX ? this.slideTranslateX : 0 })`
328+
} )
329+
this.clones.slice( startIndex, endIndex ).forEach( clone => {
330+
clone.style.transform = `translateX(${ useSlideTranslateX ? this.cloneTranslateX : 0 })`
321331
} )
322332
step++
323333
requestAnimationFrame( runSteps )

0 commit comments

Comments
 (0)