JS Поменять местами события вертикального и горизонтального скролла
Как реализовать, что бы при прокрутки страци вниз, внутренний блок скролился вправо, а при прокрутки вверх, влево ? Приведу пример
let wrapperBlock = document.querySelector(".list");
window.addEventListener("scroll", onWheel);
function onWheel(event, delta) {
console.log("delta = " + delta);
if(delta > 1) {
wrapperBlock.scrollLeft -= 150;
}
else {
wrapperBlock.scrollLeft += 150;
}
}
body {
margin: 0;
}
.list {
min-width: 100%;
display: grid;
grid-gap: 0 30px;
grid-auto-columns: calc(25% - 30px);
grid-auto-flow: column;
}
.item {
width: 100%;
background: pink;
min-height: 100px;
}
<div class="list">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
</div>
Пробую подцепить отслеживание события на скролл, а потом прибавлять, или отнимать коэффициент прокрутки delta. Но пока явно что-то не то. *Как это делать на чистом JS?
Ответы (1 шт):
Автор решения: hu-fo
→ Ссылка
let list = document.querySelector(".list"), x = 0
window.addEventListener("wheel", onWheel)
function onWheel(event) {
x += event.deltaY > 0 ? 100 : -100
window.scroll(x, 0)
}
body {
margin: 0;
}
.list {
min-width: 100%;
display: grid;
grid-gap: 0 30px;
grid-auto-columns: calc(25% - 30px);
grid-auto-flow: column;
}
.item {
width: 100%;
background: pink;
min-height: 100px;
}
<div class="list">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
</div>
Второй вариант
let list = document.querySelector(".list"), dir, i, x, isOkToScroll
setDefault()
window.addEventListener("wheel", onWheel)
function onWheel(event) {
dir = event.deltaY > 0 ? 1 : -1
isOkToScroll = true
}
requestAnimationFrame(scroll)
function scroll() {
requestAnimationFrame(scroll)
if (!isOkToScroll) return;
if (i < 28) i++
else setDefault()
window.scrollBy(i * dir, 0)
}
function setDefault() {
isOkToScroll = false
i = 1
x = 0
dir = 0
}
body {
margin: 0;
}
.list {
min-width: 100%;
display: grid;
grid-gap: 0 30px;
grid-auto-columns: calc(25% - 30px);
grid-auto-flow: column;
}
.item {
width: 100%;
background: pink;
min-height: 100px;
}
<div class="list">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
</div>