Вот моя реализация на VUE, думаю переделать на чистый js будет нетрудно
Идея в том что по горизонтали двигаем сами с помощью translateX по вертикали же запрещаем если горизонтальный свайп больше вертикального
data () {
return {
isDesktop: true,
slideIndex: 0,
sliderContainerWidth: 0,
touchStartX: null,
touchMoveX: null,
touchMoveY: null,
translateX: 0,
currTransformX: 0,
isMouseDown: false,
};
},
methods: {
onTouchStart (event) {
this.touchStartX = event.touches[0].clientX;
this.touchStartY = event.touches[0].clientY;
},
onTouchMove (event) {
this.touchMoveX = event.touches[0].clientX;
this.touchMoveY = event.touches[0].clientY;
const dx = Math.abs(this.touchMoveX - this.touchStartX);
const dy = Math.abs(this.touchMoveY - this.touchStartY);
if (dx > dy) {
event.preventDefault(); // запрещаем вертикальную прокрутку, если свайп горизонтальный
this.translateX = this.touchMoveX - this.touchStartX; // разница координат между началом свайпа и текущим состоянием пальца
this.$refs.sliderWrapper.style.transform = `translateX(${this.currTransformX + this.translateX}px)`; // сдвигаем слайдер на нужное количество пикселей вправо или влево в зависимости от знака this.translateX
}
},
}