const root = document.getElementById('root');
const content = document.getElementById('content');
root.addEventListener('wheel', e => {
e.preventDefault();
e.stopPropagation();
const delta = e.deltaY;
const maxScrollY = content.offsetHeight - root.offsetHeight;
const maxScrollX = content.offsetWidth - root.offsetWidth;
let scrollY = root.scrollTop;
let scrollX = root.scrollLeft;
if (scrollX > 0) {
scrollX += delta;
if (scrollX < 0) {
scrollY -= scrollX;
scrollX = 0;
}
} else {
scrollY += delta;
const overflow = scrollY - maxScrollY;
if (overflow > 0) {
scrollX += overflow;
scrollY = maxScrollY;
} else {
scrollX = 0;
}
}
root.scrollTo(scrollX, scrollY);
});
#root {
width: 500px;
height: 500px;
overflow: hidden;
}
#content {
width: 5000px;
height: 1000px;
}
/* This is just to have something in content so we can see it moving */
#content {
border: 50px solid #F00;
background-image:
linear-gradient(0deg, rgba(0, 0, 255, .5) 0%, rgba(0, 0, 255, .5) 50%, rgba(0, 0, 0, 0) 50%, rgba(0, 0, 0, 0) 100%),
linear-gradient(90deg, #000 0%, #000 50%, #FFF 50%, #FFF 100%);
background-repeat: repeat;
background-size: 1% 5%;
}
<div id="root">
<div id="content"></div>
</div>