【问题标题】:prevent popover from creating scroll in parent (in pure css)防止弹出框在父级中创建滚动(在纯 CSS 中)
【发布时间】:2017-11-25 20:56:09
【问题描述】:

我想创建一个简单的弹出框显示在适当的位置(想想按钮下方的组合框列表)。弹出框应显示在现有元素上,即不预先分配空间。

有很多使用 `position: relative -> overflow: hidden -> position: absolute' 层次结构和工作直到弹出框从容器底部流出的例子,在这种情况下,它的大小会影响父容器并创建一个滚动。

这是codepen sample。我想要得到的是在最右边的列上没有滚动。

<div class="main">
  <div class="column">
    <h2>no overflow</h2>
    <div class="tall">x</div>
    <div class="tall">x</div>
  </div>
  <div class="column">
    <h2>basic overflow</h2>
    <div class="tall">x</div>
    <div class="tall">x</div>
    <div class="tall">x</div>
  </div>
  <div class="column">
    <h2>popover without overflow</h2>
    <div class="tall">x</div>
    <div class="overlay">
      popover should be vislble below
      <div class="overflow">
        <div class="absolute short">
          z
        </div>
      </div>
    </div>
    <div class="tall">x</div>
  </div>
  <div class="column">
    <h2>popover with overflow</h2>
    <div class="tall">x</div>
    <div class="overlay">
      popover should be vislble below
      <div class="overflow">
        <div class="absolute">
          z
        </div>
      </div>
    </div>
    <div class="tall">x</div>
  </div>
</div>

还有 scss 文件:

html, body {
  height: 95%;

}

.main {
  display: flex;
  flex-direction: row;
  border: 2px solid red;
  height: 100%;
  .column {
    margin-left: 20px;
    height: 100%;
    flex: 1;
    border: 1px solid black;
    overflow-y: auto;
    .tall {
      height: 300px;
      border: 1px solid blue;
    }
    .overlay {
      position: relative;
      .overflow {
        background: #F00;
        overflow: hidden;
        .absolute {
          opacity: 0.5;
          width: 100%;
          height: 600px;
          position: absolute;
          background: #FF0;
          &.short {
            height: 200px;
          }
        }
      }
    }
  }
}

【问题讨论】:

  • 您是否尝试过这样做?如果是这样,请分享您的代码。
  • 如果弹出框比容器大,为什么不创建滚动条呢?否则,它的某些部分将被隐藏。
  • 使用位置:绝对值和负值不会影响父容器
  • 对不起,由于某种原因,我在完成代码之前发布了。附上代码和链接
  • 我不想滚动的原因是我希望以后能够查询弹出框并查看它是否在屏幕外并进行 js 操作

标签: html css layout flexbox overflow


【解决方案1】:

我认为(如果我对这个问题很清楚的话)这个问题可以很容易地解决,只需用 min-heightmax-height 替换你高年级的 height 如果你将最小高度设置为相等到短高度,那么弹出框不应该溢出。

我制作了自己的codepen 进行演示(我将弹出框高度调整为 100,并将最小高度也设置为 100 以进行演示)。除了.short 类中的高度和.tall 类中的最小/最大高度之外,该代码与您发布的代码相同。如果弹出窗口中内容的高度大于分配的高度,我将overflow:hidden; 添加到短类中。

我已经注释掉了没有弹出框的列,但请随意评论它们。

希望对你有帮助

【讨论】:

  • 谢谢@Rachel,你指的是左栏还是右栏?右列仍然添加滚动条,而右列在弹出框到达列末端之前将其截断。我倾向于使用弹性和响应式设计,并且更喜欢避免物理措施。
  • 左边的是我调整过的——短的。您可以根据需要进行调整。为了比较的目的,我保留了右边的不变。您可以将左边的调整为最大高度:(更大)或自动,但您应该知道弹出框会有多大
  • 再次感谢,看看。它工作得很好,正如你所指出的,我需要提前知道尺寸。我可能会继续寻找基于流的(弹性)解决方案
  • 很高兴我能帮上忙 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 2014-09-27
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 2020-09-05
相关资源
最近更新 更多