中间 div 取顶部 div 和绝对定位的底部 div 之间的剩余高度 [重复]
Posted
技术标签:
【中文标题】中间 div 取顶部 div 和绝对定位的底部 div 之间的剩余高度 [重复]【英文标题】:Middle div take the remaining height between a top div and a absolute positioned bottom div [duplicate] 【发布时间】:2017-05-14 03:31:01 【问题描述】:我有这种结构,我将三个 div(顶部、中间、底部)包装在一个 div(包装器)中:
#wrapper
width: 60%;
height: 200px;
border: 2px solid red;
margin: 0 auto;
position: relative;
#top
height: 50px;
background: green;
#middle
background: orange;
overflow: auto;
#bottom
background: blue;
position: absolute;
width: 100%;
bottom: 0;
left: 0;
padding: 10px 0;
<html>
<body>
<div id="wrapper">
<div id="top">
Top
</div>
<div id="middle">
<ul>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
</ul>
</div>
<div id="bottom">
Bottom
</div>
</div>
</body>
</html>
如您所见,wrapper div 具有固定的高度,bottom div 相对于 wrapper div 是绝对定位的。 middle div 有一个内容列表,它不在 wrapper div 之外。我想要实现的是让中间 div 只占用顶部 div 和底部 div 之间的剩余高度,并且仍然能够滚动。我怎样才能做到这一点?
【问题讨论】:
【参考方案1】:最简单的方法是使用 flex :(实际上好像是重复的)
#wrapper
width: 60%;
height: 200px;
border: 2px solid red;
margin: 0 auto;
display: flex;
flex-flow: column;
#top
height: 50px;
background: green;
#middle
flex: 1;
background: orange;
overflow: auto;
#bottom
background: blue;
padding: 10px 0;
<html>
<body>
<div id="wrapper">
<div id="top">
Top
</div>
<div id="middle">
<ul>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
</ul>
</div>
<div id="bottom">
Bottom
</div>
</div>
</body>
</html>
display:table 属性和绝对定位可以帮助旧浏览器:
#wrapper
width: 60%;
height: 200px;
border: 2px solid red;
margin: 0 auto;
display: table;
table-layout: fixed;
#top,
#bottom
color: white;
display: table-cell;
vertical-align: middle
#middle
display: table-row;
#top
height: 50px;
background: green;
#middle
background: orange;
position: relative;
height: 100%;
#middle .buffer
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
overflow: auto;
#bottom
height: 1%;
background: blue;
padding: 10px 0;
<div id="wrapper">
<div id="top">
Top
</div>
<div id="middle">
<div class="buffer">
<ul>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
</ul>
</div>
</div>
<div id="bottom">
Bottom
</div>
</div>
【讨论】:
【参考方案2】:你可以用你的 css 做这样的事情:
#wrapper
width: 60%;
height: 200px;
border: 2px solid red;
margin: 0 auto;
position: relative;
#top
height: 25%;
background: green;
#middle
background: orange;
overflow:scroll;
height:50%;
#bottom
background: blue;
position: absolute;
width: 100%;
bottom: 0;
left: 0;
padding: 10px 0;
height:15%
这里是jsfiddle。如果您的内容太大而无法容纳,这将让您滚动。我添加了一些额外的高度参数,但您可以更改它们以满足您的特定需求。重要的是把你的溢出设置为scroll
,这样如果有额外的内容,DOM 会滚动,这样你就可以看到所有的内容。
【讨论】:
是的,我已更改删除overflow:scroll
并添加了这些属性overflow-y:scroll; overflow-x: hidden;
。但在#middle 和#bottom div 之间仍有一条白线。这感觉很奇怪。无论如何要删除它吗? jsfiddle
是的,只需更新中间的大小即可。我刚刚又加了 5%:jsfiddle.net/5L8x2cea/1【参考方案3】:
只需将overflow:hidden
提供给包装器即可。隐藏从容器/包装器 div 溢出的任何内容。
或溢出:滚动;如果您想访问隐藏的内容(但这会在某些区域添加令人讨厌的滚动条)。
#wrapper
width: 60%;
height: 200px;
border: 2px solid red;
margin: 0 auto;
position: relative;
overflow:hidden;
#top
height: 50px;
background: green;
#middle
background: orange;
overflow: auto;
#bottom
background: blue;
position: absolute;
width: 100%;
bottom: 0;
left: 0;
padding: 10px 0;
<html>
<body>
<div id="wrapper">
<div id="top">
Top
</div>
<div id="middle">
<ul>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
<li>Some content</li>
</ul>
</div>
<div id="bottom">
Bottom
</div>
</div>
</body>
</html>
【讨论】:
是的。但我需要它是可滚动的。以上是关于中间 div 取顶部 div 和绝对定位的底部 div 之间的剩余高度 [重复]的主要内容,如果未能解决你的问题,请参考以下文章