'Infinite scrolling problem with showing elements

I'm trying to do endless scrolling on my gallery page. I want three columns. The problem is, when I scroll down my wall, elements disappear and appear in weird ways ... and I want them to appear smoothly ... Additionally, I am sending my codepen

The strange thing is that when I have one column it all runs smoothly. Only in the case of three columns does this problem arise with ugly appearing elements ...

html

<div class="grid">
  <div class="columns">
    <div class="column-wrap">
      <div class="column">
        <div class="column__item">
          <div class="menu-item menu-item-first">
            <div class="image-box">
              <div class="image"></div>
            </div>
          </div>
          <div class="menu-item menu-item-first">
            <div class="image-box">
              <div class="image"></div>
            </div>
          </div>
          <div class="menu-item menu-item-first">
            <div class="image-box">
              <div class="image"></div>
            </div>
          </div>
          <div class="menu-item menu-item-first">
            <div class="image-box">
              <div class="image"></div>
            </div>
          </div>
          <div class="menu-item menu-item-first">
            <div class="image-box">
              <div class="image"></div>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div class="column-wrap">
      <div class="column">
        <div class="column__item">
          <div class="menu-item menu-item-sec">
            <div class="image-box">
              <div class="image"></div>
            </div>
          </div>
          <div class="menu-item menu-item-sec">
            <div class="image-box">
              <div class="image"></div>
            </div>
          </div>
          <div class="menu-item menu-item-sec">
            <div class="image-box">
              <div class="image"></div>
            </div>
          </div>
          <div class="menu-item menu-item-sec">
            <div class="image-box">
              <div class="image"></div>
            </div>
          </div>
          <div class="menu-item menu-item-sec">
            <div class="image-box">
              <div class="image"></div>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div class="column-wrap">
      <div class="column">
        <div class="column__item">
          <div class="menu-item">
            <div class="image-box">
              <div class="image"></div>
            </div>
          </div>
          <div class="menu-item">
            <div class="image-box">
              <div class="image"></div>
            </div>
          </div>
          <div class="menu-item">
            <div class="image-box">
              <div class="image"></div>
            </div>
          </div>
          <div class="menu-item">
            <div class="image-box">
              <div class="image"></div>
            </div>
          </div>
          <div class="menu-item">
            <div class="image-box">
              <div class="image"></div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

css:

.columns{
    display: flex;
    position: relative;
    justify-content: center;
    padding: 0 3rem;
    width: 100%;
    height: 100vh;
    overflow: hidden;
    .column-wrap{
        display: flex;
        position: relative;
        height: 100vh;
        width: 33.3%;
        margin: 0 auto;
        .column{
            position: relative;
            display: flex;
            width: 100%;
            &__item{
                margin: 0;
                position: relative;
                z-index: 1;
                height: 100%;
                width: 100%;
                .menu-item{
                    position: absolute;
                    z-index: 1;
                    width: 100%;
                    padding: 2rem 0;
                    text-align: center;
                }
            }
        }
    }
}

jQuery:

/*--------------------
Vars
--------------------*/
const $menu = document.querySelector('.grid')
const $items = document.querySelectorAll('.menu-item')
let menuHeight = $menu.clientHeight
let itemHeight = $items[0].clientHeight
let wrapHeight = $items.length * itemHeight

let scrollSpeed = 0
let oldScrollY = 0
let scrollY = 0
let y = 0


/*--------------------
Lerp
--------------------*/
const lerp = (v0, v1, t) => {
  return v0 * ( 1 - t ) + v1 * t
}


/*--------------------
Dispose
--------------------*/
const dispose = (scroll) => {
  gsap.set($items, {
    y: (i) => {
      return i * itemHeight + scroll
    },
    modifiers: {
      y: (y) => {
        const s = gsap.utils.wrap(-itemHeight, itemHeight + 5, parseInt(y))
        // const s = gsap.utils.wrap(-itemHeight, wrapHeight - itemHeight, parseInt(y))
        return `${s}px`
      }
    }
  })
} 
dispose(0)


/*--------------------
Wheel
--------------------*/
const handleMouseWheel = (e) => {
  scrollY -= e.deltaY  
}


/*--------------------
Touch
--------------------*/
let touchStart = 0
let touchY = 0
let isDragging = false
const handleTouchStart = (e) => {
  touchStart = e.clientY || e.touches[0].clientY
  isDragging = true
  $menu.classList.add('is-dragging')
}
const handleTouchMove = (e) => {
  if (!isDragging) return
  touchY = e.clientY || e.touches[0].clientY
  scrollY += (touchY - touchStart) * 2.5
  touchStart = touchY
}
const handleTouchEnd = () => {
  isDragging = false
  $menu.classList.remove('is-dragging')
}


/*--------------------
Listeners
--------------------*/
$menu.addEventListener('mousewheel', handleMouseWheel)

$menu.addEventListener('touchstart', handleTouchStart)
$menu.addEventListener('touchmove', handleTouchMove)
$menu.addEventListener('touchend', handleTouchEnd)

$menu.addEventListener('mousedown', handleTouchStart)
$menu.addEventListener('mousemove', handleTouchMove)
$menu.addEventListener('mouseleave', handleTouchEnd)
$menu.addEventListener('mouseup', handleTouchEnd)

$menu.addEventListener('selectstart', () => { return false })


/*--------------------
Resize
--------------------*/
window.addEventListener('resize', () => {
  menuHeight = $menu.clientHeight
  itemHeight = $items[0].clientHeight
  wrapHeight = $items.length * itemHeight
})


/*--------------------
Render
--------------------*/
const render = () => {
  requestAnimationFrame(render)
  y = lerp(y, scrollY, .1)
  dispose(y)
  
  scrollSpeed = y - oldScrollY
  oldScrollY = y
  
  gsap.to($items, {
    scale: 1 -  Math.min(100, Math.abs(scrollSpeed)) * .005,
    rotate: scrollSpeed * 0.2
  })
}
render()


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source