CSS

The CSS gap property sets consistent spacing between items in grid or flex layouts without relying on item margins, making responsive spacing easier to manage.

gap

gap は、gridflex の子要素間のすき間を「行/列」としてまとめて指定するプロパティです。

このページでできるようになること

まずは直感:gap って何?

ざっくり言うと、gap は「並べた要素どうしのを一括で空ける」ためのスイッチで、margin より端が汚れにくいのが強みです。

正確な定義(仕様に沿った説明)

何のために存在するか

gap はレイアウトコンテナ(主に display: grid / display: flex)に対して、子要素どうしの間隔を 行方向(row-gap列方向(column-gap で指定するためのプロパティです。

何に適用されるか(対象)

gap は「コンテナ側」に書きます。典型は grid コンテナと flex コンテナで、子要素そのものに書いても効果はありません。

できること / できないこと(制約)

できること
  • 子要素どうしの間隔を、端に余白を作りにくい形で統一できる
  • gap で縦横同時、または row-gap/column-gap で縦横別の間隔にできる
  • flex-wrapgrid の再配置でも、間隔指定をほぼ触らずに保てる
できないこと(重要)
  • コンテナの外周に余白を作ること(外周は padding / margin の仕事)
  • アイテムの大きさそのものを変えること(width/flex/grid-template-columns 等で決める)
  • すべての並び方で「行/列」の意味が同じになること(flex-direction で行/列の方向が入れ替わる)

影響範囲(レイアウト/描画/ユーザー操作/アクセシビリティ)

レイアウト
gap はレイアウトの計算に参加し、アイテムの間にすき間を確保します。限られた幅の中で gap を増やすと、アイテムが縮む・折り返す・行数が増えるなどの変化が起きます。
描画
すき間は「空白」なので、背景色は基本的にコンテナ側の背景が見えます。区切り線のように見せたい場合は、背景や border を併用します。
ユーザー操作
要素間の距離が広がるため、誤タップの減少などに効くことがあります。ただし、クリック領域自体が増えるわけではないので、必要なら padding 等でタップ領域を確保します。
アクセシビリティ
間隔が詰まりすぎると読みづらく、操作もしづらくなります。gap は「見た目の余白」と「操作の余白」を両方支えることがあるため、狭幅では値を落とす・行間を確保するなどを検討します。

基本の書き方(最短の型)

最小サンプル(コピペ用)

CSS

.list {
    display: grid;
    gap: 16px;
}

まずは「コンテナに display を指定 → gap を付ける」を覚えるのが最短です。

よく使う値/典型パターン

縦横どちらも同じ間隔
gap: 16px;
縦と横を分ける
gap: 8px 16px;row-gap8pxcolumn-gap16px
縦だけ/横だけ
row-gap: 12px; / column-gap: 12px;
レスポンシブで伸縮させる
gap: clamp(12px, 2vw, 24px);(広い画面で少し広げる)

どこに書くか(外部CSS/ページ内style/インライン)

基本:外部CSS(推奨)
実務ではコンテナのクラス(例:.cardList)に displaygap をまとめ、部品として再利用できる形にします。
ページ内 <style>
学習用デモや単体ページで完結させたいときに向いています(このページのデモはページ内にあります)。
インライン(例外)
style="gap: 16px" は検証には便利ですが、運用では差分が追いにくいので基本は避けます。

最小サンプル(grid + gap)

A
B
C
D
E
F

HTML

<div class="demo-wrapper">
    <div class="demo-grid" id="gridDemo">
        <div>A</div>
        <div>B</div>
        <div>C</div>
        <div>D</div>
        <div>E</div>
        <div>F</div>
    </div>

    <div class="controls">
        <label>
            gap: <span id="gapValue">16</span>px
        </label>
        <br>
        <input type="range" id="gapSlider" min="0" max="60" value="16">
    </div>
</div>

CSS

.demo-wrapper {
    max-width: 600px;
    margin: 40px auto;
    font-family: sans-serif;
}

.controls {
    margin-bottom: 16px;
    text-align: center;
}

.controls label {
    font-weight: bold;
}

.demo-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 16px; /* 初期値 */
    background: #f0f0f0; /* gap部分が見える */
    padding: 12px;
    transition: gap 0.1s linear;
}

.demo-grid div {
    background: #00008030;
    padding: 24px;
    text-align: center;
    font-weight: bold;
}

JavaScript

const slider = document.getElementById("gapSlider");
const grid = document.getElementById("gridDemo");
const valueLabel = document.getElementById("gapValue");

slider.addEventListener("input", function() {
    const value = slider.value + "px";
    grid.style.gap = value;
    valueLabel.textContent = slider.value;
});

仕様として押さえるポイント(初心者が事故りやすい所)

継承する?(inheritance)
gap継承しません。親に書いた gap が子へ伝播するのではなく、「その親がコンテナのときに、子同士の間隔を作る」プロパティです。
初期値は?(initial)
初期値は 0 で、指定しなければすき間は作られません。
適用対象は?(applies to)
基本は grid / flex のコンテナ(親要素)です。子要素に書いても効果がないため、「どこに書いたか」を最初に疑います。
row-gap / column-gap とショートハンド
gap: 12px 24px; のように2つ書くと「row-gap12pxcolumn-gap24px」です。順番を逆に覚える事故が多いので、row → column の順で固定します。
% の基準は?(percentages)
gap は長さ(px/rem/% など)で指定できます。% は基本的にコンテナサイズ基準になるため、意図がブレそうなら remclamp() を選ぶ方が安全です。
算出値/使用値の考え方(computed/used value)
DevTools の Computedrow-gapcolumn-gap の最終値を見ます。ショートハンドで書いても、Computed では分解された値で表示されることが多いです。
無効値の扱い
無効な値(例:gap: big;)は無視され、その宣言は効きません。結果として他のルール(または初期値 0)になります。DevTools の Styles で打ち消しや無効化を確認します。
アニメーション可能?(animatable)
長さとして指定した gap はアニメーション可能です。ただしレイアウトが毎フレーム変わるため、重い場合は prefers-reduced-motion を尊重し、必要な範囲に抑えます。

よくある勘違い・混同ポイント

gap は子要素に書く
違います。gap はコンテナ側(親要素)に書きます。子要素に書いても間隔は増えません。
gapmargin は同じ

同じ「すき間」に見えますが、扱いが違います。

  • gap → アイテムだけにすき間を作る(端に余白が付きにくい)
  • margin → アイテムに余白を付ける(端にも余白が出たり、相殺や折り返し調整が必要)
grid-gap / grid-row-gap / grid-column-gap を今も使う
古い名前に見えるプロパティは、現場では基本的に gap/row-gap/column-gap に寄せます。混在すると「どれが勝っているか」の判断が増えます。
「間隔が足りない」ので親に padding を増やす
親の padding は外周の余白です。間隔(子同士)が足りないなら、まず gap を疑います(外周と間を混ぜると、レスポンシブで調整が増えます)。

実務でよくある使用例(制作会社の現場を想定)

カード一覧(grid)で間隔を一元化する

カード一覧は gridgap の相性が良く、デザイン変更(間隔だけ広げる/詰める)にも強いです。外周は padding、間は gap と分けると保守が楽です。

タグやボタンの並び(flex-wrap)で折り返しに強くする

タグ一覧や小さなボタン群を flex-wrap: wrap で折り返す場合、margin で調整すると「端の余白」や「行間」が崩れがちです。gap なら折り返し行にも自然に間隔が入ります。

フォームの縦並び(column)で行間を決める

フォーム項目の縦方向の間隔は row-gap(または gap)で固定すると、各項目に margin-bottom を付けるよりも最後の項目だけ例外処理をしなくて済みます。

実務で起きがちな事故と回避策

「gap が効かない」

原因候補:コンテナになっていない
display: block のままだと gap は期待どおりに効きません。親要素display: grid または display: flex が入っているか確認します。
原因候補:書く場所を間違えている
gapに書きます。子に書いていたら、親へ移します。
最短の確認(DevTools)
DevTools の Computeddisplayrow-gap/column-gap を見て、値が 0 のままか、打ち消されていないかを確認します。

「端の余白がズレる/二重になる」

原因候補:margin 方式を混ぜている
margin で間隔を作り、さらにコンテナに padding を付けると、端が二重に広がりがちです。間隔は gap、外周は padding と責務を分けます。
原因候補:最後だけ margin-bottom が残っている
縦並びの部品で margin-bottom を使うと「最後だけ例外(0にする)」が必要になります。gap に寄せると例外が減ります。

「狭い画面で詰まりすぎる/広すぎる」

回避:clamp() やメディアクエリで調整する
gap: clamp(12px, 2vw, 24px); のように、極端にならない範囲で伸縮させます。狭幅ではタップ間隔と可読性を優先して、詰めすぎないようにします。

アクセシビリティ/UX観点での注意(必要な範囲で)

関連プロパティ・関連セレクタとの組み合わせ・相互作用

padding
外周(コンテナ内側)の余白。gap と役割を分けると事故が減る。
margin
アイテム自体の余白。端の余白や相殺(margin の相殺)で調整が増えやすい。
flex-wrap
折り返しが増えるほど gap の価値が出る。margin 調整より自然に行間が付く。
justify-content / align-content
余ったスペースの配り方。gap で間隔を決めたうえで「余り」をどう使うかを決める。
grid-template-columns
列の幅を決める本体。gap を大きくすると、同じ幅でも詰まり方が変わるのでセットで調整する。

試験(Webクリエイター能力認定試験)で得点できる整理

用語

ひっかけポイント

ミニ確認

Q1. gap を書くべき場所はどこ? A. 子要素ではなく、display: grid または display: flex の「親(コンテナ)」です。
Q2. gap: 8px 16px; は何を意味する? A. row-gap: 8px;column-gap: 16px; です(順番は row → column)。
Q3. アイテム間は空けたいが、端は詰めたい。どれが向く? A. gap が向きます。端の余白は padding で別に調整します。
Q4. 「効かない」ときに最初に確認するCSSは? A. 親の displaygrid/flex になっているか)と、Computed の row-gap/column-gap0 のままかです。

