【问题标题】:Scroll part of content in fixed position container滚动固定位置容器中的部分内容
【发布时间】:2012-04-26 14:38:03
【问题描述】:

我在布局中有一个position: fixed div,作为侧边栏。我被要求将其部分内容固定在其顶部(内部),其余的则滚动如果它溢出 div 的底部

我查看了this answer,但是那里提供的解决方案不适用于position: fixedposition: absolute 容器,这很痛苦。

我已经对我的问题here 进行了 JSFiddle 演示。理想情况下,大量文本应该滚动,而不是溢出到页面底部。标题的高度可以随内容而变化,并且可以是动画的。

body {
    background: #eee;
    font-family: sans-serif;
}

div.sidebar {
    padding: 10px;
    border: 1px solid #ccc;
    background: #fff;
    position: fixed;
    top: 10px;
    left: 10px;
    bottom: 10px;
    width: 280px;
}
div#fixed {
    background: #76a7dc;
    padding-bottom: 10px;
    color: #fff;
}

div#scrollable {
    overlow-y: scroll;
}
<div class="sidebar">
    <div id="fixed">
        Fixed content here, can be of varying height using jQuery $.animate()        
    </div>

    <div id="scrollable">
        Scrolling content<br><br>
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
        
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    </div>
</div>

如果没有固定的标题,我可以简单地将overflow-y: scroll 添加到div.sidebar,如果它溢出容器的底部,我可以愉快地滚动它的所有内容。但是,我遇到了在侧边栏顶部有一个固定的、可变高度的标题的问题,并且如果滚动条太长而无法放入容器中,则在该滚动条下方有任何内容。

div.sidebar 必须留在position: fixed,我非常希望在没有任何黑客攻击的情况下做到这一点,并使其尽可能跨浏览器。我尝试了各种方法,但都没有奏效,我不确定从这里尝试什么。

position: fixed 容器内的 div 的内容溢出包含的 div 时,如何使 div 仅在 Y 方向滚动,并且具有可变的、不确定的高度的固定标题?我非常想远离 JS,但如果我必须使用它,我会的。

【问题讨论】:

  • 我不确定是否存在纯 css 解决方案。基本上您尝试修复 div#fixed,但是当您这样做时,您会将其从文档的正常流程中移除,因此高度不会将其他元素推到页面下方。
  • 考虑到非滚动 div 位于侧边栏内容的顶部,它不一定是 position: fixed - 它可以正常流。我想知道是否有办法将overflow: scroll 元素的顶部向下推到非滚动div 的高度。实际上不是position: fixed。我的意思是“固定”,如“不滚动溢出”。
  • 看来您在小提琴上取得了一些进展,如果您删除 div#sidebar 上的底部属性,则 div 将扩展以适应内容
  • 为什么侧边栏不能是绝对位置或相对位置?您希望它与页面一起滚动吗?不是,把滚动条放在侧边栏上?
  • 抱歉,我忘记添加了 - 侧边栏不会滚动,并且总是会拉伸以适应窗口。

标签: css overflow


【解决方案1】:

如果你使用它似乎可以工作

div#scrollable {
    overflow-y: scroll;
    height: 100%;
}

并将padding-bottom: 60px 添加到div.sidebar

例如:http://jsfiddle.net/AKL35/6/

但是,我不确定为什么一定是60px

另外,你错过了来自overflow-y: scroll;f

【讨论】:

  • 它适用于padding-top: 50px,因为蓝色标题的高度正好是 50px。我希望允许该标题的高度可变,尽管很明显我可以解决这个问题的唯一方法是使用 JavaScript,我不想这样做。
  • 这不适用于旧版浏览器,例如 iOS 4.2 或 Android 2.3 的 Mobile Safari。如果有人有解决方案 - 发布!
  • 另外,请改用overflow: auto,因为它只会在溢出时显示滚动条。
  • 为了在 ios/android 上平滑滚动,如果您遇到滚动延迟,请确保设置 -webkit-overflow-scrolling: touch...在科尔多瓦基础应用程序或其他框架中很有用。
【解决方案2】:

什么对我有用:

div#scrollable {
    overflow-y: scroll;
    max-height: 100vh;
}

【讨论】:

  • 它有效。有人可以解释为什么)它完全按照我需要的方式工作 - 使叠加层具有 100% 的内容,覆盖所有其他 div(位于顶部)并且可滚动,但我不明白为什么会这样。 max-height: 100% 例如拒绝滚动
【解决方案3】:

我将可滚动的 div 更改为具有绝对位置,一切都适合我

div.sidebar {
    overflow: hidden;
    background-color: green;
    padding: 5px;
    position: fixed;
    right: 20px;
    width: 40%;
    top: 30px;
    padding: 20px;
    bottom: 30%;
}
div#fixed {
    background: #76a7dc;
    color: #fff;
    height: 30px;
}

div#scrollable {
    overflow-y: scroll;
    background: lightblue;

    position: absolute;
    top:55px; 
    left:20px;
    right:20px;
    bottom:10px;
}

DEMO with two scrollable divs

【讨论】:

    【解决方案4】:

    实际上这是更好的方法。如果使用height: 100%,则内容会超出边界,但如果使用95%,则一切正常:

    div#scrollable {
        overflow-y: scroll;
        height: 95%;
    }
    

    【讨论】:

      【解决方案5】:

      将可滚动的 div 设置为具有 max-size 并将 overflow-y: scroll; 添加到它的属性中。

      编辑:试图让 jsfiddle 工作,但它不能正确滚动。这需要一些时间才能弄清楚。

      【讨论】:

      • 抱歉,我忘记补充了,侧边栏总是拉伸以适应窗口,并且不随页面滚动,所以max-size在这里不适用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多