2026年版 ToolShare Lab / Guide

CSS Grid入門|基本から
実践レイアウトまで完全ガイド

「CSSで2カラムレイアウトが思うように作れない」「Flexboxじゃ限界がある」——そのモヤモヤを解消するのがCSS Gridだ。グリッドコンテナーの設定からfr単位、auto-fit/auto-fillによるレスポンシブ対応、ホーリーグレイルなど実践レイアウト5パターンまで、コピーして使えるコードとともに一通り押さえよう。

読了時間: 約12分 更新日: 2026年3月10日

CSS Gridとは(Flexboxとの使い分け)

CSS Grid Layout(以下CSS Grid)は、Webページのレイアウトを行と列の2次元で制御できるCSSモジュールだ。2017年に主要ブラウザが一斉対応し、2026年現在では全モダンブラウザが完全サポートしている。

CSS Grid以前は、floatやinline-blockを駆使した回避策が当たり前だった。その後Flexboxが普及して横並びレイアウトは格段に楽になったが、複雑な2次元レイアウトには限界があった。CSS Gridはその問題を根本から解決する。

FlexboxとCSS Gridの使い分け

Flexboxを使うかCSS Gridを使うかの判断軸は「コンテンツが主役かレイアウトが主役か」だ。

特徴 Flexbox CSS Grid
次元 1次元(行 または 列) 2次元(行 列を同時に制御)
得意なこと ナビゲーション、ボタン群、カードの横並び ページ全体レイアウト、複雑なグリッド、非均一配置
主役 コンテンツ(コンテンツサイズに応じてフレキシブル) レイアウト(先にグリッドを定義してアイテムを配置)
アイテムの制御 主軸方向のみ細かく制御 行・列の両方向を正確に制御

Point

FlexboxとCSS Gridは競合ではなく補完関係だ。ページ全体の骨格はCSS Gridで組み、カード内部のコンテンツ配置はFlexboxで整える——両方を組み合わせるのがモダンなアプローチになる。

基本用語を理解する

CSS Gridを使いこなすには、専用の用語を最初に押さえておくのが近道だ。以下の6つの概念がコアになる。

  1. Grid Container(グリッドコンテナー)

    display: grid または display: inline-grid を指定した要素がグリッドコンテナーになる。直接の子要素が自動的にグリッドレイアウトの対象になる。

  2. Grid Item(グリッドアイテム)

    グリッドコンテナーの直接の子要素。孫要素以下は通常のフローに従う。grid-columngrid-row を指定すれば、配置先のセルを明示的に指定できる。

  3. Grid Line(グリッドライン)

    グリッドを構成する水平・垂直の仮想的な線。列(column)方向のラインは左から1, 2, 3…、行(row)方向は上から1, 2, 3…と番号が振られる。マイナス番号で末尾から数えることも可能(-1が末尾)。

  4. Grid Track(グリッドトラック)

    2本の隣接するグリッドライン間のスペース。列トラック(column track)と行トラック(row track)があり、それぞれ grid-template-columnsgrid-template-rows で幅・高さを定義する。

  5. Grid Cell(グリッドセル)

    行トラックと列トラックが交差してできる最小単位のスペース。表のセルに相当する。デフォルトではグリッドアイテムが1セルずつ順番に配置される。

  6. Grid Area(グリッドエリア)

    1つ以上のグリッドセルで構成される矩形の領域。grid-area プロパティで名前を付け、grid-template-areas で配置を視覚的に定義できる。複雑なレイアウトを直感的に書ける強力な機能だ。

コンテナーのプロパティ

グリッドコンテナーに指定するプロパティでレイアウトの骨格を組む。まず押さえるべき5つのプロパティをまとめた。

display: grid

グリッドレイアウトの起点となる宣言だ。これを指定した要素がグリッドコンテナーになる。

.container { display: grid; /* ブロックレベルのグリッドコンテナー */ } .container-inline { display: inline-grid; /* インラインレベルのグリッドコンテナー */ }

grid-template-columns / grid-template-rows

列と行のトラックサイズを定義する。スペース区切りで左から順に各トラックのサイズを指定する。px・%・fr(後述)・auto・minmax()など多様な単位と関数が使える。

