英文:
How to have nested div take up available height?
问题
我想让.expandToFill div扩展以填充剩余的屏幕高度。我使用了flexbox构建了一些东西,因为这似乎是最直接的解决方案。必须嵌套在这种方式中,请不要更改HTML。
假设我不知道.menu div的高度值。
.wrapper {
height: 100vh;
display: flex;
flex-direction: column;
}
.router {
flex-grow: 1;
}
.container {
display: flex;
flex-direction: column;
}
.menu {
background-color: red;
height: 20px;
}
.expandToFill {
flex-grow: 1;
background-color: blue;
}
<div class="wrapper">
<div class="router">
<div class="container">
<div class="menu">
</div>
<div class="expandToFill">
</div>
</div>
</div>
</div>
你可以在这个链接中查看示例:jsfiddle链接
编辑:
我曾接受了一个答案,但意识到它没有完全解决这个问题。我认为这是一个非常常见的问题,应该有一个完全可行的解决方案。
英文:
I want to have the .expandToFill div expand to fill the remaining screen height. I built something with flexbox as this seems like the most straightforward solution. It has to be nested in this way, please don't change the html.
Say I don't know the height value of the .menu div.
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-css -->
.wrapper {
height: 100vh;
display: flex;
flex-direction: column;
}
.router {
flex-grow: 1;
}
.container {
display: flex;
flex-direction: column;
}
.menu {
background-color: red;
height: 20px;
}
.expandToFill {
flex-grow: 1;
background-color: blue;
}
<!-- language: lang-html -->
<div class="wrapper">
<div class="router">
<div class="container">
<div class="menu">
</div>
<div class="expandToFill">
</div>
</div>
</div>
</div>
<!-- end snippet -->
https://jsfiddle.net/BAR24/a2m4cjsw/17/
There are similar questions on SO but they don't ask about nested expandable divs.
Edit:
I had accepted an answer but realized it didn't fully resolve this problem. I think its a very common issue and it deserves a fully working solution.
答案1
得分: 1
Sure, here is the translated code:
.wrapper {
height: 100vh;
display: flex;
flex-direction: column;
}
.router {
flex-grow: 1;
}
.container {
display: flex;
flex-direction: column;
height: 100%; /* <<------------ HERE */
}
.menu {
background-color: red;
height: 20px;
}
.expandToFill {
flex-grow: 1;
background-color: blue;
}
<div class="wrapper">
<div class="router">
<div class="container">
<div class="menu">
</div>
<div class="expandToFill">
</div>
</div>
</div>
</div>
Please note that I have retained the code structure and only translated the comments in the CSS part.
英文:
<!-- begin snippet: js hide: false console: true babel: null -->
<!-- language: lang-css -->
.wrapper {
height: 100vh;
display: flex;
flex-direction: column;
}
.router {
flex-grow: 1;
}
.container {
display: flex;
flex-direction: column;
height: 100%; /* <<------------ HERE */
}
.menu {
background-color: red;
height: 20px;
}
.expandToFill {
flex-grow: 1;
background-color: blue;
}
<!-- language: lang-html -->
<div class="wrapper">
<div class="router">
<div class="container">
<div class="menu">
</div>
<div class="expandToFill">
</div>
</div>
</div>
</div>
<!-- end snippet -->
答案2
得分: 1
以下是您要翻译的内容:
"解决问题的最简单方法似乎是添加:
.wrapper * {
height: 100%;
}
/* 开始代码片段:js 隐藏:false 控制台:true babel:false */
/* 语言:lang-css */
*,::before,::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.wrapper {
height: 100vh;
display: flex;
flex-direction: column;
}
.wrapper * {
height: 100%;
}
.router {
flex-grow: 1;
}
.container {
display: flex;
flex-direction: column;
}
.menu {
background-color: red;
height: 20px;
}
.expandToFill {
flex-grow: 1;
background-color: blue;
}
/* 语言:lang-html */
<div class="wrapper">
<div class="router">
<div class="container">
<div class="menu">
</div>
<div class="expandToFill">
</div>
</div>
</div>
</div>
/* 结束代码片段 */
这种方法的原因是,它确保所有元素占用了可用的完整垂直空间(除了.menu
,其高度已经明确设置),这允许规则:
.expandToFill {
flex-grow: 1;
}
生效,因为现在元素已经有了一个可以扩展的定义空间。"
英文:
The easiest way that seems to solve the problem, is to add:
.wrapper * {
height: 100%;
}
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-css -->
*,::before,::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.wrapper {
height: 100vh;
display: flex;
flex-direction: column;
}
.wrapper * {
height: 100%;
}
.router {
flex-grow: 1;
}
.container {
display: flex;
flex-direction: column;
}
.menu {
background-color: red;
height: 20px;
}
.expandToFill {
flex-grow: 1;
background-color: blue;
}
<!-- language: lang-html -->
<div class="wrapper">
<div class="router">
<div class="container">
<div class="menu">
</div>
<div class="expandToFill">
</div>
</div>
</div>
</div>
<!-- end snippet -->
The reason this works, is because it ensures that all elements take the full vertical space that's available (with the exception of .menu
, which has its height set specifically), which allows the rule:
.expandToFill {
flex-grow: 1;
}
To take effect, as the element now has a defined space into which it can expand.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论