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 は、grid や flex の子要素間のすき間を「行/列」としてまとめて指定するプロパティです。
gap が「何を広げる/何を広げない」か(余白・端・折り返し)を説明できるrow-gap / column-gap と gap(ショートハンド)の書き方を使い分けられるgrid と flex での効き方の違い(行/列の意味)を判断できるmargin 方式の事故(端の余白・折り返し・相殺)を避けて間隔設計できるgap って何?ざっくり言うと、gap は「並べた要素どうしの間を一括で空ける」ためのスイッチで、margin より端が汚れにくいのが強みです。
flex-wrap で行が増えても調整が楽row-gap/column-gap で縦横別にできるgap はレイアウトコンテナ(主に display: grid / display: flex)に対して、子要素どうしの間隔を 行方向(row-gap) と 列方向(column-gap) で指定するためのプロパティです。
gap は「コンテナ側」に書きます。典型は grid コンテナと flex コンテナで、子要素そのものに書いても効果はありません。
gap で縦横同時、または row-gap/column-gap で縦横別の間隔にできるflex-wrap や grid の再配置でも、間隔指定をほぼ触らずに保てる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-gap が 8px、column-gap が 16px)row-gap: 12px; / column-gap: 12px;gap: clamp(12px, 2vw, 24px);(広い画面で少し広げる).cardList)に display と gap をまとめ、部品として再利用できる形にします。<style>style="gap: 16px" は検証には便利ですが、運用では差分が追いにくいので基本は避けます。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;
});
gap は継承しません。親に書いた gap が子へ伝播するのではなく、「その親がコンテナのときに、子同士の間隔を作る」プロパティです。0 で、指定しなければすき間は作られません。grid / flex のコンテナ(親要素)です。子要素に書いても効果がないため、「どこに書いたか」を最初に疑います。row-gap / column-gap とショートハンドgap: 12px 24px; のように2つ書くと「row-gap が 12px、column-gap が 24px」です。順番を逆に覚える事故が多いので、row → column の順で固定します。gap は長さ(px/rem/% など)で指定できます。% は基本的にコンテナサイズ基準になるため、意図がブレそうなら rem や clamp() を選ぶ方が安全です。row-gap と column-gap の最終値を見ます。ショートハンドで書いても、Computed では分解された値で表示されることが多いです。gap: big;)は無視され、その宣言は効きません。結果として他のルール(または初期値 0)になります。DevTools の Styles で打ち消しや無効化を確認します。gap はアニメーション可能です。ただしレイアウトが毎フレーム変わるため、重い場合は prefers-reduced-motion を尊重し、必要な範囲に抑えます。gap は子要素に書くgap はコンテナ側(親要素)に書きます。子要素に書いても間隔は増えません。gap と margin は同じ同じ「すき間」に見えますが、扱いが違います。
gap → アイテム間だけにすき間を作る(端に余白が付きにくい)margin → アイテムに余白を付ける(端にも余白が出たり、相殺や折り返し調整が必要)grid-gap / grid-row-gap / grid-column-gap を今も使うgap/row-gap/column-gap に寄せます。混在すると「どれが勝っているか」の判断が増えます。padding を増やすpadding は外周の余白です。間隔(子同士)が足りないなら、まず gap を疑います(外周と間を混ぜると、レスポンシブで調整が増えます)。カード一覧は grid+gap の相性が良く、デザイン変更(間隔だけ広げる/詰める)にも強いです。外周は padding、間は gap と分けると保守が楽です。
タグ一覧や小さなボタン群を flex-wrap: wrap で折り返す場合、margin で調整すると「端の余白」や「行間」が崩れがちです。gap なら折り返し行にも自然に間隔が入ります。
フォーム項目の縦方向の間隔は row-gap(または gap)で固定すると、各項目に margin-bottom を付けるよりも最後の項目だけ例外処理をしなくて済みます。
display: block のままだと gap は期待どおりに効きません。親要素に display: grid または display: flex が入っているか確認します。gap は親に書きます。子に書いていたら、親へ移します。display と row-gap/column-gap を見て、値が 0 のままか、打ち消されていないかを確認します。margin 方式を混ぜているmargin で間隔を作り、さらにコンテナに padding を付けると、端が二重に広がりがちです。間隔は gap、外周は padding と責務を分けます。margin-bottom が残っているmargin-bottom を使うと「最後だけ例外(0にする)」が必要になります。gap に寄せると例外が減ります。clamp() やメディアクエリで調整するgap: clamp(12px, 2vw, 24px); のように、極端にならない範囲で伸縮させます。狭幅ではタップ間隔と可読性を優先して、詰めすぎないようにします。gap と padding の両方で誤タップを減らすgap を詰めすぎると読みづらいので、文字サイズや行間(line-height)もセットで見るprefers-reduced-motion を尊重するpaddinggap と役割を分けると事故が減る。marginmargin の相殺)で調整が増えやすい。flex-wrapgap の価値が出る。margin 調整より自然に行間が付く。justify-content / align-contentgap で間隔を決めたうえで「余り」をどう使うかを決める。grid-template-columnsgap を大きくすると、同じ幅でも詰まり方が変わるのでセットで調整する。gap は row-gap/column-gap のまとめ)display: grid/flex など)flex-wrap や幅不足で行が増える状態gap を子要素に書いている(→ 効かない)gap: 8px 16px の順番を逆に覚える(→ 行/列が逆)gap で作れると思う(→ 端は padding)gap を書くべき場所はどこ?display: grid または display: flex の「親(コンテナ)」です。
gap: 8px 16px; は何を意味する?row-gap: 8px; と column-gap: 16px; です(順番は row → column)。
gap が向きます。端の余白は padding で別に調整します。
display(grid/flex になっているか)と、Computed の row-gap/column-gap が 0 のままかです。
gap が効かないのはなぜ?display: grid / display: flex になっていない、または gap を子要素に書いている可能性が高いです。DevTools の Computed で display と row-gap/column-gap を確認します。gap と margin、結局どっちで間隔を作る?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 で display と row-gap/column-gap。margin 方式が混ざっている、親に padding と子に margin が二重。確認:DevTools の Box Model と、どの要素に余白が付いているか。gap が固定で大きすぎる、アイテムが縮めない設定。確認:Computed の gap と、min-width/flex/grid-template-columns。gap(コンテナに書く)padding を別で足すmargin を使うdisplay と Computed の row-gap/column-gap を先に見るclamp() やメディアクエリで gap を調整する