/* Блокируем прокрутку основного контента при открытом меню */ body.menu-open { overflow: hidden; position: fixed; width: 100%; height: 100%; top: 0; left: 0; right: 0; bottom: 0; } /* Настройка самого меню */ #mmenus { overscroll-behavior: contain !important; /* КРИТИЧНО: блокирует "цепную" прокрутку */ -webkit-overflow-scrolling: touch; /* Плавная прокрутка на iOS */ max-height: 100vh !important; overflow-y: auto !important; touch-action: pan-y; /* Улучшает поведение на тач-устройствах */ } document.addEventListener('DOMContentLoaded', () => { const menu = document.getElementById('mmenus'); const body = document.body; if (!menu) return; // Определяем активный класс меню (адаптируйте под ваш плагин!) const OPEN_CLASS = menu.classList.contains('mm-opened') ? 'mm-opened' : (menu.classList.contains('open') ? 'open' : 'active'); // Обновление состояния const updateState = () => { body.classList.toggle('menu-open', menu.classList.contains(OPEN_CLASS)); }; // Инициализация updateState(); // Отслеживаем изменения классов меню (работает с любым плагином: mmenu, самописным и т.д.) const observer = new MutationObserver(updateState); observer.observe(menu, { attributes: true, attributeFilter: ['class'] }); // Дополнительная защита: блокируем скролл при видимом меню (на случай анимаций) let scrollLockTimer; const lockScroll = () => { clearTimeout(scrollLockTimer); if (menu.classList.contains(OPEN_CLASS)) { scrollLockTimer = setTimeout(() => { if (menu.classList.contains(OPEN_CLASS)) { body.classList.add('menu-open'); } }, 150); } }; // Слушаем клики на потенциальных триггерах (кнопки, оверлей) document.addEventListener('click', (e) => { if (e.target.closest('.menu-toggle, .hamburger, [data-menu-toggle]') || e.target.closest('.mmenu-overlay, .mm-close')) { lockScroll(); } }); });