CSS

この記事では「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;
}

.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

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