【问题标题】:How to make a container occupy remaining vertical space inside fixed parent element?如何使容器占据固定父元素内剩余的垂直空间?
【发布时间】:2016-01-07 03:23:01
【问题描述】:

我在 固定 顶部有一些内容(它必须相对于视口定位)div 和下面的(可滚动)列表。

我希望列表从兄弟元素的底部开始,并在固定父元素的底部结束。我可以使用top: 123px;,但顶部内容的高度可变(height:calc(100%-123px);margin 相同)。 每个职位都有一些东西使他们不适合这份工作(例如:absolute 元素不考虑兄弟姐妹)。

Fiddle(不需要边框和边距)

#fixed-wrapper {
  border: 1px solid blue;
  position: fixed;
  top: 32px;
  bottom: 30px;
  left: 5px;
  right: calc(30%-5px);
}
#fixed-wrapper .scrollable-list {
  position: absolute;
  overflow-y: scroll;
  top: 50px;
  bottom: 0px;
  color: red;
  border: 1px solid red;
}
.some-bar, .some-other-bar {
  border: 1px solid green;
  margin: 2px;
  padding 2px;
}
<div id="fixed-wrapper">
  <div class="some-bar">some variable length text</div>
  <div class="some-other-bar">some image or text</div>
  <div class="scrollable-list">
    <div class="list-item">item1</div>
    <div class="list-item">item2</div>
    <div class="list-item">item1</div>
    <div class="list-item">item2</div>
    <div class="list-item">item1</div>
    <div class="list-item">item2</div>
    <div class="list-item">item1</div>
  </div>
</div>

我怎样才能使这个设计工作?或者,或者,我怎么可能重新组织 DOM(或使用其他标签,可能是丑陋的表格)来拥有这些属性?

编辑:该解决方案只需要在 Chrome 下工作。

【问题讨论】:

  • 只是为了澄清,所以您希望列表项从红色边框的底部开始,不是吗?
  • 不,兄弟元素是指列表的兄弟元素,所以上面的 绿色
  • 我知道了,旁注,复制/粘贴小提琴中的代码并将其插入问题本身,否则它可能会被关闭。
  • 啊...那么是的,flexbox 可以工作。

标签: html css scroll css-position


【解决方案1】:

你可以像这样使用 javascript:https://jsfiddle.net/DIRTY_SMITH/komfhjdj/3/

<div id="fixed-wrapper">
  <div id="varHeight" class="some-bar">some variable length text</div>
  <div id="staticHeight" class="some-other-bar">some image or text</div>
  <div class="scrollable-list" id="list">
    <div class="list-item">item1</div>
    <div class="list-item">item2</div>
    <div class="list-item">item1</div>
    <div class="list-item">item2</div>
    <div class="list-item">item1</div>
    <div class="list-item">item2</div>
    <div class="list-item">item1</div>
  </div>
</div>
<script>
var sHeight = document.getElementById('staticHeight').offsetHeight;
var vHeight = document.getElementById('varHeight').offsetHeight;
var totalHeight = sHeight + vHeight;

totalHeight = totalHeight + 6;

document.getElementById("list").style.top = totalHeight + "px";

</script>

【讨论】:

  • 我接受了 flexbox 的答案,因为我主要寻找 css 解决方案,但这也适用于我。如果我没记错的话,我也可以监听变化?
【解决方案2】:

您可以使用 CSS3 弹性框。我添加了&lt;div class="scrollable-wrapper"&gt; 以使您尝试实现的布局成为可能。

看代码sn-p里面的cmets,很容易理解。所以flex: 1; 表示flex-grow: 1; 占用所有可用空间。

https://jsfiddle.net/komfhjdj/1/

#fixed-wrapper {
  border: 1px solid blue;
  position: fixed;
  top: 32px;
  bottom: 30px;
  left: 5px;
  right: calc(30%-5px);
  display: flex; /*added*/
  flex-direction: column; /*added*/
}
.scrollable-wrapper {
  position: relative; /*added*/
  flex: 1; /*added*/
}
.scrollable-list {
  position: absolute;
  overflow-y: scroll;
  top: 0; /*updated*/
  bottom: 0;
  color: red;
  border: 1px solid red;
}
.some-bar, .some-other-bar {
  border: 1px solid green;
  margin: 2px;
  padding 2px;
}
<div id="fixed-wrapper">
  <div class="some-bar">some variable length text</div>
  <div class="some-other-bar">some image or text</div>
  <div class="scrollable-wrapper"> <!-- added this div -->
    <div class="scrollable-list">
      <div class="list-item">item1</div>
      <div class="list-item">item2</div>
      <div class="list-item">item1</div>
      <div class="list-item">item2</div>
      <div class="list-item">item1</div>
      <div class="list-item">item2</div>
      <div class="list-item">item1</div>
    </div>
  </div>
</div>

【讨论】:

  • 很好,不知何故我对 css3 解决方案一无所知。顺便说一下,包装器是必要的还是好的?名单上的flex: 1也做到了。
  • 等等,你是说这个吗? jsfiddle.net/komfhjdj/4 它会滚动,但盒子的宽度会变满,无论如何,请随意玩耍,并找到最适合您的方式。
  • 是的,我就是这个意思。所以我也忘了提到该列表已经是全宽的(并且打算是全宽的)。在小提琴中,position: absolute 只是我最后一次尝试解决这个问题。我现在也得到了答案(在某些情况下,包装器实际上有帮助)。
猜你喜欢
  • 2016-01-08
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 2019-07-26
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
相关资源
最近更新 更多