我正在研究嵌套的flexbox布局,它应该如下工作:
最外层( ul#main
)是一个水平列表,当添加更多项目时,它必须向右扩展 . 如果它变得太大,应该有一个水平滚动条 .
#main {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
overflow-x: auto;
/* ...and more... */
}
此列表中的每个项目( ul#main > li
)都有一个 Headers ( ul#main > li > h2
)和一个内部列表( ul#main > li > ul.tasks
) . 此内部列表是垂直的,应在需要时包装到列中 . 当包装到更多列时,其宽度应该增加,以便为更多项目腾出空间 . 此宽度增加也应适用于外部列表的包含项 .
.tasks {
flex-direction: column;
flex-wrap: wrap;
/* ...and more... */
}
我的问题是当窗口的高度太小时内部列表不会换行 . 我已经尝试了很多篡改所有的flex属性,试图在CSS-Tricks精心遵循指南,但没有运气 .
这个JSFiddle显示了我到目前为止的情况 .
Expected result (我想要的):
Actual result (我得到的):
Older result (我在2015年得到的):
更新
经过一番调查,这开始看起来像一个更大的问题 . All major browsers behave the same way ,它与我的嵌套Flexbox设计无关 . 更简单的flexbox列布局拒绝在项目换行时增加列表的宽度 .
这other JSFiddle清楚地证明了这个问题 . 在当前版本的Chrome,Firefox和IE11中,所有项目都正确包装;列表的高度在 row
模式下增加,但在 column
模式下其宽度不会增加 . 此外,在更改 column
模式的高度时,根本没有立即回流元素,但是在 row
模式中 .
但是,official specs (look specifically at example 5)似乎表明我想做的事情应该是可能的 .
有人可以提出解决这个问题的方法吗?
更新2
经过大量的实验尝试使用JavaScript来更新调整大小事件期间各种元素的高度和宽度,我得出结论,尝试以这种方式解决它太复杂和太麻烦 . 此外,添加JavaScript肯定会破坏flexbox模型,该模型应尽可能保持干净 .
现在,我回到 overflow-y: auto
而不是 flex-wrap: wrap
,以便内部容器在需要时垂直滚动 . 它不漂亮,但它是一种前进的方式,至少不会过多地破坏可用性 .
4 回答
可能的JS解决方案
由于尚未提出任何解决方案或正确的解决方法,我设法通过一种不同的方法获得所请求的行为 . 我没有将布局分成3个不同的div,而是将所有项目添加到1个div中,并在两个div之间创建更多div .
建议的解决方案是硬编码的,假设我们有3个部分,但可以扩展为通用部分 . 主要思想是解释我们如何实现这种布局 .
将所有项目添加到1个容器div中,该div使用flex来包装项目
每个"inner container"的第一项(我将其称为一个部分)将有一个类,这有助于我们进行一些操作,创建每个部分的分离和样式 .
在每个第一项上使用
:before
,我们可以找到每个部分的 Headers .使用
space
会在各部分之间创建间隙由于
space
赢了't cover the full height of the section I' m也将:after
添加到这些部分,因此将其定位为绝对位置和白色背景 .为了设置每个部分的背景颜色,我在每个部分的第一个项目中添加另一个div . 我也将保持绝对的位置,并将
z-index: -1
.为了获得每个背景的正确宽度,我使用JS,设置正确的宽度,还添加一个侦听器来调整大小 .
问题
这看起来像是flex布局的根本缺陷 .
列方向的Flex容器不会扩展以容纳其他列 . (这不是
flex-direction: row
中的问题 . )这个问题已被多次询问(参见下面的列表),CSS中没有干净的答案 .
很难将此作为一个错误,因为问题出现在所有主流浏览器中 . 但它确实提出了一个问题:
你会认为其中至少有一个会做对 . 我只能推测原因 . 也许这是一个技术上很难的实现,并且被搁置了这个迭代 .
UPDATE: 此问题似乎已在Edge v16中得到解决 .
问题说明
OP创建了一个有用的演示来说明问题 . 我在这里复制它:http://jsfiddle.net/nwccdwLw/1/
解决方法选项
Stack Overflow社区的Hacky解决方案:
"It seems this issue cannot be solved only with CSS, so I propose you a JQuery solution."
"It's curious that most browsers haven't implemented column flex containers correctly, but the support for writing modes is reasonably good. Therefore, you can use a row flex container with a vertical writing mode."
更多分析
Chromium Bug Report
Mark Amery's answer
其他帖子描述同样的问题
Flex box container width doesn't grow
How can I make a display:flex container expand horizontally with its wrapped contents?
Flex-flow: column wrap. How to set container's width equal to content?
Flexbox flex-flow column wrap bugs in chrome?
How do I use "flex-flow: column wrap"?
Flex container doesn't expand when contents wrap in a column
flex-flow: column wrap, in a flex box causing overflow of parent container
Html flexbox container does not expand over wrapped children
Flexbox container and overflowing flex children?
How can I make a flexbox container that stretches to fit wrapped items?
Flex container calculating one column, when there are multiple columns
Make container full width with flex
Flexbox container resize possible?
Flex-Wrap Inside Flex-Grow
Flexbox grow to contain
Expand flexbox element to its contents?
flexbox column stretch to fit content
Nested flexbox column wrap not working when inside flexbox row
flex-flow: column wrap doesn't stretch the parent element's width
Why doesn't my <ul> expand width to cover all the <li>?
另一种可行方法:
https://developer.mozilla.org/en-US/docs/Web/CSS/column-count
如果它们没有与顶部对齐,您可能还需要调整
margin-top
的li.task:first-child
.