перевернуть скролл при прокрутке

Нужен совет как сделать что бы при обычной прокрутке страницы ( колёсиком, или в моб пальцем) после того как блок докрутился до верху екрана, он стал скролиться по горизонтале и после того как достигнут край блока продолжился стандартный скролл, соответственно если скролл вверх идёт то всё в обратном порядке. (Таких блоков на странице может быть несколько)

<div class="simple"></div>
<div class="outer">
    <div class="inner">
        <div class="cube">1</div>
        <div class="cube">2</div>
        <div class="cube">3</div>
        <div class="cube">4</div>
        <div class="cube">5</div>
        <div class="cube">6</div>
        <div class="cube">7</div>
        <div class="cube">8</div>
        <div class="cube">9</div>
        <div class="cube">10</div>
    </div>
</div>
<div class="simple2"></div>
<div class="simple3"></div>

* {
    box-sizing: border-box;
    margin: 0;
}

body {
    overflow-x: hidden;
}

.simple {
    height: 100vh;
    background: #1f69c0;
    border-bottom: 2px solid #777;
}


.simple2 {
    height: 400px;
    background: #EEAA07;
    border-bottom: 2px solid #777;
}
.simple3 {
    height: 400px;
    background: #07eed9;
    border-bottom: 2px solid #777;
}

.outer {
    height: 150px;
    background: #7b8e39;
    overflow-y: hidden;
    overflow-x: scroll;
}

.inner {
    height: 100%;
    margin: 0 100px;
    display: flex;
}

.fixed {
    position: fixed;
    top: 0;
}

.cube {
    min-width: 200px;
    height: 100px;
    background: #f6f6f6;
    margin: 10px;
    display: flex;
    align-items: center;
    justify-content: center;
}

Вот примерная структура, пока 2 блок не проскролился до конца, 3 блок должен быть виден и после того как 2 доскролился по горизонтали до конца, продолжиться стандартный скролл


Ответы (1 шт):

Автор решения: Bear Vorkuta

Такой принцип можно попробовать.

    let outer = document.querySelector('.outer')
    let inner = document.querySelector('.inner')
    window.addEventListener('scroll', function() {
        if (outer.offsetTop <= window.scrollY)
        {
            if (!inner.classList.contains('fixed')) inner.classList.add('fixed')
            inner.style.transform = `translateX(-${pageYOffset-outer.offsetTop}px)`
        }
        if (outer.offsetTop >= window.scrollY) inner.classList.remove('fixed')
    })
* {
    box-sizing: border-box;
    margin: 0;
}

body {
    overflow-x: hidden;
}

.simple {
    min-height: 50vh;
    background: #1f69c0;
    border-bottom: 2px solid #777;
}

.outer {
    height: 200vw;
    background: #7b8e39;
}

.inner {
    width: 200vw;
    min-height: 100%;
    display: flex;
    overflow: hidden;
}

.fixed {
    position: fixed;
    top: 0;
}

.cube {
    width: 40vh;
    height: 30vh;
    background: #f6f6f6;
    margin: 10px;
    display: flex;
    align-items: center;
    justify-content: center;
}
<div class="simple"></div>
<div class="outer">
    <div class="inner">
        <div class="cube">1</div>
        <div class="cube">2</div>
        <div class="cube">3</div>
        <div class="cube">4</div>
        <div class="cube">5</div>
        <div class="cube">6</div>
        <div class="cube">7</div>
        <div class="cube">8</div>
        <div class="cube">9</div>
        <div class="cube">10</div>
    </div>
</div>
<div class="simple"></div>

→ Ссылка