よくある質問(FAQ)

gap が効かないのはなぜ?
親要素が display: grid / display: flex になっていない、または gap を子要素に書いている可能性が高いです。DevTools の Computeddisplayrow-gap/column-gap を確認します。
gapmargin、結局どっちで間隔を作る?
「アイテム間だけを均一に」なら gap が第一候補です。margin は「特定の要素だけずらす」「一部だけ余白を足す」など、局所的な調整で使うと事故が減ります。
gap の外側(端)にも余白が欲しい
外側は gap ではなく、コンテナに padding を付けます。間(gap)と外周(padding)を分けるとレスポンシブで調整が楽です。
flex-direction: column で縦だけ空けたい
縦方向のすき間は row-gap として扱われることが多いですが、方向で感覚が逆転しやすいです。迷うなら gap を1つ(両方同じ)で始め、必要になったら row-gap/column-gap に分けます。

よくあるエラー/症状 早見表

症状:gap が効かない
原因候補:親が grid/flex ではない、子に書いている、上書きで gap: 0。確認:DevTools の Computed で displayrow-gap/column-gap
症状:端の余白が思ったより広い
原因候補:margin 方式が混ざっている、親に padding と子に margin が二重。確認:DevTools の Box Model と、どの要素に余白が付いているか。
症状:狭い画面で詰まりすぎる
原因候補:gap が固定で大きすぎる、アイテムが縮めない設定。確認:Computed の gap と、min-width/flex/grid-template-columns

まとめ:迷ったときの判断軸(短いチェックリスト)