Для сафари одним overflow: hidden не обойтись, он все равно будет скроллить боди, если у него большое содержимое. Нужно костылить. Чаще всего пишу что-то типа этого
const bodyEl = document.body;
let lastScrollPos = 0;
const scrollBodyLock = () => {
lastScrollPos = window.pageYOffset;
bodyEl.style.overflow = 'hidden';
bodyEl.style.position = 'fixed';
bodyEl.style.top = `-${lastScrollPos}px`;
bodyEl.style.width = '100%';
}
const scrollBodyUnlock = () => {
bodyEl.style.removeProperty('overflow');
bodyEl.style.removeProperty('position');
bodyEl.style.removeProperty('top');
bodyEl.style.removeProperty('width');
window.scrollTo(0, lastScrollPos);
}
(можно часть свойств переписать на css класс, и просто его добавлять/удалять, так код получится чуток проще).
Просто дергаете scrollBodyLock во время показа меню, и scrollBodyUnlock когда закрываете меню.