【问题标题】:How can I make the contents of a fixed element scrollable only when it exceeds the height of the viewport?如何使固定元素的内容仅在超过视口高度时才可滚动?
【发布时间】:2013-09-24 12:30:48
【问题描述】:

我有一个div 位于网页左侧的fixed,其中包含菜单和导航链接。它没有从css设置高度,内容决定高度,宽度是固定的。问题是如果内容太多,div会大于窗口的高度,部分内容将不可见。 (滚动窗口没有帮助,因为位置是fixeddiv 不会滚动。)

我尝试设置 overflow-y:auto; 但这也无济于事,div 似乎没有注意到它的一部分在窗口之外。

如果div 挂在窗口外,如果需要,我怎样才能使其内容仅可滚动?

【问题讨论】:

  • 可以在此处找到使用 CSS calc() 的解决方案:stackoverflow.com/q/29754195/3168107.
  • calc() 是一个experimental technology,可能会导致unexpected results。如果您选择使用它,请确保您了解您的目标受众并在这些浏览器中进行测试。
  • 遇到了同样的问题并使用了类似 max-height: calc(100vh - 100px);我的导航栏和内边距达到 100 像素

标签: html css css-position


【解决方案1】:

你可能做不到。这是接近的东西。如果下面有空间,您将不会让内容围绕它流动。

http://jsfiddle.net/ThnLk/1289

.stuck {
    position: fixed;
    top: 10px;
    left: 10px;
    bottom: 10px;
    width: 180px;
    overflow-y: scroll;
}

你也可以做一个百分比高度:

http://jsfiddle.net/ThnLk/1287/

.stuck {
    max-height: 100%;
}

【讨论】:

    【解决方案2】:

    下面的链接将演示我是如何做到这一点的。不是很难 - 只需要使用一些聪明的前端开发人员!

    <div style="position: fixed; bottom: 0%; top: 0%;">
    
        <div style="overflow-y: scroll; height: 100%;">
    
           Menu HTML goes in here
    
        </div>
    
    </div>
    

    http://jsfiddle.net/RyanBrackett/b44Zn/

    【讨论】:

    • 被低估的答案。对于我的用例 - 外部 div 样式为 position: fixed; bottom: 0%; top: 0%; overflow: scroll; height: 100vh; 将使外部 div 基于内容滚动。
    • 对于那些top 属性不是 0 的人来说,这是一个很好的答案。在这种情况下,滚动条不会到达内容的末尾。
    【解决方案3】:

    在你的位置上试试这个:固定元素。

    overflow-y: scroll;
    max-height: 100%;
    

    【讨论】:

      【解决方案4】:

      您可能需要一个内部 div。用css是:

      .fixed {
         position: fixed;
         top: 0;
         left: 0;
         bottom: 0;
         overflow-y: auto;
         width: 200px; // your value
      }
      .inner {
         min-height: 100%;
      }
      

      【讨论】:

        【解决方案5】:

        这完全可以通过一些 flexbox 魔法来实现。看看这个pen

        你需要这样的css:

        aside {
          background-color: cyan;
          position: fixed;
          max-height: 100vh;
          width: 25%;
          display: flex;
          flex-direction: column;
        }
        
        ul {
          overflow-y: scroll;
        }
        
        section {
          width: 75%;
          float: right;
          background: orange;
        }
        

        这将适用于IE10+

        【讨论】:

          【解决方案6】:

          这里是纯 HTML 和 CSS 解决方案。

          1. 我们为导航栏创建一个容器框 位置:固定; 高度:100%;

          2. 然后我们用 高度:100%; 溢出-y:滚动;

          3. 接下来,我们将内容放在那个盒子里。

          代码如下:

          .nav-box{
                  position: fixed;
                  border: 1px solid #0a2b1d;
                  height:100%;
             }
             .inner-box{
                  width: 200px;
                  height: 100%;
                  overflow-y: scroll;
                  border: 1px solid #0A246A;
              }
              .tabs{
                  border: 3px solid chartreuse;
                  color:darkred;
              }
              .content-box p{
                height:50px;
                text-align:center;
              }
          <div class="nav-box">
            <div class="inner-box">
              <div class="tabs"><p>Navbar content Start</p></div>
              <div class="tabs"><p>Navbar content</p></div>
              <div class="tabs"><p>Navbar content</p></div>
              <div class="tabs"><p>Navbar content</p></div>
              <div class="tabs"><p>Navbar content</p></div>
              <div class="tabs"><p>Navbar content</p></div>
              <div class="tabs"><p>Navbar content</p></div>
              <div class="tabs"><p>Navbar content</p></div>
              <div class="tabs"><p>Navbar content</p></div>
              <div class="tabs"><p>Navbar content</p></div>
              <div class="tabs"><p>Navbar content</p></div>
              <div class="tabs"><p>Navbar content End</p></div>
              </div>
          </div>
          <div class="content-box">
            <p>Lorem Ipsum</p>
            <p>Lorem Ipsum</p>
            <p>Lorem Ipsum</p>
            <p>Lorem Ipsum</p>
            <p>Lorem Ipsum</p>
            <p>Lorem Ipsum</p>
            <p>Lorem Ipsum</p>
            <p>Lorem Ipsum</p>
            <p>Lorem Ipsum</p>
            <p>Lorem Ipsum</p>
            <p>Lorem Ipsum</p>
            <p>Lorem Ipsum</p>
          </div>

          Link to jsFiddle:

          【讨论】:

            【解决方案7】:

            我将此作为解决方法而不是解决方案。这可能不会一直有效。我这样做是因为我在一个非常奇怪的环境中做一个非常基本的 HTML 页面,供内部使用。我知道有像 MaterializeCSS 这样的库可以做非常好的导航栏。 (我打算使用它们,但它不适用于我的环境。)

            <div id="nav" style="position:fixed;float:left;overflow-y:hidden;width:10%;"></div>
            <div style="margin-left:10%;float:left;overflow-y:auto;width:60%;word-break:break-all;word-wrap:break-word;" id="content"></div>
            

            【讨论】:

              【解决方案8】:

              将此添加到您的代码中以获得固定高度并添加一个滚动条。

              .fixedbox {
                  max-height: auto;
                  overflow-y: scroll;
              }
              

              【讨论】:

              【解决方案9】:

              为了你的目的,你可以使用

              position: absolute;
              top: 0%;
              

              它仍然可以调整大小、滚动和响应。

              【讨论】:

                猜你喜欢
                • 2012-04-08
                • 2021-10-09
                • 2020-04-28
                • 2020-10-09
                • 1970-01-01
                • 1970-01-01
                • 2019-01-13
                • 1970-01-01
                • 2014-08-24
                相关资源
                最近更新 更多