将
.result
类添加
clear: left
,使你的框垂直堆叠。
然后将结果分组为每3个一组,并将这些分组水平浮动。您可以使用任何后端语言来输出结果标记或使用jQuery进行逻辑操作:
$('.result:nth-child(3n+1)').each(function() {
$(this).add( $(this).next().next().addBack() ).wrapAll('<div style="float:left"></div>');
});
Fiddle
这里有一个更加响应式的解决方案,可以在窗口大小改变时重新计算:Demo。
注意:它假设所有的框都具有相同的高度。如果不是这种情况,您可以在resultHeight
变量中硬编码一个max-height
。
$(window).resize(function() {
var resultHeight = $('.result:first').outerHeight(true),
nRows = Math.floor( $('#wrap1').height() / resultHeight );
$('.results-column').contents().unwrap();
$('.result:nth-child('+nRows+'n+1)').each(function() {
$(this).nextAll().slice(0, nRows-1).add(this).wrapAll('<div class="results-column"></div>');
});
}).resize();
添加了CSS样式:
#wrap1 {
white-space: nowrap;
}
.results-column {
display: inline-block;
vertical-align: top;
}
另外可以看一下Isotope,它具备cellsByColumn
/fitColumns
布局。
最后,您的用例是使用Flexible Box Layout的典型示例。虽然这种解决方案已经有了其他的答案,但由于目前很难在各个浏览器上实现交叉浏览器的支持,因此我还没有提及它:
- 火狐 <= 27、IE10 和 Safari <= 6 支持规范的旧版本
- 更新的 Chrome、Safari 和 IE11 支持新语法
- 不能忘记所有浏览器前缀!
参考文献:http://caniuse.com/flexbox
但并非一切都已经失去希望。如果您想今天就使用Flexbox,请使用非常有用的Flexbox生成器。
使用Flexbox的纯CSS解决方案:演示
#wrap1 {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-webkit-box-direction: normal;
-moz-box-direction: normal;
-webkit-box-orient: vertical;
-moz-box-orient: vertical;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
-webkit-box-pack: start;
-moz-box-pack: start;
-webkit-justify-content: flex-start;
-ms-flex-pack: start;
justify-content: flex-start;
-webkit-align-content: flex-start;
-ms-flex-line-pack: start;
align-content: flex-start;
-webkit-box-align: start;
-moz-box-align: start;
-webkit-align-items: flex-start;
-ms-flex-align: start;
align-items: flex-start;
}
我测试了这个解决方案,在IE10,IE11,Chrome 31,Opera 18和Firefox 29 Nightly中都可以正常工作。
注意:Firefox <= 27不支持具有多行/列的Flexbox(它不支持flex-wrap: wrap)。我在Firefox 29(夜间版)上进行了测试,并且它可以正常工作,因此我相信它很快就会被稳定版本支持。