.container { display: grid; /* 3カラム: 固定200px / 自動伸縮 / 固定150px */ grid-template-columns: 200px 1fr 150px; /* 4等分カラム */ grid-template-columns: 1fr 1fr 1fr 1fr; /* repeat()で繰り返しを省略 */ grid-template-columns: repeat(4, 1fr); /* 行の高さを指定 */ grid-template-rows: 80px 1fr 60px; }

gap(旧: grid-gap)

グリッドアイテム間の余白(ガター)を設定する。row-gapcolumn-gapの一括指定だ。値を2つ書いた場合は「行方向のgap / 列方向のgap」の順になる。

.container { display: grid; grid-template-columns: repeat(3, 1fr); /* 行・列ともに20px */ gap: 20px; /* 行32px / 列16px */ gap: 32px 16px; /* 個別指定 */ row-gap: 32px; column-gap: 16px; }

grid-template-areas

グリッドエリアに名前を付けて視覚的にレイアウトを定義できる、CSS Gridでも特に強力なプロパティだ。「どこに何を置くか」をASCIIアートの感覚で書けるのが直感的でいい。

.container { display: grid; grid-template-columns: 240px 1fr; grid-template-rows: 80px 1fr 60px; grid-template-areas: "header header" "sidebar main" "footer footer"; min-height: 100vh; } /* 各アイテムにエリア名を割り当て */ .header { grid-area: header; } .sidebar { grid-area: sidebar; } .main { grid-area: main; } .footer { grid-area: footer; }

Point

エリア名に .(ドット)を使うと「空のセル」を表現できる。"header . main" と書けばヘッダーとメインの間に空のセルが挟まる。

justify-items / align-items

全グリッドアイテムのセル内での水平・垂直位置をまとめて指定する。個別のアイテムには justify-self / align-self で上書きできる(後述)。

.container { display: grid; grid-template-columns: repeat(3, 200px); /* 水平方向: start / end / center / stretch(初期値) */ justify-items: center; /* 垂直方向: start / end / center / stretch(初期値) */ align-items: center; /* 一括指定 */ place-items: center center; /* align justify の順 */ }

アイテムのプロパティ

グリッドアイテム側に指定するプロパティで、個々の配置位置や大きさをコントロールする。

grid-column / grid-row

アイテムが占めるグリッドラインの範囲を指定する。開始ライン / 終了ライン の形式が基本。span N を使えば「Nトラック分広げる」という相対指定もできる。

.item-a { /* 列: ライン1から3(2カラム分)*/ grid-column: 1 / 3; /* 行: ライン1から2(1行分)*/ grid-row: 1 / 2; } .item-b { /* span を使った相対指定 */ grid-column: 2 / span 2; /* ライン2から2カラム分 */ grid-row: span 2; /* 現在位置から2行分 */ } .item-full-width { /* 列全体に広げる(-1は末尾のライン)*/ grid-column: 1 / -1; }

grid-area

アイテムに名前付きグリッドエリアを割り当てる。grid-template-areas と組み合わせるのが基本の使い方だ。row-start / column-start / row-end / column-end の4値形式でも書ける。

/* grid-template-areas と組み合わせて使う場合 */ .header { grid-area: header; } .main { grid-area: main; } /* 4値形式(row-start / col-start / row-end / col-end)*/ .item { grid-area: 1 / 1 / 3 / 4; }

justify-self / align-self

個別のグリッドアイテムのセル内での水平・垂直位置を指定する。コンテナーの justify-items / align-items による設定を上書きする形だ。

.special-item { /* このアイテムだけ右寄せ */ justify-self: end; /* このアイテムだけ上寄せ */ align-self: start; /* 一括指定(align justify の順)*/ place-self: start end; }

fr単位とminmax()の活用

CSS Gridで新しく追加された fr(fractional unit)単位と minmax() 関数は、崩れにくいレイアウトを作る上で欠かせない。この2つの理解が「CSS Gridを使いこなせる」かどうかの分岐点になる。

fr単位とは

fr は「グリッドコンテナーの余白スペースを分割する比率」を表す単位だ。固定幅のカラム(pxや%)を除いた残りのスペースをfrの比率で分配する。

