Итак, этот код работает по назначению. Но иногда может глючить.
Что я хочу:
Пользователь проводит пальцем вниз, а затем открывается следующая страница. У меня уже есть анимация для страниц. Мне просто нужно добавить или удалить класс в зависимости от направления прокрутки, и он должен применяться к правой странице (экрану).
Вот код js, который я использую:
document.addEventListener('DOMContentLoaded', function() {
window.scroll(0, 0)
var pages = document.querySelectorAll('section.page'),
currentPage = 0,
totalPages = pages.length - 1,
watchScroll = true // check scroll direction
window.addEventListener('scroll', function() {
if (watchScroll) {
if (this.oldScroll < this.scrollY) {
// currently scrolling down
if (currentPage < totalPages) {
handlePageDown()
}
} else {
// currently scrolling up
if (currentPage > 0) {
handlePageUp()
}
}
}
this.oldScroll = this.scrollY
})
function handlePageDown() {
pages[currentPage].classList.add('down-scroll')
nextPage = currentPage + 1
resetScroll(function() { // here, reset the scroll near the top so that the
// user has room to scroll up or else it will go
// fully to the top or bottom when they scroll
setCurrentPage(nextPage) // set the next target div
})
}
function handlePageUp() { // same as down but reverse node index
pages[currentPage - 1].classList.remove('down-scroll')
nextPage = currentPage - 1
resetScroll(function() {
setCurrentPage(nextPage)
})
}
function resetScroll(callback) {
setTimeout(function() {
watchScroll = false // don't pay attention to the scroll reset or this will trigger the eventListener
window.scroll(0, 10) // reset scroll position to give room for up or down
callback()
}, 50)
}
function setCurrentPage(setPageAs) {
setTimeout(function() {
currentPage = setPageAs
watchScroll = true
}, 400)
}
})
Мысли о том, как сделать это, не полагаясь на setTimeout()
, имейте в виду, что без задержки он мгновенно применит класс ко всем совпадающим элементам div.
Вы тестировали магию прокрутки?
@SephReed Эй, на самом деле, я думаю, это сработает. Ха-ха, спасибо, попробую
@EzequielFernandez У меня нет, я думал, что попробую просто использовать javascript
Вы можете использовать js, но использование css позволит браузеру использовать скомпилированный «нативный» код, который всегда более эффективен.
@SephReed справедливое замечание.
@SephReed Да, это сработало, вы хотите сделать быстрый ответ, который я могу отметить как правильный?
Хотя я не считаю это полностью ответом на вопрос (как он был задан), в целом это кажется лучшим решением проблемы.
Привязка прокрутки CSS
Количество комбинаций привязки прокрутки таково, что они не подходят для ответа, но вот пример css, который будет работать очень хорошо, если все разделы имеют высоту 300 пикселей.
.container {
scroll-snap-type: mandatory;
scroll-snap-points-y: repeat(300px);
scroll-snap-type: y mandatory;
}
.child {
scroll-snap-align: start;
}
Чтобы узнать больше об этом, ознакомьтесь с CSS-трюками: https://css-tricks.com/practical-css-scroll-snapping/
или залезть в дебри, mdn: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Scroll_Snap
Являются ли эти разделы «страницы» на странице? Если да, ищете ли вы привязку прокрутки (css-tricks.com/practical-css-scroll-snapping)? Если нет, то какую деталь я упускаю из виду, что отличает его?