CSS 入門

CSS Grid レイアウト入門

CSS Gridは、ウェブ構造の制御において前例のない自由度をもたらす強力なレイアウトシステムです。これを使えば、複雑でレスポンシブなレイアウトを驚くほど簡単に作成でき、特定のシナリオでは浮動(floats)やフレックスボックス(Flexbox)といった従来のレイアウト手法を遥かに凌駕する能力を発揮します。

本セクションでは、CSS Gridの基礎を紹介し、そのコアコンセプトを解説しながら、なぜこれが現代のWeb開発において必須のツールなのかをデモンストレーションします。GridとFlexboxの根本的な違いを探り、Gridが特に真価を発揮するシチュエーションに焦点を当てていきます。

1. CSS Gridの理解

CSS Grid Layout(一般的にCSS Gridまたはグリッドレイアウトと呼ばれます)は、Webのための二次元レイアウトシステムです。これは、主に行(水平方向)または列(垂直方向)のどちらか一方向のみを扱う一次元的なFlexboxとは異なり、行と列の両方を同時にコントロールすることに長けていることを意味します。

Gridを使用すると、ウェブページを複数の領域に分割し、それぞれの領域のサイズと位置を定義して、その中にコンテンツを配置することができます。

1.1 コアコンセプト

  • Grid Container (グリッドコンテナ): display: grid または display: inline-grid が宣言された親要素。これによって、そのすべての直接の子要素に対してグリッドコンテキストが作成されます。
  • Grid Items (グリッドアイテム): グリッドコンテナの直接の子要素。これらがグリッド内に配置される要素となります。
  • Grid Lines (グリッド線): グリッド構造を定義する水平および垂直の線。これらには1から始まる番号が振られます。
  • Grid Tracks (グリッドトラック): 隣り合う2本のグリッド線の間の空間。これらが行(水平トラック)または列(垂直トラック)になります。
  • Grid Cell (グリッドセル): グリッドレイアウトにおける最小単位。行トラックと列トラックの交差によって形成されます。
  • Grid Area (グリッドエリア): 1つ以上のグリッドセルにまたがる矩形の領域。グリッドアイテムはこの中に配置されます。
  • Gaps / Gutters (ギャップ / ガター): グリッドトラック(行と列)の間の余白。

2. なぜCSS Gridを使うのか?

従来のレイアウト手法やFlexboxと比較して、CSS Gridには特定の状況下でいくつかの明確な利点があります。

  • 二次元レイアウト: Gridは二次元的な設計を目的としており、行と列を持つ複雑なページ構造を作成するのに最適です。Flexboxも強力ですが、基本的には一次元(行または列)のために設計されています。
  • 明示的なレイアウト制御: Gridは要素の配置と寸法に対して明示的なコントロールを提供します。各グリッドアイテムの正確なサイズと位置を定義できるため、精密なレイアウトが可能です。
  • レスポンシブデザイン: Gridを使えば、異なる画面サイズに適応するレスポンシブなレイアウトが容易に作成できます。メディアクエリ(Media Queries)を使用して、ビューポートのサイズに応じてグリッド構造やアイテムの位置を変更できます。
  • セマンティックなHTML: Gridはレイアウトとコンテンツを分離できるため、よりクリーンでセマンティックなHTMLを生成できます。HTML構造を修正することなく、CSSだけでレイアウトを変更することが可能です。
  • コードの簡素化: 複雑なレイアウトにおいて、他の手法と比較してGridは通常コード量を削減できます。その強力な機能により、少ないCSSコードで複雑なレイアウトを実現できます。

3. Grid vs. Flexbox: 適切なツールの選択

CSS GridとFlexboxはどちらも強力なレイアウトツールですが、設計の目的が異なります。それぞれの長所と短所を理解することで、タスクに最適なツールを選択できるようになります。

特性CSS GridFlexbox
次元二次元 (行と列)一次元 (行または列)
主なユースケースページ全体のレイアウト、複雑なUIコンポーネントコンポーネント内のレイアウト、一方向へのアイテム配置
コントロール方式行と列のサイズおよび配置を明示的に制御コンテンツベースのサイズ設定と柔軟なスペース配分
最適ページ全体の構造作成コンテナ内でのアイテム整列

3.1 Gridを使うべき場面

  • 複雑なページレイアウト: ヘッダー、サイドバー、メインコンテンツ、フッターを含むウェブサイトなど、複数の行と列を含むレイアウトを作成する場合。
  • 精密なコントロール: レイアウト内の要素のサイズと位置を正確に制御する必要がある場合。
  • 二次元の整列: 行と列の両方でアイテムを同時に整列させる必要がある場合。

