Modals: preserve page scroll position while locking background
This commit is contained in:
@@ -36,16 +36,23 @@
|
||||
function closeModal(id){ var d=document.getElementById(id); if(d) d.close(); syncModalScrollLock(); }
|
||||
function openModalData(btn){ openModal(btn.dataset.modal); }
|
||||
function closeModalData(btn){ closeModal(btn.dataset.modal); }
|
||||
/* Пока открыта хоть одна модалка — блокируем прокрутку страницы (внутри .modal-body прокрутка остаётся). */
|
||||
/* Пока открыта хоть одна модалка — блокируем прокрутку страницы, сохраняя позицию скролла
|
||||
(внутри .modal-body прокрутка остаётся). */
|
||||
var modalScrollY = 0;
|
||||
function syncModalScrollLock(){
|
||||
var root = document.documentElement;
|
||||
if (document.querySelector('dialog[open]')) {
|
||||
if (root.classList.contains('modal-open')) return;
|
||||
modalScrollY = window.scrollY || window.pageYOffset || 0;
|
||||
var sw = window.innerWidth - root.clientWidth;
|
||||
root.style.setProperty('--modal-scrollbar', (sw > 0 ? sw : 0) + 'px');
|
||||
root.style.setProperty('--modal-top', (-modalScrollY) + 'px');
|
||||
root.classList.add('modal-open');
|
||||
} else {
|
||||
} else if (root.classList.contains('modal-open')) {
|
||||
root.classList.remove('modal-open');
|
||||
root.style.removeProperty('--modal-scrollbar');
|
||||
root.style.removeProperty('--modal-top');
|
||||
window.scrollTo(0, modalScrollY);
|
||||
}
|
||||
}
|
||||
document.addEventListener('toggle', function (e) {
|
||||
|
||||
Reference in New Issue
Block a user