因为过去的实现发生了变化,所以已知 2 个主要的 flexbox 实现。 This page 提供了一些关于新旧实现的背景信息。
我找到了一个很好的关于 Flexbox 的当前实现状态的教程here。
页面HTML结构示例代码(demo on Codepen here):
<div class="page-wrap">
<section class="main-content" role="main">
Main content: first in source order
</section>
<nav class="main-nav" role="navigation">
Links
</nav>
<aside class="main-sidebar" role="complementary">
Sidebar
</aside>
</div>
要将page-wrap 分成三部分,main-nav 是侧边栏的两倍,我们可以使用 flexbox。另一个优点是 main-content 元素在 DOM 中的位置在 main-nav 之前,但是使用 flexbox 我们可以在内容之前渲染它。这对于屏幕阅读器很有用,因此首先阅读内容。
我们需要将page-wrap 设置为弹性盒上下文。这样所有的孩子都变成了 flexbox 项目:
.page-wrap {
display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */
display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */
display: -ms-flexbox; /* TWEENER - IE 10 */
display: -webkit-flex; /* NEW - Chrome */
display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */
}
属性的顺序很重要。因为有些浏览器支持这两种实现,所以我们需要在旧属性下面指定最新的属性。这是因为 display-property 没有前缀。
添加项目的宽度:
.main-content {
width: 60%;
}
.main-nav,
.main-sidebar {
-webkit-box-flex: 1; /* OLD - iOS 6-, Safari 3.1-6 */
-moz-box-flex: 1; /* OLD - Firefox 19- */
width: 20%; /* For old syntax, otherwise collapses. */
-webkit-flex: 1; /* Chrome */
-ms-flex: 1; /* IE 10 */
flex: 1; /* NEW, Spec - Opera 12.1, Firefox 20+ */
}
我们需要做的最后一件事是更改项目的顺序,因为现在main-nav 在main-content 之后呈现
.main-content {
-webkit-box-ordinal-group: 2; /* OLD - iOS 6-, Safari 3.1-6 */
-moz-box-ordinal-group: 2; /* OLD - Firefox 19- */
-ms-flex-order: 2; /* TWEENER - IE 10 */
-webkit-order: 2; /* NEW - Chrome */
order: 2; /* NEW, Spec - Opera 12.1, Firefox 20+ */
}
.main-nav {
-webkit-box-ordinal-group: 1;
-moz-box-ordinal-group: 1;
-ms-flex-order: 1;
-webkit-order: 1;
order: 1;
}
.main-sidebar {
-webkit-box-ordinal-group: 3;
-moz-box-ordinal-group: 3;
-ms-flex-order: 3;
-webkit-order: 3;
order: 3;
}