【问题标题】:Limit height with distance from page bottom与页面底部的距离限制高度
【发布时间】:2017-09-02 00:32:15
【问题描述】:

我有一个 web 应用程序,一侧有按钮。当我单击其中一个按钮 *JavaScript magic* 时,旁边会出现一个菜单。该脚本对定位或样式一无所知,它只是找到一个目标元素然后在其中写入 HTML。

简而言之,我有一个相对于其父级(本例中为#pretty-target)定位的菜单。

<div class="container">
    <button class="my-pretty-button">@</button>
    <div class="menu-target" id="pretty-target"></div>
</div>

结果如下:

现在,当我降低页面高度时,我想限制此菜单的高度,具体取决于它与页面底部的距离。一个超理想的结果应该是这样的:

我知道最好的做法是拥有一个可滚动的页面正文,而不必担心此类元素的高度。但是,我的页面正文是一张地图,因此任何滚动它的尝试都只会移动地图。

我当然可以通过使用可滚动覆盖来制作一些替代的东西,或者更好的是,通过使用媒体查询来选择更好的方法来显示这些菜单。但是,它们不会以这种方式显示。

简而言之:我有一个独立于页面的 div,我希望它受到页面高度的高度限制。这怎么能工作(不使用 JS)?

【问题讨论】:

    标签: css css-position


    【解决方案1】:

    如果您的目标是现代浏览器,您可以使用calcvh 来实现您的目标。 如果需要将按钮放置在屏幕中间,只需将.popupmax-height减去按钮的位置即可。

    .wrapper {
      position: absolute;
      top: 80px; /*the position of your floating button*/
      right: 50px;
    }
    
    .button {
      display: block;
      width: 50px;
      padding: 10px;
      float: right;
      box-sizing: border-box;
      text-align: center;
      border: 1px solid red;
    }
    
    .popup {
      position: absolute;
      max-height: calc(100vh - 50px - 80px); /*modify the value to fit your needs, 80px is the position of your floating button*/
      overflow-y: scroll;
      width: 100px;
      padding: 10px;
      right: 55px;
      top: 0;
      border: 1px solid blue;
    }
    <div class="wrapper">
      <span class="button">Star</span>
      <div class="popup">
        <p>Option 1</p>
        <p>Option 2</p>
        <p>Option 3</p>
        <p>Option 4</p>
        <p>Option 5</p>
        <p>Option 6</p>
        <p>Option 7</p>
        <p>Option 8</p>
        <p>Option 9</p>
      </div>
    </div>

    【讨论】:

    • 好的,这适用于页面顶部的菜单,但如果中间有一些菜单呢?
    • @GnxR 我编辑了我的答案。由于您不想要 JS 解决方案,所以我制作了 .wrapper position: absolute;,因此您可以从 .popupmax-height 中减去 top 的值。希望对您有所帮助。
    【解决方案2】:

    一种选择是使用viewport units.

    像这样简单的东西应该可以工作:

    .menu-target {
        max-height: calc(100vh - 100px); /* 100px to match whatever offsets you might need for headers etc */
        overflow-y: scroll;
    }
    

    Example jsfiddle.

    【讨论】:

    • 好的,这适用于页面顶部的菜单,但如果中间有一些菜单呢?
    • @GnxR 这个解决方案非常灵活,无论放在哪里都应该可以工作。它只依赖于你知道它放置的顶部有多少像素。要使其降低,请更改该值。如果你不知道,或者不想硬编码,你可以使用 max-height: 60vh; 或类似的,但在不同的浏览器高度上会不太一致。
    • @fredrivett 谢谢!没想到这么简单;D
    猜你喜欢
    • 2019-05-27
    • 2016-12-18
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2012-04-17
    相关资源
    最近更新 更多