.container { display: grid; width: 900px; /* 左200px固定、残り700pxを2:1で分割 */ /* → 中央: 約467px / 右: 約233px */ grid-template-columns: 200px 2fr 1fr; } /* 全カラムを等分(よく使うパターン)*/ .equal-cols { display: grid; grid-template-columns: repeat(3, 1fr); }

minmax()関数

minmax(最小値, 最大値) はトラックのサイズに最小・最大の制約を設ける関数だ。コンテナーが縮んでも最小幅を守り、広がっても最大幅を超えない。レスポンシブで崩れないカラムを作りたいとき、これが本領を発揮する。

.container { display: grid; /* 最小200px / 最大1frで伸縮 */ grid-template-columns: minmax(200px, 1fr) minmax(200px, 2fr); /* サイドバー: 最小150px、最大250px */ /* メイン: 最小0、残りすべて */ grid-template-columns: minmax(150px, 250px) 1fr; }

Point

最大値に 1fr を指定すると、利用可能スペースが最小値より大きい時は比率で伸縮し、最小値以下になったら最小値を守る。minmax(最小px, 1fr) がCSS Gridで多用される理由がここにある。

auto-fit/auto-fillによるレスポンシブグリッド

メディアクエリを一切書かずにレスポンシブなグリッドを実現できる——CSS Gridの最大の強みの一つだ。repeat() 関数の第1引数に auto-fit または auto-fill を使う。

基本パターン(RAM: Repeat, Auto, Minmax)

コンテナー幅に応じてカラム数が自動調整されるグリッドは、次のパターンで実現できる。

.card-grid { display: grid; /* 最小240px確保、残りを均等分割 */ /* コンテナー幅に応じてカラム数が自動変化 */ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 24px; } /* 例: コンテナー幅800px → 3カラム (約253px × 3) コンテナー幅500px → 2カラム (約238px × 2) コンテナー幅280px → 1カラム (280px × 1) */

auto-fit と auto-fill の違い

どちらも「コンテナーに収まるだけトラックを作る」点では同じだが、アイテムが少ない時の挙動が違う。ここが使い分けのポイントだ。

プロパティ アイテムが少ない時の挙動 使い所
auto-fill 空のトラックを保持し、アイテムを左寄せに配置 カラム数を維持したい時(ページネーションがある一覧など)
auto-fit 空のトラックを折り畳み、アイテムが幅いっぱいに広がる アイテムを画面幅いっぱいに並べたい時(フィーチャーカードなど)
/* auto-fill: 空トラックを残す(左寄せになる)*/ .auto-fill-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 16px; } /* auto-fit: 空トラックを折り畳む(アイテムが引き伸ばされる)*/ .auto-fit-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; }

実践レイアウト5パターン

コードで見ると一番わかりやすい。実際によく使われるレイアウトパターンを5つ紹介する。いずれもコピーしてそのまま使える。

パターン1: ホーリーグレイルレイアウト

ヘッダー・フッターが全幅、中央にメインコンテンツ、両側にサイドバーとナビゲーションを持つ伝統的なレイアウトだ。WordPressテンプレートやCMSのデフォルトレイアウトでよく見る構成で、CSS Gridなら数行で書ける。

/* HTML構造 <div class="holy-grail"> <header class="hg-header">Header</header> <nav class="hg-nav">Navigation</nav> <main class="hg-main">Main Content</main> <aside class="hg-aside">Sidebar</aside> <footer class="hg-footer">Footer</footer> </div> */ .holy-grail { display: grid; grid-template-columns: 200px 1fr 160px; grid-template-rows: auto 1fr auto; grid-template-areas: "header header header" "nav main aside" "footer footer footer"; min-height: 100vh; gap: 0; } .hg-header { grid-area: header; } .hg-nav { grid-area: nav; } .hg-main { grid-area: main; } .hg-aside { grid-area: aside; } .hg-footer { grid-area: footer; } /* モバイル: 縦1カラムに切り替え */ @media (max-width: 768px) { .holy-grail { grid-template-columns: 1fr; grid-template-areas: "header" "nav" "main" "aside" "footer"; } }

パターン2: カード一覧(レスポンシブ)

