Skip to main content

Як заблокувати прокрутку сторінки?

1. Найпростіший і надійний спосіб - через CSS (overflow: hidden)

Браузер дозволяє заблокувати прокрутку всієї сторінки, якщо на <body> (або <html>) встановити overflow: hidden.

javascript
document.body.style.overflow = 'hidden'; // блокуємо скрол

Щоб повернути назад:

javascript
document.body.style.overflow = ''; // розблоковуємо

Це найпоширеніший спосіб - сторінка залишається на місці, колесо миші і тач-скрол не працюють.

2. Зручна функція для вмикання/вимикання скролу

javascript
function disableScroll() { document.body.style.overflow = 'hidden'; } function enableScroll() { document.body.style.overflow = ''; }

Використання:

javascript
openModalBtn.addEventListener('click', disableScroll); closeModalBtn.addEventListener('click', enableScroll);

3. Просунутий спосіб - зберегти позицію (щоб не "стрибало")

Якщо сторінка була проскрольована, і ти просто робиш overflow: hidden, контент може смикнутися через зникнення смуги прокрутки.

Ось правильний спосіб з фіксацією позиції:

javascript
function disableScroll() { const scrollY = window.scrollY; document.body.style.position = 'fixed'; document.body.style.top = `-${scrollY}px`; document.body.style.width = '100%'; } function enableScroll() { const scrollY = document.body.style.top; document.body.style.position = ''; document.body.style.top = ''; window.scrollTo(0, parseInt(scrollY || '0') * -1); }

Тепер сторінка залишається в тому самому місці, де користувач зупинився, і після розблокування повертається туди ж.

4. Альтернатива - CSS-клас

Зручно, якщо ти часто відкриваєш модалки:

javascript
/* styles.css */ .no-scroll { overflow: hidden; }
javascript
document.body.classList.add('no-scroll'); // заблокувати document.body.classList.remove('no-scroll'); // розблокувати

Чисто, зручно і легко масштабується.

5. Особливий випадок - блокування скролу на мобільних пристроях

На iOS overflow: hidden іноді не допомагає при тач-скролі всередині <body>. Тоді використовують перехоплення touchmove:

javascript
function preventTouchScroll(e) { e.preventDefault(); } function disableScrollMobile() { document.addEventListener('touchmove', preventTouchScroll, { passive: false }); } function enableScrollMobile() { document.removeEventListener('touchmove', preventTouchScroll); }

Цей спосіб можна поєднувати з overflow: hidden для надійності.

Підсумок

МетаСпосібПримітка
Просто заблокуватиdocument.body.style.overflow = 'hidden'Підходить у 95% випадків
Зберегти позиціюposition: fixed + top = -scrollYБез "стрибка" при знятті блокування
Часте використанняДодавання класу .no-scrollЗручно для модалок
Мобільна надійністьtouchmove + preventDefaultДля iOS Safari

Запам'ятай просто: overflow: hidden блокує прокрутку, position: fixed фіксує положення, touchmove.preventDefault() захищає від тач-скролу на мобільних.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.