#javascript #scroll #touch #slide
#javascript #прокрутка #коснитесь #слайд
Вопрос:
Я пытаюсь создать вертикальный слайд, он работает на рабочем столе с событием wheel, но метод scrollIntoView не выполняется в прослушивателе событий touch.
Вот код
let startClientY, endClientY;
page.addEventListener("touchstart", (event) => {
startClientY = event.touches[0].pageY;
}, false);
page.addEventListener("touchmove", (event) => {
endClientY = event.touches[0].pageY;
}, false);
page.addEventListener("touchend", (event) => {
let diff = startClientY - endClientY;
if (diff < -35) {
if( i !== 0 ) {
slides[i - 1].scrollIntoView({
behavior: "smooth", block: "start"
});
i--;
console.log('scroll top'); // this code is executed as well
}
} else if (diff > 35) {
if( i < slides.length -1) {
slides[i 1].scrollIntoView({
behavior: "smooth", block: "start"
});
i ;
console.log('scroll down'); // this code is executed
}
}
startClientY = undefined;
endClientY = undefined;
}, false);
Странный момент заключается в том, что журналы консоли внутри условий выполняются, а метод scrollIntoView работает вне EventListeners
Чего мне не хватает?
Комментарии:
1. Я сталкиваюсь с той же проблемой, мне не хватало того, что без
event.preventDefault()
в прослушивателе поведение не будет работать.
Ответ №1:
Проблема связана с параметром поведения scrollIntoView внутри прослушивателя событий touch, я нашел другой способ достичь того, чего я хочу.
let slideHeight = page.offsetHeight;
page.addEventListener("touchstart", function (event) {
startClientY = event.touches[0].pageY;
}, {
capture: true,
passive: true
});
page.addEventListener("touchmove", function (event) {
endClientY = event.touches[0].pageY;
}, {
capture: true,
passive: true
});
page.addEventListener("touchend", (event) => {
let diff = startClientY - endClientY;
if (diff < -35) {
if (i !== 0) {
page.scrollBy(0, -slideHeight);
i--;
}
} else if (diff > 35) {
if (i < slides.length - 1) {
page.scrollBy(0, slideHeight);
i ;
}
}
startClientY = undefined;
endClientY = undefined;
}, {
capture: true,
passive: true
});
Где переменной страницы являются мои слайды
Надеюсь, это поможет!
Ответ №2:
добавьте touch-action: none; в ваш css
Ответ №3:
Использование event.preventDefault()
не позволяет браузеру продолжать обрабатывать событие касания.
page.addEventListener("touchstart", (event) => {
event.preventDefault();
......
}, false);
ссылка:https://developer.mozilla.org/en-US/docs/Web/API/Touch_events