我正在尝试使用flexbox布局并遇到问题,当我嵌套多个flexbox时,overflow
不会被应用。
只要我使用一级Flex框(参见示例1),一切正常:只要内容超出给定空间,滚动条就会应用到红框(#top
)。 / p>
但是,如果我引入另一层flexbox(参见示例二),则蓝色框(#right
)上没有滚动条。相反,滚动条显示在body元素上,完全忽略蓝色框上的overflow: auto
设置。
所以我的问题是:如何在使用嵌套的flexbox时让overflow
工作?
备注:我使用Chrome45,Firefox 40和IE11进行了测试。所有行为都是一致的。
以下是两种情况的代码和小提琴链接。
(1)只有一个弹性箱,没有嵌套
<div id="container">
<div id="top">
...
</div>
<div id="bottom">
blub
</div>
</div>
html, body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
#container{
background-color: yellow;
flex-direction: column;
display: flex;
height: 100%;
}
#top {
background-color: red;
flex-grow: 1;
display: flex;
flex-direction: row;
overflow: auto;
white-space:pre;
}
#bottom {
background-color: green;
height: 4em;
}
<小时/> (2)嵌套的flexboxes
<div id="container">
<div id="top">
<div id="left">
</div>
<div id="right">
...
</div>
</div>
<div id="bottom">
blub
</div>
</div>
html, body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
#container{
background-color: yellow;
flex-direction: column;
display: flex;
height: 100%;
}
#top {
background-color: red;
flex-grow: 1;
display: flex;
flex-direction: row;
}
#right {
white-space: pre;
overflow: auto;
background-color: blue;
width: 5em;
}
#left {
flex-grow: 1;
background-color: orange;
}
#bottom {
background-color: green;
height: 4em;
}
答案 0 :(得分:4)
最新的浏览器将新的auto
实现为min-height
的初始值。
强制#top
至少与其内容一样高。
所以你需要撤消它:
#top {
min-height: 0;
}
然后#top
可能比其内容短。 #right
会被拉伸至#top
一样高,#top
的内容可能会溢出。
html, body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
#container{
background-color: yellow;
flex-direction: column;
display: flex;
height: 100%;
}
#top {
background-color: red;
flex-grow: 1;
display: flex;
flex-direction: row;
min-height: 0;
}
#right {
white-space: pre;
overflow: auto;
background-color: blue;
width: 5em;
}
#left {
flex-grow: 1;
background-color: orange;
}
#bottom {
background-color: green;
height: 4em;
}
<div id="container">
<div id="top">
<div id="left">
</div>
<div id="right">
1
1
1
1
1
1
1
1
1
1
1
11
1
1
1
1
1
1
1
1
1
1
1
1
1
1
</div>
</div>
<div id="bottom">
blub
</div>
</div>
答案 1 :(得分:0)
备选答案:只需指定flex:1
而不是{top>上的flex-grow:0
或指定flex-basis:0
。 flex:1
隐式设置flex: 1 1 0
,即第三个0表示flex-basis:0
。
这很重要,因为flex-basis
的默认初始值不是 0而是auto
,这反过来实际上意味着content
- 大小,因此您需要诉诸min-height
。和OP一样,我发现min-height
有点不合时宜,有点令人困惑,flex
符号也不那么明显。
更新了代码段:
http://codepen.io/yaaang/pen/gayqPE
[{1}}中的第三个组件设置了flex-basis longhand并指定了flex basis:自由空间之前的flex项的初始主要大小 根据flex因子分布。它采用相同的值 width属性(auto除外区别对待)和a 其他内容关键字。当从flex缩写中省略时,它 指定值为0%。
如果指定的flex-basis为auto,则使用 flex basis是弹性项目主要大小的计算值 属性。如果该值本身是auto,那么使用的flex基础是 根据其内容自动确定(即根据其大小确定) 含量)。