我正在研究嵌套的flexbox布局,它应该如下工作:
最外层(ul#main)是一个水平列表,当添加更多项时,它必须向右扩展.如果它变得太大,应该有一个水平滚动条.
#main {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
overflow-x: auto;
/* ...and more... */
}
Run Code Online (Sandbox Code Playgroud)
此list(ul#main > li)的每个项目都有一个header(ul#main > li > h2)和一个内部列表(ul#main > li > ul.tasks).此内部列表是垂直的,应在需要时包装到列中.当包装到更多列时,其宽度应该增加,以便为更多项目腾出空间.此宽度增加也应适用于外部列表的包含项.
.tasks {
flex-direction: column;
flex-wrap: wrap;
/* ...and more... */
}
Run Code Online (Sandbox Code Playgroud)
我的问题是当窗口的高度太小时内部列表不会换行.我已经尝试了很多篡改所有的flex属性,试图仔细遵循CSS-Tricks的指导,但没有运气.
这个JSFiddle显示了我到目前为止所拥有的内容.
预期结果 (我想要的):

实际结果 (我得到的):

较旧的结果 (我在2015年得到的):

经过一番调查,这开始看起来像一个更大的问题.所有主流浏览器的行为方式都相同,而且与我的嵌套Flexbox设计无关.更简单的flexbox列布局拒绝在项目换行时增加列表的宽度.
这其他的jsfiddle清楚地表明了问题.在当前版本的Chrome,Firefox和IE11中,所有项目都正确包装; 列表的高度在row模式中增加,但其宽度在column模式下不会增加.此外,在更改column模式的高度时,根本没有立即回流元素,但存在row模式.
然而,官方规范 …
实际上,这是Pinterest布局.但是,在线发现的解决方案包含在列中,这意味着容器无意中水平生长.这不是 Pinterest布局,并且它不适用于动态加载的内容.
我想要做的是有一堆固定宽度和不对称高度的图像,水平放置,但当满足固定宽度容器的限制时包裹在一个新行中:
flexbox可以做到这一点,还是我不得不求助于像Masonry这样的JS解决方案?
所以我有一个带有列和最大高度的flexbox,使列在3列中彼此相邻.
这在Chrome中运行良好,但在Safari中,它似乎只使用最后(最右边)列来设置容器的实际高度.
我在这里举了一个例子:
section {
display: flex;
flex-direction: column;
flex-wrap: wrap;
max-height: 400px;
padding: 10px;
border: 1px solid green;
}
div {
flex-basis: 100px;
width: 100px;
background-color: red;
margin: 10px;
}Run Code Online (Sandbox Code Playgroud)
<section>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</section>Run Code Online (Sandbox Code Playgroud)
Chrome和Safari中的结果将在下方进行屏幕截图.
铬:
苹果浏览器:
这似乎是一个明显的错误,但我找不到任何有关它的信息.
我想知道的是:
我在使用 flexbox 时遇到了问题。
我正在使用带有 的容器flex-direction: column; flex-wrap: wrap,因此我的内部项目实际上可以放置在多列中。
问题是浏览器仍然将容器的宽度计算为内部项目宽度的总和!
我的容器块应该有一个较小的宽度(基于内容大小),但它实际上是巨大的。
无论如何,在使用列而不是行时,以这种方式计算容器的宽度也很不自然。
看看我的代码中的绿色块。它有一个巨大的,但它不应该有。此外,当您从容器中移除项目时,它会变小。
我期望的是具有小宽度的容器,因此它不会占用超过可用空间的一半。
在最新的 OS X 上的最新 Safari 和 Chrome 上进行了检查。
.container {
display: flex;
flex-wrap: wrap;
flex-direction: column;
background: #aa0000;
height: 100px;
}
.group {
display: flex;
flex-wrap: wrap;
flex-direction: column;
align-content: flex-start;
}
.g1 {
background: #00aa00;
}
.g2 {
background: #0000aa;
}Run Code Online (Sandbox Code Playgroud)
<div class="container">
<div class="group g1">
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
</div> …Run Code Online (Sandbox Code Playgroud)