EC・ポートフォリオ・ツールサイトで頻出のカード一覧パターンだ。auto-fitを使えばメディアクエリなしでレスポンシブになる。Next.jsやNuxtのページテンプレートでも定番のレイアウト。

.card-list { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 24px; padding: 24px; } .card { background: #fff; border-radius: 8px; padding: 24px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } /* 特定のカードをスパン(目玉カードを大きく)*/ .card--featured { grid-column: span 2; } @media (max-width: 600px) { .card--featured { grid-column: span 1; } }

パターン3: マガジンレイアウト

ニュースサイト・ブログ・メディアサイトでよく見かける、異なるサイズのカードが混在するレイアウトだ。CSS Gridの真骨頂といえる非均一なグリッドが数十行で書ける。

.magazine { display: grid; grid-template-columns: repeat(6, 1fr); grid-auto-rows: 200px; gap: 16px; } /* メイン記事: 4カラム × 2行 */ .magazine__main { grid-column: span 4; grid-row: span 2; } /* サブ記事1: 2カラム × 1行 */ .magazine__sub1 { grid-column: span 2; } /* サブ記事2: 2カラム × 1行 */ .magazine__sub2 { grid-column: span 2; } /* 小記事3つ: 2カラムずつ × 1行 */ .magazine__small { grid-column: span 2; } @media (max-width: 768px) { .magazine { grid-template-columns: 1fr; grid-auto-rows: auto; } .magazine__main, .magazine__sub1, .magazine__sub2, .magazine__small { grid-column: span 1; grid-row: span 1; } }

パターン4: ダッシュボードレイアウト

SaaS管理画面やデータ分析ダッシュボードで定番のレイアウトだ。サイドバーを固定しつつ、メインエリアにウィジェットをグリッドで並べる構成はNext.jsのApp Routerでもよく使われる。

/* 外枠: サイドバー + メインエリア */ .dashboard { display: grid; grid-template-columns: 260px 1fr; grid-template-rows: 64px 1fr; grid-template-areas: "sidebar topbar" "sidebar content"; min-height: 100vh; } .sidebar { grid-area: sidebar; overflow-y: auto; } .topbar { grid-area: topbar; } .content { grid-area: content; padding: 24px; overflow-y: auto; } /* ウィジェットグリッド(メインコンテンツ内)*/ .widget-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 20px; } /* 大きいウィジェット(チャートなど)*/ .widget--wide { grid-column: span 2; }

パターン5: フッターレイアウト

マルチカラムフッターをCSS Gridで組むと、メディアクエリでの列組み替えが非常に楽になる。ロゴカラムを広めに取って、リンクカラムを均等に並べるパターンをそのまま使ってほしい。

.footer-grid { display: grid; /* ロゴ列: 広め / リンク列: 3つを均等 */ grid-template-columns: 2fr repeat(3, 1fr); gap: 40px 24px; padding: 64px 0 40px; } @media (max-width: 900px) { .footer-grid { grid-template-columns: 1fr 1fr; } /* ロゴ列を全幅に */ .footer-grid__brand { grid-column: 1 / -1; } } @media (max-width: 480px) { .footer-grid { grid-template-columns: 1fr; } }

ツールで効率化

実際にグリッドを試しながら設計したい場合は、当サイトのCSS Gridジェネレーターが便利だ。視覚的にカラム・行・gapを設定し、生成されたCSSコードをそのままコピーできる。

CSS Gridジェネレーターの使い方

CSS Gridのプロパティは多数あり、慣れるまでは頭の中でレイアウトをイメージしながらコードを書くのが大変だ。そこで活用したいのがToolShare LabのCSS Gridジェネレーターだ。

  1. カラム数と行数を設定する

    スライダーまたは入力フォームでカラム数・行数を指定。各トラックのサイズは個別に変更でき、fr・px・%・autoなど主要単位に対応している。

  2. gapを調整する

    行・列のgapをリアルタイムプレビューで確認しながら設定できる。デザインに合わせてピクセル単位で微調整してみよう。

  3. アイテムの配置を指定する

    グリッドセルをクリック&ドラッグでアイテムをスパン配置できる。grid-column / grid-rowの値は自動計算される。

  4. CSSをコピーする

    「CSSをコピー」ボタンで生成コードをクリップボードにコピーし、プロジェクトにそのまま貼り付け可能。コンテナーとアイテムのCSSが分けて出力される。

