我正在处理嵌套的flexbox布局,该布局应如下所示:
最外层(ul#main
)是一个水平列表,当有更多项目添加到它时,它必须向右扩展。如果它太大,应该有一个水平滚动条。
#main {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
overflow-x: auto;
/* ...and more... */
}
该列表(ul#main > li
)的每个项目都有一个标题(ul#main > li > h2
)和一个内部列表(ul#main > li > ul.tasks
)。此内部列表是垂直的,应在需要时包装成列。当包装成更多列时,其宽度应增加以容纳更多物品。此宽度增加也应适用于外部列表的包含项。
.tasks {
flex-direction: column;
flex-wrap: wrap;
/* ...and more... */
}
我的问题是,当窗口的高度变得太小时,内部列表不会自动换行。我尝试了很多改动所有flex属性的方法,尝试严格遵循CSS-Tricks的准则,但是没有运气。
这个JSFiddle显示了我到目前为止所拥有的。
预期结果 (我想要的):
实际结果 (我得到的):
较旧的结果 (我在2015年得到的结果):
更新
经过一番调查,这似乎是一个更大的问题。所有主要的浏览器的行为都相同,与嵌套的Flexbox设计无关。项目包装时,甚至更简单的flexbox列布局也拒绝增加列表的宽度。
这其他的jsfiddle清楚地表明了问题。在当前版本的Chrome,Firefox和IE11中,所有项目均正确包装;列表的高度在row
模式下增加,但其宽度在column
模式下不增加。另外,更改column
模式高度时,根本没有元素的立即重排,但是处于row
模式中。
但是,官方规格(具体看示例5)似乎表明我想做的事情应该可行。
有人可以解决此问题吗?
更新2
经过大量使用JavaScript在调整大小事件期间更新各种元素的高度和宽度的实验之后,我得出的结论是,它太复杂且很难以这种方式解决。另外,添加JavaScript肯定会破坏flexbox模型,该模型应保持尽可能干净。
现在,我回到overflow-y: auto
而不是,flex-wrap: wrap
以便内部容器在需要时垂直滚动。这不是很漂亮,但是至少不会过多破坏可用性是一种前进的方式。
column wrap
在包装时不扩大其宽度。有关更多信息,请参见code.google.com/p/chromium/issues/detail?id=247963。