【CSS】もう迷わない!FlexboxとCSS Gridの違いと使い分け方
Webサイトのレイアウトを組む際、CSSには 「Flexbox(フレックスボックス)」 と 「CSS Grid(グリッド)」 という2つの強力な機能が用意されています。 しかし、「どっちを使えばいいの?」と迷ってしまうことも多いのではないでしょうか?
結論から言うと、この2つは競合するものではなく、得意な領域が違うため「適材適所で使い分ける」 のが正解です!
今回は、「こういう時はFlexbox」「こういう時はGrid」という具体的な使い分けの基準を、シンプルなデモを交えてご紹介します。(※Flexbox, CSS Gridのより詳しい使い方については、今後の別記事でじっくり解説する予定です!)
デモ動作
See the Pen FlexboxとCSS Gridの使い分け by mikanbako (@mikanbako) on CodePen.
demo: FlexboxとCSS Gridの使い分け
実装コード紹介
【HTML】
<div class="l-wrap">
<h2>Flexbox と CSS Grid の使い分けデモ</h2>
<p class="p-desc">それぞれの「得意なこと」を視覚的に比較してみましょう!</p>
<div class="p-demo-box">
<!-- ⭕️ Flexbox の得意分野:1方向(横)の並び -->
<div class="p-card">
<h3 class="p-card__title">1.1. Flexbox の例(横並び)</h3>
<p class="p-card__text">要素の中身に合わせて、横一列に柔軟に並べるのが得意です。</p>
<ul class="c-flex-nav c-flex-nav--row">
<li class="c-flex-nav__item">Home</li>
<li class="c-flex-nav__item">About</li>
<li class="c-flex-nav__item">Services & Pricing</li>
<li class="c-flex-nav__item">Contact</li>
</ul>
</div>
<!-- ⭕️ Flexbox の得意分野:1方向(縦)の並び -->
<div class="p-card">
<h3 class="p-card__title">1.2. Flexbox の例(縦積み)</h3>
<p class="p-card__text">要素の中身に合わせて、縦一列に並べます。</p>
<ul class="c-flex-nav c-flex-nav--column">
<li class="c-flex-nav__item">Home</li>
<li class="c-flex-nav__item">About</li>
<li class="c-flex-nav__item">Services & Pricing</li>
<li class="c-flex-nav__item">Contact</li>
</ul>
</div>
<!-- ⭕️ CSS Grid の得意分野:2方向(行と列)のマス目配置 -->
<div class="p-card">
<h3 class="p-card__title">2. CSS Grid の例(カードのタイル配置)</h3>
<p class="p-card__text">縦と横の「マス目」を作り、そこにピッタリはめ込むのが得意です。</p>
<div class="c-grid-layout">
<div class="c-grid-card">Item A</div>
<div class="c-grid-card">Item B</div>
<div class="c-grid-card">Item C</div>
<div class="c-grid-card">Item D</div>
<div class="c-grid-card">Item E</div>
<div class="c-grid-card">Item F</div>
<div class="c-grid-card">Item G</div>
<div class="c-grid-card">Item H</div>
<div class="c-grid-card">Item I</div>
</div>
</div>
</div>
</div>
【CSS】
/* ベース装飾 */
.l-wrap {
max-width: 800px;
margin: 0 auto;
padding: 40px 20px;
text-align: center;
color: #3e3e3e;
}
h2 {
margin-bottom: 16px;
font-size: 16px;
color: #1bb4d4;
}
.p-desc {
margin-bottom: 40px;
font-size: 16px;
font-weight: bold;
color: #666;
line-height: 1.6;
}
/* レイアウト調整 */
.p-demo-box {
display: flex;
flex-direction: column;
gap: 40px;
}
.p-card {
padding: 30px;
text-align: left;
background: #fff;
border-radius: 12px;
box-shadow: 0 4px 15px rgb(0 0 0 / 5%);
}
.p-card__title {
padding-bottom: 10px;
margin-bottom: 10px;
font-size: 16px;
color: #333;
border-bottom: 2px solid #eee;
}
.p-card__text {
margin-bottom: 20px;
font-size: 14px;
color: #666;
}
/* =========================================
💡 1. Flexbox のスタイル(1次元)
========================================= */
.c-flex-nav {
display: flex; /* フレックスボックスを有効化 */
gap: 16px; /* 要素のすき間 */
}
/* 1.1. 横並び */
.c-flex-nav--row {
flex-direction: row; /* デフォルトで横並び設定 */
}
/* 1.2. 縦積み */
.c-flex-nav--column {
flex-direction: column; /* 縦積み */
align-items: center;
}
.c-flex-nav__item {
padding: 10px 20px;
font-size: 14px;
font-weight: bold;
color: #fff;
background: #1bb4d4;
border-radius: 6px;
/* 文字の長さに合わせて横幅が自動で決まります */
}
/* =========================================
💡 2. CSS Grid のスタイル(2次元)
========================================= */
.c-grid-layout {
display: grid; /* グリッドを有効化 */
/* ↓ 3列(1fr 1fr 1fr)で配置するという明示的なルール */
grid-template-columns: 1fr 1fr 1fr;
gap: 16px; /* 縦横のすき間 */
}
.c-grid-card {
padding: 20px;
font-size: 14px;
font-weight: bold;
color: #fff;
text-align: center;
background: #e83e8c;
border-radius: 6px;
}
コードの解説・仕組み
Flexbox は「1次元(線)」
/* =========================================
💡 1. Flexbox のスタイル(1次元)
========================================= */
.c-flex-nav {
display: flex; /* フレックスボックスを有効化 */
gap: 16px; /* 要素のすき間 */
}
/* 1.1. 横並び */
.c-flex-nav--row {
flex-direction: row; /* デフォルトで横並び設定 */
}
/* 1.2. 縦積み */
.c-flex-nav--column {
flex-direction: column; /* 縦積み */
align-items: center;
}
要素を「横一列」または「縦一列」に並べるためのツールです。要素のコンテンツ量(文字の長さなど)に応じて、柔軟にサイズを伸縮させたい時に使います。
【よく使う場面】
ナビゲーションメニュー、アイコンとテキストの並び、ボタンのグループなど、部品(コンポーネント)レベルの細かなレイアウト。
CSS Grid は「2次元(面)」
/* =========================================
💡 2. CSS Grid のスタイル(2次元)
========================================= */
.c-grid-layout {
display: grid; /* グリッドを有効化 */
/* ↓ 3列(1fr 1fr 1fr)で配置するという明示的なルール */
grid-template-columns: 1fr 1fr 1fr;
gap: 16px; /* 縦横のすき間 */
}
縦(列)と横(行)のマス目(グリッド)を先に定義し、そこに要素をはめ込んでいくためのツールです。
【よく使う場面】
ページ全体の骨組み(ヘッダー・メイン・サイドバー・フッターの配置)や、画像ギャラリー、カードのタイル配置など、規則的で大きなレイアウト。
補足:公式ドキュメント
より詳細な仕様や他の活用例について知りたい方は、ぜひMDNの公式ドキュメントもチェックしてみてください!
まとめ
「とりあえず何でもFlexboxで組む」というのも可能ですが、マス目状のレイアウトをFlexboxで無理やり作ろうとすると、幅の計算(width: calc(...) など)が複雑になりがちです。
「中身のコンテンツに合わせて並べるならFlexbox」「外枠のルール(マス目)に合わせて配置するならGrid」 という基準を持っておくと、コーディングが楽になり、スッキリとしたCSSを書くことができます。ぜひ皆さんも適材適所で使い分けてみてください!