欄レイアウト

多くの場合、いくつかの欄を含むレイアウトを作成する必要があります。 CSS にはこれを行うためのいくつかの方法があります。 グリッド、フレックスボックス、段組みのレイアウトのどれを使用するかは、達成しようとしている内容によって異なります。 このレシピでは、これらのオプションについて説明します。

コンテナ内に2つの欄を持つ3種類のレイアウトスタイル。

必要条件

欄(columns)で達成したいと思うかもしれないデザインパターンがいくつかあります。

  • 新聞のような欄(段)に分割されたコンテンツの連続したスレッド。
  • すべての高さが等しい、欄(列)として配置された一並びの項目。
  • 行と列で並べられた複数行の列。

レシピ

要件を満たすためには、さまざまなレイアウト方法を選択する必要があります。

コンテンツの連続したスレッド — 段組みレイアウト

段組みレイアウト(multi-column layout、multicol)を使用して段を作成した場合、テキストは各段を順番に埋める連続したストリームのままです。 段はすべて同じサイズである必要があり、個々の段または個々の段のコンテンツをターゲットにすることはできません。

column-gap プロパティを使用して段間のギャップを制御したり、column-rule を使用して段間に線を追加したりできます。

次の場合に段組みを使用してください。

  • テキストを新聞のような段に表示したい。
  • 段に分割したい小さい項目のセットを持っている。
  • 個々の欄ボックスを装飾のターゲットにする必要がない。

同じ高さの単一行の項目 — フレックスボックス

フレックスボックス(flexbox)は、flex-directionrow に設定することでコンテンツを列に分割するために使用できますが、フレックスボックスはフレックスコンテナ内の要素をターゲットにし、それぞれの直接の子を新しい列に配置します。 これは段組みで見たものとは異なる振る舞いです。

フレックス項目間に規則を追加する方法は現在ありません。 また、column-gap および row-gap プロパティに対するブラウザーのサポートは制限されています。 したがって、項目間にギャップを作成するには、マージンを使用します。

フレックスボックスを使用して、コンテナの flex-wrap プロパティを wrap に設定することで、フレックス項目が新しい行に折り返されるレイアウトを作成することもできます。 これらの新しいフレックスラインは、そのラインに沿ってのみスペースを配分します — 以下の例に示すように、新しいラインの項目は上のラインの項目と整列しません。 これがフレックスボックスが一次元として記述されている理由です。 これは、行または列としてレイアウトを制御するために設計されていますが、同時に両方ではありません。

次の場合にフレックスボックスを使用してください。

  • 単一行または単一列の項目。
  • 項目をレイアウトした後に交差軸(cross axis)上で整列をしたいとき。
  • ラップされた項目がそれらのラインに沿ってだけスペースを共有し、他のラインの項目と並ばないことに満足しているとき。

項目を行と列に並べる — グリッドレイアウト

欲しいものが項目が行と列に並ぶレイアウトであるならば、CSS グリッドレイアウトを選ぶべきです。 グリッドレイアウトは、フレックスボックスがフレックスコンテナの直接の子に作用するのと同様の方法で、グリッドコンテナの直接の子に作用しますが、CSS グリッドでは、項目を行と列に並べることができます — これは2次元として記述されています。

次の場合にグリッドを使用してください。

  • 複数行または複数列の項目用。
  • ブロック軸とインライン軸の項目を揃えることができるようにする場合。
  • 項目を行と列に整列させたい場合。

ブラウザー実装状況

さまざまなレイアウト方法が異なるブラウザーサポートを持っています。 使用されているプロパティの基本的なサポートの詳細については、以下の表を参照してください。

column-width

BCD tables only load in the browser

column-rule

BCD tables only load in the browser

flex

BCD tables only load in the browser

flex-wrap

BCD tables only load in the browser

grid-template-columns

BCD tables only load in the browser

MDN にある資料