【问题标题】:Modal fixed position content shift模态固定位置内容移位
【发布时间】:2016-08-23 14:04:17
【问题描述】:

经过大量研究,我 unable to find a proper solution 负责在模式窗口打开时向右移动固定定位元素、覆盖图像和标准内容。

注意:我正在寻找一个通用的、干净的解决方案,而不是只适用于特定布局的硬编码修复。

有谁知道如何解决这个问题?请参考这个例子: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;
    }
}

【问题讨论】:

  • 因为&.-modal-open {overflow: hidden;}。通过评论检查!
  • 这会给我两个滚动条。我无法从正文中删除 overflow: hidden;,因为它还允许在移动设备上滚动(基本上您将无法滚动模式)。

标签: javascript css modal-dialog


【解决方案1】:

解决方案非常简单,纯 css 修复:

.-modal-open .fixed,
.-modal-open .content {
  overflow-y:scroll;
}

..但是,这要求您的内容采用不同的样式。您永远不应该为您的内容使用边距,而应将其包装在一个容器中并使用填充来代替。

滚动条的宽度并不总是 17px...17px 用于 Firefox,但 15px 用于 chrome,有时 IE 甚至没有滚动条宽度,具体取决于代码。

这是更新后的笔: http://codepen.io/scooterlord/pen/KgKLwB

编辑:忘了说,这是一个跨浏览器的解决方案,在我测试的任何地方都能完美运行。如果浏览器是移动浏览器,那么添加/删除额外滚动条不会改变宽度,并且根据浏览器,新创建的内容/固定元素滚动条始终与初始正文滚动条相同。

【讨论】:

  • 这是一个非常聪明的解决方案!基本上,您通过在内容容器中添加滚动来补偿正文中滚动的移除。
  • 是的,就是这样
  • 封面背景移动的任何可能的解决方案?我试图将它移到容器内,但它仍在移动
  • 您在背景上有 background-size:cover。可能这不是您要用于最终项目的实际背景,因此根据实际背景可能有一种方法可以做到这一点 - 但必须先看到它。
  • 我认为使用什么背景并不重要,通常我将其设置为background-size: cover;,并且当模式打开时会发生变化。我试图将背景移动到容器中,但这并不能解决问题。显然我宁愿使用background-attachment: fixed;,但我仍然看到问题:codepen.io/microcipcip/pen/pEvZrV
【解决方案2】:

主要技巧是不要将正文用作内容包装器。使用专用的 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>

【讨论】:

  • 这个差不多就是我要找的了,不过现在整个内容区都是一个固定定位的元素,我看看这个方案能不能用在页面的正常流程上
  • jea 它可以确保它是第一个 div 并将其视为它的 body 标签
【解决方案3】:

每次打开模态框时给正文添加 17px 的右边距怎么样。这将模拟为滚动条保留的空间。 (17px是标准浏览器宽度的宽度)

body.-modal-open {
    margin-right: 17px;
}

同时,对于固定元素,您需要重新计算宽度;

.-modal-open .fixed {
    width: calc(100% - 17px);
}

还有一个问题,CSS背景图片还是移位了,解决办法就是把它放在一个div容器中而不是body中。

【讨论】:

  • 滚动条的宽度取决于浏览器 AND 操作系统。 Chrome/Linux 是 15px,而在 Windows 上也是 17px。对于 Firefox,它在 Linux 上为 13px。我猜所有这些在 Mac 上都是不同的数字。
猜你喜欢
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
相关资源
最近更新 更多