Задать вопрос
saimon108
@saimon108
Frontend, Gamer, Bookworm

Как реализовать запрет вертикального скролла при горизонтальном touchmove?

Есть страница на сайте с списком фотографов.
У каждого элемента списка есть фотографии которые можно листать при помощи свайпов.
Реализовано через события touchmove.

Вопрос в том, что при свайпах не только меняется картинка, но происходит скролл страницы по свайпу.
Есть ли какой то способ блокировать вертикальный скролл на мобилках?

В идеале при touchmove должно измеряться горизонтальное и вертикальное смещение и если верикальное меньше горизонтального - должен происходить блок вертикальной прокрутки.

Всем заранее спасибо.

Событие event.stopPropagation(); не подходит так как оно блочит и горизонтальный touchmove, что не дает выполяться коду.
Сам пример кода :
$('#main').on('touchmove', photoWrap, function(e){
                if (touchNow) {
                    var touch = e.originalEvent.touches[0];
                    touchMoveX = touch.pageX;
                    touchMoveY = touch.pageY;
                    touchDiffX = (touchMoveX > 0) ? (touchMoveX - touchStartX) : 0;
                    touchDiffY = (touchMoveY > 0) ? (touchMoveY - touchStartY) : 0;
                    if (touchDiffX > touchDiffY) {
                        $(photos).css('left', (photosLeft + touchDiffX) + 'px');
                        e.stopimmediatepropagation();
                    }
                } else {
                    return false;
                }
            });
  • Вопрос задан
  • 1597 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
Lafafm
@Lafafm
Development lead, Full stack generalist
Попробуйте stopimmediatepropagation() или stopPropagation()

$('element').on("touchmove", function(e) {
    e.stopimmediatepropagation();
    // Или
    e.stopPropagation()
    ...
}


Можете почитать подробнее о функциях: Тут
Ответ написан
@supertok
Вот моя реализация на 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
      }
    },
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы