JavaScript: Полная прокрутка страницы

Итак, этот код работает по назначению. Но иногда может глючить.

Что я хочу:

Пользователь проводит пальцем вниз, а затем открывается следующая страница. У меня уже есть анимация для страниц. Мне просто нужно добавить или удалить класс в зависимости от направления прокрутки, и он должен применяться к правой странице (экрану).

Вот код 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.

Являются ли эти разделы «страницы» на странице? Если да, ищете ли вы привязку прокрутки (css-tricks.com/practical-css-scroll-snapping)? Если нет, то какую деталь я упускаю из виду, что отличает его?

Seph Reed 09.04.2019 05:11

Вы тестировали магию прокрутки?

Ezequiel Fernandez 09.04.2019 05:13

@SephReed Эй, на самом деле, я думаю, это сработает. Ха-ха, спасибо, попробую

Daltron 09.04.2019 05:15

@EzequielFernandez У меня нет, я думал, что попробую просто использовать javascript

Daltron 09.04.2019 05:16

Вы можете использовать js, но использование css позволит браузеру использовать скомпилированный «нативный» код, который всегда более эффективен.

Seph Reed 09.04.2019 05:22

@SephReed справедливое замечание.

Daltron 09.04.2019 05:24

@SephReed Да, это сработало, вы хотите сделать быстрый ответ, который я могу отметить как правильный?

Daltron 09.04.2019 05:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
364
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хотя я не считаю это полностью ответом на вопрос (как он был задан), в целом это кажется лучшим решением проблемы.

Привязка прокрутки 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

Другие вопросы по теме