Деактивация прокрутки в JavaScript с jQuery: scrollTo

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы остановить прокрутку страницы, задайте свойство overflow: hidden элементу <body>:

JS
Скопировать код
document.body.style.overflow = 'hidden'; // "Сейчас прокрутка прервется!"
document.body.style.overflow = '';       // "Продолжаем прокрутку!"

Таким способом вы сможете отключить и восстановить прокрутку, не трогая при этом другие элементы навигации, например, комбинации клавиш или переходы по якорям.

Кинга Идем в IT: пошаговый план для смены профессии

Подробные инструкции

Управление прокруткой на мобильных устройствах

Для блокировки прокрутки на устройствах с сенсорным отображением, следует обрабатывать события touchmove:

JS
Скопировать код
const preventDefault = (e) => e.preventDefault();
const disableScroll = () => document.addEventListener('touchmove', preventDefault, { passive: false }); // "Никакой прокрутки!"
const enableScroll = () => document.removeEventListener('touchmove', preventDefault, { passive: false }); // "Продолжаем прокрутку!"

disableScroll();  // Прокрутка отключена
enableScroll();   // Прокрутка включена

Важно: установите { passive: false }, чтобы гарантировать отмену действия по умолчанию при касании.

Запоминание позиции прокрутки

Важно сохранить положение прокрутки при её переключении. Вот как это делается:

JS
Скопировать код
let scrollPosition = 0;

const disableScroll = () => {
  scrollPosition = window.pageYOffset; // Запоминаем текущую позицию!
  document.body.style.overflow = 'hidden';
  document.body.style.position = 'fixed'; // Фиксируем положение!
  document.body.style.top = `-${scrollPosition}px`; // Держим в уме позицию
};

const enableScroll = () => {
  document.body.style.overflow = '';
  document.body.style.position = '';
  document.body.style.top = '';
  window.scrollTo(0, scrollPosition); // Возвращаемся на сохраненную позицию!
};

Имитация полосы прокрутки

Чтобы интерфейс не смещался при исчезновении прокруточной полосы, создайте её подделку:

JS
Скопировать код
const scrollbarWidth = window.innerWidth – document.documentElement.clientWidth;
document.body.style.overflow = 'hidden';
document.body.style.paddingRight = `${scrollbarWidth}px`; // Создаем видимость полосы прокрутки

Продвинутые приёмы

Динамическое управление переполнением содержимого

Для динамического управления переполнением, например, во время анимаций или переходов, настройте следующий подход:

JS
Скопировать код
function afterAnimation() {
  document.body.style.overflow = 'auto'; // "Анимация закончена, можем продолжить!"
}

// Запускаем анимацию и восстанавливаем прокрутку в конце
myAnimation().then(afterAnimation);

Совместимость с устаревшими браузерами

В старых браузерах, таких как IE6, могут потребоваться особые методы управления прокруткой:

JS
Скопировать код
// Для IE6
window.onload = function() {
  document.body.scroll = "no"; // "В IE6 прокрутку мы отменяем!"
};

Обязательно тестируйте решения в разных браузерах и на разных устройствах, чтобы убедиться в их правильной работе.

Визуализация

Пошаговое иллюстрированное руководство по временному блокированию прокрутки:

Markdown
Скопировать код
Исходное состояние страницы: 📄🔄👈 (Прокрутка включена)

Действие: 🚫✋ (Стоп! Прекращаем прокрутку!)

Результат: 📄✋ (Прокрутка отключена)

Жаргонное сравнение: это как если бы у полосы прокрутки была кнопка паузы:

JS
Скопировать код
// Чтобы приостановить прокрутку:
document.body.style.overflow = 'hidden'; // 📄⏸️

// Чтобы продолжить прокрутку:
document.body.style.overflow = ''; // 📄⏯️

Дополнительные соображения

Избежание "цепной" прокрутки

При использовании вложенных элементов с прокруткой полезно применить CSS-свойство overscroll-behavior для предотвращения цепной прокрутки:

CSS
Скопировать код
.scrollable-element {
  overscroll-behavior: contain; // "Твое распространение останавливается здесь", – сообщает элемент прокрутке
}

Вопросы производительности

Учтите, что блокирование прокрутки может негативно повлиять на взаимодействие пользователя с сайтом и производительность в целом. Используйте этот метод с должным рассмотрением, вспоминая о доступности и удобстве пользования.

Полезные материалы

  1. Метод Event: preventDefault() – Веб API | MDN — Информация о блокировке стандартных событий в JavaScript.
  2. javascript – Как временно отключить прокрутку? – Stack Overflow — Обсуждение специалистов и сообщества по проблеме отключения прокрутки.
  3. overflow | CSS-Tricks – CSS-Tricks — Изучение свойства overflow и его сильного влияния на прокрутку.
  4. Вам может не понадобиться jQuery — Показаны альтернативы функциональности jQuery на чистом JavaScript.
  5. События касания – Веб API | MDN — Анализ проблем, возникающих при работе с событиями касания в веб-разработке.
  6. WheelEvent – Веб API | MDN — Документация, с помощью которой вы можете осмыслить интерфейс WheelEvent.