更棒,更简洁的栅格系统

现今大部分栅格系统都使用了两种布局方式中的一种:浮动 (float) 或者 內联块 (inline-block)。但是它们的初衷均不是真的用于布局 (layout),也因此导致了诸多的问题和限制。

使用浮动 (float) 需要清除浮动,因此牵连出了一堆布局问题,最臭名昭著的是清除一个元素的浮动有时会强制它出现在一个不相关的页面部分的下边 (例如 Bootstrap issue )。并且,使用清除浮动通常会同时使用 before 和 after 两个伪元素,导致你不能将该伪元素使用于其他用途。

内联块布局最著名的问题是 内联块之间空白问题, 以及其所有 解决方案 都是 奇技淫巧恼人 的。

Flexbox 布局不仅结局了这些问题,还开启全新可能性的新世界的大门。

Flexbox 栅格系统特性

栅格系统通常有数不清的尺寸选项,但是通常情况你仅仅想要一个两栏或三栏的栅格系统。既然如此,我们为什么一定要把尺寸属性 (sizing classes) 写到每一个格子 (cell) 里?

下列是我对于一个理想的栅格系统的标准。幸运的是,Flexbox 布局满足了大部分特性。

基础栅格系统

下面的栅格没有指定特定的宽度,它们自然的平分每一行的空间并撑满每一个行,并且高度默认都是相等的。

1/2
1/2
1/3
1/3
1/3
1/4
1/4
1/4
1/4
高度撑满,即使内容没有填满空间。
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mollis velit non gravida venenatis. Praesent consequat lectus purus, ut scelerisque velit condimentum eu. Maecenas sagittis ante ut turpis varius interdum. Quisque tellus ipsum, eleifend non ipsum id, suscipit ultricies neque.

独立的尺寸

当你的需求不是等宽栅格的时候,可以添加尺寸属性到特定的栅格中。没有尺寸属性的栅格将简单地继续平分剩下的可用空间。

下边加了 “auto” 标签的栅格没有指定任何尺寸属性。

1/2
auto
auto
auto
1/3
1/4
auto
1/3

响应式

响应式栅格系统通过添加媒体查询到栅格元素或栅格容器来实现。当满足媒体查询的条件时,栅格系统就能自动调整。

下边的这些栅格应在低于 48em 时撑满一行,调整你的浏览器来查看效果。

Full / Halves
Full / Halves
Full / Thirds
Full / Thirds
Full / Thirds

栅格嵌套

栅格可以无限嵌套于另一个栅格中。

1/3
1/2
1/2
1/3

对齐特性

置顶对齐栅格

我应该置顶对齐。
Pellentesque sagittis vel erat ac laoreet. Phasellus ac aliquet enim, eu aliquet sem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed pulvinar porta leo, eu ultricies nunc sollicitudin vitae. Curabitur pulvinar dolor lectus, quis porta turpis ullamcorper nec. Quisque eget varius turpis, quis iaculis nibh.
我应该置顶对齐。

置底对齐栅格

我应该置底对齐栅格。
Curabitur pulvinar dolor lectus, quis porta turpis ullamcorper nec. Quisque eget varius turpis, quis iaculis nibh. Ut interdum ligula id metus hendrerit cursus. Integer eu leo felis. Aenean commodo ultrices nunc, sit amet blandit elit gravida in.
我应该置底对齐栅格。

垂直居中栅格

我应该相对于我右边的格子垂直居中。
Curabitur pulvinar dolor lectus, quis porta turpis ullamcorper nec. Quisque eget varius turpis, quis iaculis nibh. Ut interdum ligula id metus hendrerit cursus. Integer eu leo felis. Aenean commodo ultrices nunc, sit amet blandit elit gravida in. Sed est ligula, ornare ac nisi adipiscing, iaculis facilisis tellus. Nullam vel facilisis libero. Duis semper lobortis elit, vitae dictum erat.

混合垂直对齐

我应该置顶对齐。
Curabitur pulvinar dolor lectus, quis porta turpis ullamcorper nec. Quisque eget varius turpis, quis iaculis nibh. Ut interdum ligula id metus hendrerit cursus. Integer eu leo felis. Aenean commodo ultrices nunc, sit amet blandit elit gravida in. Sed est ligula, ornare ac nisi adipiscing, iaculis facilisis tellus.
我应该垂直居中。
我应该置底对齐。

HTML 代码

<div class="Grid">
    <div class="Grid-cell"></div>
    <div class="Grid-cell"></div>
    <div class="Grid-cell"></div>
</div>

CSS 代码

基础栅格系统

.Grid {
    display: flex;
}

.Grid-cell {
    flex: 1;
}

栅格系统修饰属性

/* With gutters */
.Grid--gutters {
    margin: -1em 0 0 -1em;
}
.Grid--gutters > .Grid-cell {
    padding: 1em 0 0 1em;
}

/* Alignment per row */
.Grid--top {
    align-items: flex-start;
}
.Grid--bottom {
    align-items: flex-end;
}
.Grid--center {
    align-items: center;
}

/* Alignment per cell */
.Grid-cell--top {
    align-self: flex-start;
}
.Grid-cell--bottom {
    align-self: flex-end;
}
.Grid-cell--center {
    align-self: center;
}

响应式修饰属性 (移动设备优先)

/* Base classes for all media */
.Grid--fit > .Grid-cell {
    flex: 1;
}
.Grid--full > .Grid-cell {
    flex: 0 0 100%;
}
.Grid--1of2 > .Grid-cell {
    flex: 0 0 50%;
}
.Grid--1of3 > .Grid-cell {
    flex: 0 0 33.3333%;
}
.Grid--1of4 > .Grid-cell {
    flex: 0 0 25%;
}

/* Small to medium screens */
@media (min-width: 24em) {
    .small-Grid--fit > .Grid-cell {
        flex: 1;
    }
    .small-Grid--full > .Grid-cell {
        flex: 0 0 100%;
    }
    .small-Grid--1of2 > .Grid-cell {
        flex: 0 0 50%;
    }
    .small-Grid--1of3 > .Grid-cell {
        flex: 0 0 33.3333%;
    }
    .small-Grid--1of4 > .Grid-cell {
        flex: 0 0 25%;
    }
}

/* Large screens */
@media (min-width: 48em) {
    .large-Grid--fit > .Grid-cell {
        flex: 1;
    }
    .large-Grid--full > .Grid-cell {
        flex: 0 0 100%;
    }
    .large-Grid--1of2 > .Grid-cell {
        flex: 0 0 50%;
    }
    .large-Grid--1of3 > .Grid-cell {
        flex: 0 0 33.3333%;
    }
    .large-Grid--1of4 > .Grid-cell {
        flex: 0 0 25%;
    }
}

在 Github 中查看这个 demo 中完整的栅格组件 源代码