より良く、よりシンプルなグリッドシステム

大抵の現代的なグリッドシステムは float または inline-block の2つのレイアウト手法のうち、どちらか1つを採用しています。しかしそれらの手法はどちらもレイアウトを実現する意図で使うものではないため、結果として重大な問題や制約を引きおこします。

floatは、レイアウトに関する多くの問題を抱えているために、「クリア」を行なう必要があります。御存知の通り、要素をクリアすると、ページ内の無関係のパーツの下に強制移動させられることがあります(例えばこの Bootstrap issueを参照してください)。加えて、floatをクリアするといつもbeforeとafter擬似要素が必要になり、別の用途に使うことの妨げとなります。

インラインブロックレイアウトはinline-block アイテム間のホワイトスペース問題に取り組むのに必要ですが、それらの 解決方法ハックに満ちていて厄介です。

Flexboxはそれらの問題を排除するだけでなく、新たな可能性の世界を開きます。

Flexboxグリッドシステムの機能

グリッドシステムは、たいてい無数のサイズオプションを搭載していますが、しかし大多数のケースではせいぜい2〜3の要素を並べたいだけでしょう。これを考慮すると、なぜすべてのセルにサイズクラスを付加することが必須になってしまうのでしょう?

下記のリストは、私の考える理想のグリッドシステムの基準です。幸運にも、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

Grid-ception

グリッドコンポーネントは、他のグリッドコンポーネント内部に無限にネスト可能です。

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.
このセルは中央ぞろえになります。
このセルは下ぞろえになります。

The HTML

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

The CSS

基本的なグリッドシステム

.Grid {
  display: flex;
}

.Grid-cell {
  flex: 1;
}

グリッドスタイル修飾子

/* 隙間あり */
.Grid--gutters {
  margin: -1em 0 0 -1em;
}
.Grid--gutters > .Grid-cell {
  padding: 1em 0 0 1em;
}

/* 行ぞろえ */
.Grid--top {
  align-items: flex-start;
}
.Grid--bottom {
  align-items: flex-end;
}
.Grid--center {
  align-items: center;
}

/* セルごとに整列 */
.Grid-cell--top {
  align-self: flex-start;
}
.Grid-cell--bottom {
  align-self: flex-end;
}
.Grid-cell--center {
  align-self: center;
}

レスポンシブ修飾子(モバイルファーストアプローチ)

/* すべてのメディアに対応するベースクラス */
.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%
}

/* 小〜中サイズのスクリーン */
@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%
  }
}

/* 大スクリーン */
@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のソース 全体を見る。