Фиксированное мобильное меню с остановкой скролла
Привет! Сегодня у нас лайтовенькая, но довольно важная статья. Покажу скрипт, который будет тормозить скролл сайта при открытии мобильного меню (и на iPhone тоже), ну а при закрытии - возобновлять. Все мы знаем, как непросто на iPhone скролл отключить, но тут максимально простая и рабочая фича. Поехали!
Итак, все делаем через position: fixed
и простой скриптец. И да, конечно же, эта фича сработает только для мобильного меню (полноэкранного), ибо иначе будет некрасиво. HTML тут не супер важен, посмотрите на примере
CSS
.is-menu-open {
position: fixed;
overflow: hidden;
}
is-menu-open
— класс, который будет добавляться когда меню открыто.
JS
const burger = document.querySelector('.burger');
const menuLinks = document.querySelectorAll('.mobile-menu a');
const mobileMenu = document.querySelector('.mobile-menu');
burger.addEventListener('click', (e) => {
e.preventDefault();
let pagePos = window.scrollY;
document.body.classList.add('is-menu-open');
document.setAttribute('data-scroll', pagePos);
mobileMenu.style.display = 'block';
});
menuLinks.forEach(el => {
el.addEventListener('click', (e) => {
e.preventDefault();
let pos = parseInt(document.body.getAttribute('data-scroll'));
mobileMenu.style.display = 'none';
document.body.classList.remove('is-menu-open');
document.setAttribute('data-scroll', '');
window.scrollTo(0, pos);
});
});
Собственно, по бургеру открываем меню (стандартные вещи) и сохраняем в переменную pagePos
текущую позицию скролла. Затем, уже по закрытию меню мы скроллим сайт на эту же позицию, убирая класс, содержащий position: fixed
. И, поскольку меню у нас с фоном (и выше) — внешне ничего не видно, но скролл сохраняется.
Вот такая вот мелочь, но довольно полезная мелочь. Надеюсь, кому-то помогло)