3.2 Flexboxを使うべき場面

  • コンポーネントレイアウト: ナビゲーションバーやアイテムリストなど、コンポーネント内のアイテムをレイアウトする場合。
  • 一方向の整列: 単一の方向(水平または垂直)にアイテムを整列させる必要がある場合。
  • 動的なコンテンツ: コンテンツのサイズが不明または可変であり、レイアウトを自動的に適応させたい場合。

3.3 シナリオ例

例えば、写真のポートフォリオサイトを構築するとします。

  • Grid: ページ全体の構造を作成するために使用します。上部にヘッダー、中央に画像ギャラリー、下部にフッターを配置します。ギャラリー自体も、画像を正しく行と列に並べるためにGridを使用するのが適しています。
  • Flexbox: ヘッダーの内部で、ロゴを左側に、ナビゲーションリンクを右側に配置するために使用します。また、各ナビゲーションリンク内のテキストを垂直中央に揃えるのにもFlexboxが役立ちます。

4. 基本的なGridレイアウトの作成

CSS Gridの基本コンセプトを説明するために、3列×2行のグリッドを作成するシンプルな例を見てみましょう。

<div class="container">
  <div class="item item-1">Item 1</div>
  <div class="item item-2">Item 2</div>
  <div class="item item-3">Item 3</div>
  <div class="item item-4">Item 4</div>
  <div class="item item-5">Item 5</div>
  <div class="item item-6">Item 6</div>
</div>
.container {
  display: grid; /* コンテナをグリッドとして宣言 */
  grid-template-columns: 1fr 1fr 1fr; /* 等幅の3列を定義 */
  grid-template-rows: 150px 150px; /* 150pxの高さを持つ2行を定義 */
  grid-gap: 10px; /* 行と列の間に10pxのギャップを追加 */
}

.item {
  background-color: #eee;
  padding: 20px;
  font-size: 20px;
  text-align: center;
}

コード解説:

  • display: grid;: container クラスの div をグリッドコンテナに変えます。
  • grid-template-columns: 1fr 1fr 1fr;: 3つの列を定義します。fr ユニットは利用可能なスペースの断片(fraction)を表します。この場合、各列がコンテナ幅の3分の1を占めます。
  • grid-template-rows: 150px 150px;: 2つの行を定義し、各行の高さを150ピクセルに設定します。
  • grid-gap: 10px;: グリッドアイテム間に10ピクセルの間隔を追加します。

この例では、6つの item divが自動的にグリッドセル内に配置され、左から右、上から下へと埋められていきます。

5. Grid内でのアイテム配置

グリッドアイテムの自動配置は非常に便利ですが、Gridではアイテムを特定のグリッドセルに明示的に配置することも可能です。これには grid-column-startgrid-column-endgrid-row-startgrid-row-end プロパティを使用します。

先ほどの例を修正して、Item 1 を1行目に配置し、3列すべてにまたがるようにしてみましょう。

.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 150px 150px;
  grid-gap: 10px;
}

.item {
  background-color: #eee;
  padding: 20px;
  font-size: 20px;
  text-align: center;
}

.item-1 {
  grid-column-start: 1; /* 1番目の垂直グリッド線から開始 */
  grid-column-end: 4;   /* 4番目の垂直グリッド線で終了 (3列分またぐ) */
}

コード解説:

  • grid-column-start: 1;: Item 1 が最初の列グリッド線から始まるように指示します。
  • grid-column-end: 4;: Item 1 が4番目の列グリッド線で終わるように指示します。列が3つある場合、4番目の線はグリッドの右端を意味するため、Item 1 は全3列をまたぐことになります。

ショートハンドプロパティ grid-columngrid-row を使用して同じ効果を得ることもできます:

.item-1 {
  grid-column: 1 / 4; /* grid-column-start: 1; grid-column-end: 4; と同等 */
}

構文 1 / 4 は「グリッド線1から始まり、グリッド線4で終わる」という意味です。

6. 活用シナリオ:ECサイトの商品ページ

ECサイトの商品ページのレイアウトをデザインしていると想像してください。左側に商品画像を大きく表示し、右側に商品詳細(名前、説明、価格)を表示、その詳細の下にカスタマーレビューを表示したいとします。

CSS Gridを使用すれば、このレイアウトは簡単に構築できます。

  • Grid Container: 商品全体のコンテナをグリッドコンテナにします。
  • Grid Columns: 画像用の列と、詳細・レビュー用の列の2列を定義します。
  • Grid Rows: 商品詳細とカスタマーレビューのために行を定義します。
  • Placement (配置): 商品画像を最初の列に配置し、2行分またがせます。商品詳細を2列目の1行目に配置し、カスタマーレビューを2列目の2行目に配置します。

このシナリオは、Gridがいかに構造化され、視覚的に魅力的なレイアウトを効率的に作成できるかを示しています。