如果您使用以下 flexbox 样式,它将在 IE10 和 chrome 中实现您想要的。但是我不认为所有浏览器都完全支持这一点。
HTML
<ul>
<li>test test</li>
<li>test</li>
<li>test testtest</li>
<li>testtest</li>
<li>test</li>
<li>test test test</li>
<li>test test</li>
<li>test</li>
</ul>
CSS
ul {
list-style:none; margin:0; padding:0;
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-webkit-flex-direction: row;
-ms-flex-direction: row;
-moz-flex-direction: row;
flex-direction: row;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
-moz-flex-wrap: wrap;
flex-wrap: wrap;
width: 300px;
}
li {
white-space:nowrap;
border:1px solid #cccccc;
padding:5px;
-webkit-flex: auto;
-moz-flex: auto;
-ms-flex: auto ;
flex: auto;
}
例子
由问题作者编辑:
我想我应该更新这个答案,因为我已经了解了一些关于 flexbox 的知识。
处理多行弹性盒,供应商前缀几乎没用。很难找到任何支持多行 flexbox 但带有供应商前缀的浏览器版本。通常供应商前缀指的是旧版本的 flexbox,其中多行的处理方式非常不同。
每个主流浏览器都支持这一点,除了 Firefox,但一个实现已经合并到 alpha 中,所以它会出现在Firefox 28中。大多数桌面用户会看到你的设计(仍然重要的是实现一个可用的后备)。
使用Modernizr测试多行弹性盒支持非常容易,因为弹性盒模型测试专门测试该flex-wrap
属性,该属性仅存在于支持它的实现中。float: left
为每个没有的浏览器实现基于后备的方法是非常干净的。
我的最终实现具有基于 Modernizr 的后备功能,如下所示:
ul {
/* general */
list-style: none;
margin: 0;
padding: 0;
width: 100%;
}
.flexbox ul {
display: flex;
flex-flow: row wrap;
}
li {
/* general */
white-space: nowrap;
border: 1px solid #555555;
/* fallback */
float: left;
}
.flexbox li {
flex: auto;
}
li:first-child {
/* general */
text-align: right;
order: 1;
/* fallback */
float: right !important;
}
它应该在每个浏览器中都可以工作,尽管后备实现不如 flexbox 简洁。
另请注意,这li:first-child
是 flexbox 的最后一个元素。那是因为order: 1
财产。所有其他元素的默认order
值为 0。这是因为以这种方式在回退中更容易将其浮动到右侧。