【发布时间】:2021-04-03 20:53:30
【问题描述】:
我正在研究一个嵌套的 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 列布局在项目换行时拒绝增加列表的宽度。
这个other JSFiddle 清楚地说明了这个问题。在当前版本的 Chrome、Firefox 和 IE11 中,所有项目都正确换行;列表的高度在row 模式下会增加,但在column 模式下其宽度不会增加。另外,在改变column模式的高度时,根本不会立即回流元素,但在row模式下是有的。
但是,official specs (look specifically at example 5) 似乎表明我想做的事情应该是可能的。
有人能想出解决这个问题的方法吗?
更新 2
在 resize 事件期间使用 JavaScript 更新各种元素的高度和宽度进行了大量实验后,我得出的结论是,尝试以这种方式解决它太复杂太麻烦了。此外,添加 JavaScript 肯定会破坏 flexbox 模型,应该尽可能保持干净。
现在,我回退到overflow-y: auto 而不是flex-wrap: wrap,以便内部容器在需要时垂直滚动。它并不漂亮,但它是一种前进方式,至少不会过多地破坏可用性。
【问题讨论】:
-
只是一个旁注,但 Chrome 中存在一个错误,导致其流程设置为
column wrap的容器在包装时不会扩展其宽度。请参阅code.google.com/p/chromium/issues/detail?id=247963 了解更多信息。 -
我也无法让它在 IE11 中工作。在那里,最里面的项目会换行,但内部列表及其容器(外部项目)不会增加它们的宽度。目前我正在回退到让内部列表滚动,但这不是一个好的长期解决方案,我真的很想避免为此添加 JavaScript。
-
codepen.io/iugo/pen/ExWwjRY flex 和 wrap 时,如果是 row,height 可以自动调整。如果列,宽度不能自动适应,是单个最大宽度。