Запретить прокрутку фонового div при прокрутке содержимого модального поля

#javascript #jquery #html #css

#javascript #jquery #HTML #css

Вопрос:

У меня есть модальное поле для мобильного сайта (устройство ios), которое содержит прокручиваемый контент внутри него. Первоначальная проблема заключалась в том, что при прокрутке содержимого внутри модальной страницы прокручивалась даже фоновая страница. Чтобы исправить это, я добавил свойство ‘position: fixed’ к тегу body при открытии modalbox и удалил его при закрытии modalbox.

Хотя это устраняет проблему с начальной прокруткой, это приводит к тому, что страница прокручивается вверх при добавлении «фиксированного свойства:» к тегу body, и страница прокручивается в исходное положение после закрытия модального поля.

Хотелось бы найти решение, позволяющее избежать прокрутки страницы до верха, если в тело добавлено фиксированное свойство.

Комментарии:

1. Не могли бы вы, пожалуйста, поделиться своим кодом

2. Найден плагин, который хорошо работает. Просто добавив ссылку сюда, любой может столкнуться с такой же проблемой: github.com/ulivz/jquery-scrollable-overlay

Ответ №1:

Одним из способов сделать это было бы отслеживать события касания и вращения и вызывать для них preventDefault, когда вы знаете, что они собираются прокручивать неправильный элемент. Вот основная идея:

 element.addEventListener('touchstart', onTouchStart);
element.addEventListener('touchmove', onTouchMove, { passive: false });
element.addEventListener('wheel', onWheel, { passive: false });

onWheel(event) {
  // Walk up the DOM tree from target element until the 
  // topmost element you want to isolate scroll with
  // i.e. your modal and check if any of the elements
  // can be scrolled in the wheel direction (event.deltaY).
  // If there are no such elements, call event.preventDefault().
}

onTouchStart(event) {
  // Store initial touch coordinates to determine direction later
}

onTouchMove(event) {
  // Using initial touch coordinates determine direction of the move
  // and do the similar thing as with the wheel event — call
  // event.preventDefault() if you know that resulting scroll will happen
  // outside of your modal
}