2016-01-06 75 views
1

我在固定的(它必須相對於視口定位)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下工作。

+0

只是爲了澄清,所以你想列表項在的底部開始紅色邊框,不是嗎? – Stickers

+0

不,由兄弟元素組成,我的意思是列表中的兄弟姐妹,所以_green_上面的 – gorhawk

+0

我得到了你,副筆記,從小提琴中複製/粘貼代碼並將其插入問題本身,否則可能會關閉。 – Stickers

回答

1

您可以使用CSS3 flexbox。我添加了<div class="scrollable-wrapper">以使您可以嘗試實現的佈局。

查看代碼片段中的註釋,這很容易理解。所以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>

+0

不錯,不知怎的,我不知道css3的解決方案.. 包裝是否必要或良好的方式?名單上的'flex:1'也做到了。 – gorhawk

+1

等一下,你的意思是? https://jsfiddle.net/komfhjdj/4/它滾動,但框的寬度變滿,反正隨意玩,並找到適合你的最佳方式。 – Stickers

+0

是的,我的意思是這個。所以我也忘了提及這個列表已經是全寬(並且意圖是)。在小提琴中,'position:absolute'只是我最後一次嘗試解決這個問題。 我現在也得到了答案(在某些情況下,包裝實際上有所幫助)。 – gorhawk

2

您可以使用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> 
+0

我接受了flexbox答案,因爲我主要尋找css解決方案,但這也適用於我。如果我沒有弄錯,我還可以聽取更改嗎? – gorhawk