Point

ジェネレーターはあくまで出発点だ。生成されたCSSをベースに minmax()auto-fit を追加してレスポンシブ対応を加えたり、grid-template-areas で可読性を高めるなど、プロジェクトに合わせてカスタマイズしていこう。

ブラウザの開発者ツールで確認する

CSS Gridのデバッグにはブラウザ内蔵の開発者ツールが特に便利だ。ChromeもFirefoxも、グリッドコンテナーを検査するとグリッドラインのオーバーレイ表示機能がある。ネストが複雑なときは必ず使いたい。

CSS Grid ブラウザサポート状況(2026年)

CSS Grid(Level 1)は2026年現在、全モダンブラウザで完全サポートされている。Edge・Chrome・Firefox・Safari・Opera、いずれも対応済みで世界のブラウザシェアの97%以上をカバーしている。IE11はサポートが2022年6月に終了しているため、もはや考慮不要だ。

subgrid(Level 2)はFirefox 71以降・Chrome 117以降・Safari 16以降で使える。ネストされたグリッドが親グリッドのトラックを引き継げる高度な機能で、複数カードの内部要素を縦横揃えるような実装がきれいに書けるようになる。今後の案件では積極的に使っていい段階になってきた。

CSS Gridジェネレーターを今すぐ使う

グリッドのカラム数・行数・gapをGUIで設定してCSSコードをそのままコピーできる。登録不要・完全無料。複雑なレイアウトもビジュアルで試しながら設計できるので、コードを書く前の検討にも使いやすい。

よくある質問

CSS GridとFlexbox、どちらを先に覚えるべきですか?
Flexboxを先に習得するのがセオリーだ。1次元(横並び・縦並び)のレイアウトに強く、ナビゲーションやボタン群など使い場面が多い。Flexboxをひととおり使えるようになってから、ページ全体の骨格を組む段階でCSS Gridを追加で学ぶと効率がいい。実務では両方を組み合わせて使うのが標準になっている。
fr単位と%(パーセント)の違いは何ですか?
最大の違いはgap(余白)の扱いだ。%はコンテナーの幅に対する割合なので、gapを追加すると合計が100%を超えてはみ出す可能性がある。一方frはgapを除いた余白スペースを分配するため、gapがあっても計算ずれが起きない。フレキシブルなカラム指定にはfr一択だ。
auto-fitとauto-fillはどちらを使えばいいですか?
カードを画面いっぱいに広げたければ auto-fit、カラム数を維持して左寄せにしたければ auto-fill だ。実務では auto-fit のほうがよく使われる。アイテムが少ない時でもコンテナー幅いっぱいに均等に広がるため見た目が自然に整う。迷ったらまず auto-fit を試してみよう。
grid-template-areasを使うメリットは何ですか?
レイアウトの意図がコードから一目でわかるのが最大のメリットだ。grid-column/grid-rowの数値指定は複雑になりがちだが、grid-template-areasを使うとASCIIアートのような形でレイアウトを記述できる。メディアクエリで切り替える際もgrid-template-areasを書き換えるだけで済み、保守性が格段に上がる。
CSS GridはIE11でも使えますか?
IE11は独自の古い実装(-ms-プレフィックス版)で一部のGrid機能に対応していたが、標準仕様との互換性が低く現在のCSS Gridの大半の機能は動作しない。IE11のサポートは2022年6月に終了しており、2026年現在でIE11対応を要件にするプロジェクトはほぼない。IE11は無視してCSS Gridをフル活用していい。
subgridとは何ですか?通常のCSS Gridと何が違いますか?
subgridはネストされたグリッドアイテムが親グリッドのトラック定義を引き継げる機能だ(CSS Grid Level 2)。通常のネストグリッドでは子要素に独立したグリッドを定義するため、親の列・行の幅に合わせられない。subgridを使うと孫要素が親グリッドのラインにスナップするため、複数カードの内部コンテンツを縦横揃えるといった高度なレイアウトがきれいに書ける。Chrome 117以降・Firefox 71以降・Safari 16以降でサポート済みだ。