我试图做到这一点,以便当打开模式时,用户将无法滚动页面。但是,如果我简单地在
overflow: hidden
上添加 <body>
,滚动条会很快消失,内容会突然向右移动,看起来相当难看。如何将滚动“冻结”在我当前所在的位置,保持滚动条可见,并确保所有功能,例如,hide on scroll
上的<header>
,在带有黑色的模态下底衬不会被触发?
我尝试了不同的方法,其中一种直接将其添加到
<body>
:
position: fixed;
height: 100%;
width: 100%;
top: 0;
left: 0;
overflow-y: scroll;
在这种情况下,滚动条是可见的,我们无法滚动,但是
position: fixed;
使视口在打开模态框时跳转到顶部,因此这种方法并不理想(我不需要任何跳转)。
我使用 Vue,这是我的 App.vue 模板的样子:
<template>
<div>
<AppModal></AppModal>
<AppHeader></AppHeader>
<AppMain></AppMain>
<AppFooter></AppFooter>
</div>
</template>
我正在寻找最简洁的解决方案不涉及JS。
首先要重现内容移动的问题,我们需要有一个固定的标题。 (您的问题中缺少这部分)。现在,如果正文变为
overflow-y:hidden
,滚动条将消失,从而导致标题中的内容发生变化。
修复方法是将标题放在容器内,并在主体失去滚动条时立即出现一个抵消的
overflow-y:scroll
。
btn.onclick = function(ev) {
document.body.classList.add("fixed")
}
btn2.onclick = function(ev) {
document.body.classList.remove("fixed")
}
body {
overflow-y: scroll;
margin: 0;
}
body.fixed {
overflow-y: hidden;
}
.header-container {
top: 0;
position: sticky;
pointer-events: none;
width: 100%;
}
body.fixed .header-container {
overflow-y: scroll;
}
body .modal {
display: none;
}
body.fixed .modal {
display: block;
}
.header {
width: 100%;
text-align: center;
padding: 25px 0;
top: 0;
background: yellow;
box-shadow: 0 0 10px purple;
}
.modal {
padding: 20px;
text-align: center;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.75);
z-index: 1;
}
<body>
<div class="header-container">
<div class="header">
header
</div>
</div>
<h1>hello world</h1>
<p>sdflkjsdfl kjsf</p>
<h1>hello world</h1>
<p>sdflkjsdfl kjsf</p>
<h1>hello world</h1>
<p>sdflkjsdfl kjsf</p>
<button id="btn">open modal</button>
<h1>hello world</h1>
<p>sdflkjsdfl kjsf</p>
<h1>hello world</h1>
<p>sdflkjsdfl kjsf</p>
<h1>hello world</h1>
<p>sdflkjsdfl kjsf</p>
<div class="modal">
<h2>hello i am modal</h2>
<button id="btn2">close</button>
</div>
</body>