Проблема с высотой CSS с гибкой коробкой внутри гибкой коробки
У меня проблема с флексиями, содержащимися внутри флеш-боксов. JS Fiddle в http://jsfiddle.net/fr077nn2/ содержит следующий код:
#container{
position: absolute;
height: 100%;
width: 100%;
border: 3px solid yellow;
}
.app {
display: flex;
flex-direction: column;
height: 100%;
border: 3px solid black;
}
.app-header {
border: 3px solid red;
}
.app-content {
border: 3px solid green;
flex: 1;
overflow: hidden;
}
.app-footer {
border: 3px solid blue;
}
<div id="container">
<div class="app">
<div class="app-header">HEADER1</div>
<div class="app-content">
<div class="app">
<div class="app-header">HEADER2</div>
<div class="app-content">CONTENT2</div>
<div class="app-footer">FOOTER2</div>
</div>
</div>
<div class="app-footer">FOOTER1</div>
</div>
</div>
Ответы
Ответ 1
Вообще говоря, высота 100% работает, когда родитель имеет четко определенную высоту. В вашем примере самое внешнее приложение-контент не имеет явной высоты, поэтому высота 100% его дочернего элемента не работает.
Простым обходным путем является использование относительного абсолютного позиционирования для определения размера дочернего элемента:
#container {
position: absolute;
height: 100%;
width: 100%;
border: 3px solid yellow;
}
.app {
display: flex;
flex-direction: column;
height: 100%;
border: 3px solid black;
}
.app-header {
border: 3px solid red;
}
.app-content {
border: 3px solid green;
flex: 1;
/* added property */
position: relative;
}
.app-footer {
border: 3px solid blue;
}
/* added rule */
.app-content > .app {
height: auto;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
/* scrollbar and border correction */
body {
margin: 0;
padding: 0;
}
div {
box-sizing: border-box;
}
<div id="container">
<div class="app">
<div class="app-header">HEADER1</div>
<div class="app-content">
<div class="app">
<div class="app-header">HEADER2</div>
<div class="app-content">CONTENT2</div>
<div class="app-footer">FOOTER2</div>
</div>
</div>
<div class="app-footer">FOOTER1</div>
</div>
</div>
Ответ 2
Не уверен, что это в порядке/соответствует вашим потребностям, но, по крайней мере, он изгибается в Chrome + FF; P Возможно, проблема с вложенностью.
Flex на контейнере + flex на контенте:
http://jsfiddle.net/fr077nn2/2/
#container{
position: absolute;
height: 100%;
width: 100%;
border: 3px solid yellow;
display: flex;
flex-direction: column;
}
.app {
display: flex;
flex-direction: column;
border: 3px solid black;
flex-grow: 1;
}
.app-header {
border: 3px solid red;
}
.app-content {
border: 3px solid green;
overflow: hidden;
flex-grow: 1;
display: flex;
}
.app-footer {
border: 3px solid blue;
}
Ответ 3
Почему бы не упростить?
Использование текущей разметки
Это похоже на много ненужного HTML.
Вам нужно сложить Flex полностью. В этом примере верхний гибкий контейнер имеет height: 100vh
, чтобы охватить всю высоту области просмотра. Некоторые из гибких детей также являются гибкими родителями, они получают display: flex
вместе с flex: 1
, поэтому они будут расти и сокращаться, а их дети могут расширяться.
Пример
* {
margin: 0;
padding: 0;
border: 0;
}
div {
box-sizing: border-box;
}
#container {
height: 100vh;
border: 3px solid yellow;
display: flex;
}
.app {
display: flex;
flex: 1;
flex-direction: column;
border: 3px solid black;
}
.app-header {
border: 3px solid red;
}
.app-content {
border: 3px solid green;
display: flex;
flex: 1;
overflow: hidden;
}
.app-footer {
border: 3px solid blue;
}
<div id="container">
<div class="app">
<div class="app-header">HEADER1</div>
<div class="app-content">
<div class="app">
<div class="app-header">HEADER2</div>
<div class="app-content">CONTENT2</div>
<div class="app-footer">FOOTER2</div>
</div>
</div>
<div class="app-footer">FOOTER1</div>
</div>
</div>