let pageEl = document.querySelector(".page");
let modalEl = document.querySelector(".modal");
function openModal(e){
e.preventDefault();
pageEl.classList.add("page--has-modal");
modalEl.classList.remove("hidden");
window.addEventListener("wheel", preventScroll);
window.addEventListener("touchmove", preventScroll);
}
function closeModal(e){
e.preventDefault();
pageEl.classList.remove("page--has-modal");
modalEl.classList.add("hidden");
window.removeEventListener("wheel", preventScroll);
window.removeEventListener("touchmove", preventScroll);
}
window.addEventListener("click", function(){
console.log(modalEl.scrollHeight);
console.log(modalEl.clientHeight);
});
function preventScroll(e){
if (!isDescendant(modalEl, e.target)){
e.preventDefault();
return false;
}
let modalTop = modalEl.scrollTop === 0;
let modalBottom = modalEl.scrollTop === (modalEl.scrollHeight - modalEl.clientHeight);
if (modalTop && e.deltaY < 0){
e.preventDefault();
} else if (modalBottom && e.deltaY > 0){
e.preventDefault();
}
}
function isDescendant(parent, child) {
var node = child.parentNode;
while (node != null) {
if (node == parent) {
return true;
}
node = node.parentNode;
}
return false;
}
.page {
-webkit-overflow-scrolling: touch;
}
.page--has-modal {
-webkit-overflow-scrolling: auto;
}
.modal {
position: absolute;
top: 50px;
left: 50px;
right: 50px;
bottom: 50px;
background: #c0c0c0;
padding: 50px;
text-align: center;
overflow: auto;
-webkit-overflow-scrolling: auto;
}
.hidden {
display: none;
}
<div class="page">
<button onclick="openModal(event);">Open modal</button>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer consequat sapien a lectus gravida euismod. Sed vitae nisl non odio viverra accumsan. Curabitur nisi neque, egestas sed, vulputate sit amet, luctus vitae, dolor. Cras lacus massa, sagittis ut, volutpat consequat, interdum a, nulla. Vivamus rhoncus molestie nulla. Ut porttitor turpis sit amet turpis. Nam suscipit, justo quis ullamcorper sagittis, mauris diam dictum elit, suscipit blandit ligula ante sit amet mauris. Integer id arcu. Aenean scelerisque. Sed a purus. Pellentesque nec nisl eget metus varius tempor. Curabitur tincidunt iaculis lectus. Aliquam molestie velit id urna. Suspendisse in ante ac nunc commodo placerat.</p>
<p>Morbi gravida posuere est. Fusce id augue. Sed facilisis, felis quis ornare consequat, neque risus faucibus dui, quis ullamcorper tellus lacus vitae felis. Phasellus ac dolor. Integer ante diam, consectetuer in, tempor vitae, volutpat in, enim. Integer diam felis, semper at, iaculis ut, suscipit quis, dolor. Vestibulum semper, velit et tincidunt vehicula, nisl risus eleifend ipsum, vel consectetuer enim dolor id magna. Praesent hendrerit urna ac lacus. Maecenas porttitor ipsum sed orci. In ac odio vel lorem tincidunt pellentesque. Nam tempor pulvinar turpis. Nunc in leo in libero ultricies interdum. Proin ut urna. Donec ultricies nunc dapibus justo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent vulputate, lectus pulvinar nonummy eleifend, sapien urna posuere metus, vel auctor risus odio eu augue. Cras vitae dolor. Phasellus dolor. Etiam enim. Donec erat felis, tincidunt quis, luctus in, faucibus at, est.</p>
<div class="modal hidden">
Hi there!
<button onclick="closeModal(event);">Close me</button>
<p>Morbi gravida posuere est. Fusce id augue. Sed facilisis, felis quis ornare consequat, neque risus faucibus dui, quis ullamcorper tellus lacus vitae felis. Phasellus ac dolor. Integer ante diam, consectetuer in, tempor vitae, volutpat in, enim. Integer diam felis, semper at, iaculis ut, suscipit quis, dolor. Vestibulum semper, velit et tincidunt vehicula, nisl risus eleifend ipsum, vel consectetuer enim dolor id magna. Praesent hendrerit urna ac lacus. Maecenas porttitor ipsum sed orci. In ac odio vel lorem tincidunt pellentesque. Nam tempor pulvinar turpis. Nunc in leo in libero ultricies interdum. Proin ut urna. Donec ultricies nunc dapibus justo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent vulputate, lectus pulvinar nonummy eleifend, sapien urna posuere metus, vel auctor risus odio eu augue. Cras vitae dolor. Phasellus dolor. Etiam enim. Donec erat felis, tincidunt quis, luctus in, faucibus at, est.</p>
</div>
</div>
我很想看到一个干净的解决方案,但最近我有这个问题。我必须使用Javascript来记录当前的滚动位置,并在卸载叠加层时恢复它。可能是我们能做的所有事情,直到Safari获得其与网络其他部分的行为。 –
你是说你不能“我不能保存scrollY和重置关闭”,或者你不知道如何。 – jerrylow
正在说我不能这样做,因为叠加层是透明的,你可以看到它已经滚动,但是使用下面的答案抵消顶部修复。谢谢! – jcmitch