经过大量研究,我无法找到正确的解决方案,以解决模态窗口打开时向右移动固定定位元素、封面图像和标准内容的问题。
注意:我正在寻找一个通用的、干净的解决方案,而不是仅适用于特定布局的硬编码修复。
有人知道如何解决这个问题吗?请参考这个例子:http://codepen.io/microcipcip/pen/kXdRWK
body {
height: 2500px;
&.-modal-open {
overflow: hidden;
}
}
.fixed {
position: fixed;
top: 0;
left: 0;
width: 100%;
padding: 20px 0;
background: #FF0000;
}
.modal {
overflow-x: hidden;
overflow-y: scroll;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.4);
opacity: 0;
transition: opacity .2s ease-in-out;
body.-modal-open & {
opacity: 1;
}
}
解决方案非常简单,纯 css 修复:
.-modal-open .fixed,
.-modal-open .content {
overflow-y:scroll;
}
..但是,这要求您的内容具有不同的样式。您永远不应该为内容使用边距,而应将其包装在容器中并使用填充。
滚动条的宽度并不总是17px...17px适用于Firefox,但15px适用于chrome,有时IE甚至没有滚动条宽度,具体取决于代码。
这是更新后的笔: http://codepen.io/scooterlord/pen/KgKLwB
编辑:忘了说,这是一个跨浏览器的解决方案,在我测试过的任何地方都可以完美地工作。如果浏览器是移动浏览器,则添加/删除额外滚动条不会发生宽度变化,并且根据浏览器的不同,为内容/固定元素新创建的滚动条始终与初始主体滚动条相同。
主要技巧是不要使用 body 作为内容包装器。使用专用的 div 作为包装器并将模态框放在外面,这样滚动条就不会相互干扰。
var $btnShow = document.querySelector('.show');
var $btnHide = document.querySelector('.hide');
var $body = document.querySelector('.modal');
$btnShow.addEventListener('click', function() {
$body.classList.toggle('-modal-open')
});
$btnHide.addEventListener('click', function() {
$body.classList.toggle('-modal-open')
});
.wrapper {
position: fixed;
top: 0;
left: 0;
bottom:0;
right:0;
overflow: auto;
}
.content {
background: url('https://www.dropbox.com/s/m16kxhb2jg5jwwh/bear-800x450.jpg?dl=0&raw=1');
background-size: cover;
background-position: center center;
height: 2500px;
width: 100%;
}
.clickme {
position: fixed;
top: 50%;
left: 50%;
padding: 10px;
border: none;
background: #000000;
color: #ffffff;
text-transform: uppercase;
transform: translate(-50%, -50%);
}
.clickme:hover {
background: grey;
cursor:pointer
}
.modal {
overflow-x: hidden;
overflow-y: scroll;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.4);
display: none;
transition: opacity .2s ease-in-out;
z-index: 3;
}
.modal.-modal-open {
display:block;
}
.modal-content {
min-height: 1500px;
margin: 100px;
background: url('https://www.dropbox.com/s/u520y7yo711uaxi/poster2.jpg?dl=0&raw=1');
background-size: cover;
}
<div class="modal">
<div class="modal-content">Content
<button class="clickme hide">Toggle Modal HIDE!</button>
</div>
</div>
<div class="wrapper">
<div class="content">
<button class="clickme show">Toggle Modal SHOW!</button>
</div>
</div>
.modal-open {
padding-right: 0 !important;
padding-left: 0 !important;
}
html {
overflow-y: scroll !important;
}
每次打开模态框时,向正文添加 17px 右边距如何?这将模拟为滚动条保留的空间。 (17px是标准浏览器宽度的宽度)
body.-modal-open {
margin-right: 17px;
}
同时,对于固定元素,您需要重新计算宽度;
.-modal-open .fixed {
width: calc(100% - 17px);
}
仍然存在一个问题,CSS 背景图像仍然发生偏移,解决方案是将其放置在 div 容器中而不是正文中。