Деактивация прокрутки в 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 }, чтобы гарантировать отмену действия по умолчанию при касании.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

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

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

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.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Как отключить прокрутку страницы в JavaScript?
1 / 5