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 は、grid や flex の子要素間のすき間を「行/列」としてまとめて指定するプロパティです。
- Table Of Contents
このページでできるようになること
gapが「何を広げる/何を広げない」か(余白・端・折り返し)を説明できるrow-gap/column-gapとgap(ショートハンド)の書き方を使い分けられるgridとflexでの効き方の違い(行/列の意味)を判断できるmargin方式の事故(端の余白・折り返し・相殺)を避けて間隔設計できる- 「効かない」「思った方向じゃない」を DevTools で切り分けられる
- 試験で問われやすいポイント(適用対象・値・ショートハンド)を整理できる
まずは直感: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);(広い画面で少し広げる)
どこに書くか(外部CSS/ページ内style/インライン)
- 基本:外部CSS(推奨)
- 実務ではコンテナのクラス(例:
.cardList)にdisplayとgapをまとめ、部品として再利用できる形にします。 - ページ内
<style> - 学習用デモや単体ページで完結させたいときに向いています(このページのデモはページ内にあります)。
- インライン(例外)
style="gap: 16px"は検証には便利ですが、運用では差分が追いにくいので基本は避けます。
最小サンプル(grid + gap)
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-gapが12px、column-gapが24px」です。順番を逆に覚える事故が多いので、row → column の順で固定します。- % の基準は?(percentages)
gapは長さ(px/rem/% など)で指定できます。% は基本的にコンテナサイズ基準になるため、意図がブレそうならremやclamp()を選ぶ方が安全です。- 算出値/使用値の考え方(computed/used value)
- DevTools の Computed で
row-gapとcolumn-gapの最終値を見ます。ショートハンドで書いても、Computed では分解された値で表示されることが多いです。 - 無効値の扱い
- 無効な値(例:
gap: big;)は無視され、その宣言は効きません。結果として他のルール(または初期値0)になります。DevTools の Styles で打ち消しや無効化を確認します。 - アニメーション可能?(animatable)
- 長さとして指定した
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)で間隔を一元化する
カード一覧は grid+gap の相性が良く、デザイン変更(間隔だけ広げる/詰める)にも強いです。外周は 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 の Computed で
displayとrow-gap/column-gapを見て、値が0のままか、打ち消されていないかを確認します。
「端の余白がズレる/二重になる」
- 原因候補:
margin方式を混ぜている marginで間隔を作り、さらにコンテナにpaddingを付けると、端が二重に広がりがちです。間隔はgap、外周はpaddingと責務を分けます。- 原因候補:最後だけ
margin-bottomが残っている - 縦並びの部品で
margin-bottomを使うと「最後だけ例外(0にする)」が必要になります。gapに寄せると例外が減ります。
「狭い画面で詰まりすぎる/広すぎる」
- 回避:
clamp()やメディアクエリで調整する gap: clamp(12px, 2vw, 24px);のように、極端にならない範囲で伸縮させます。狭幅ではタップ間隔と可読性を優先して、詰めすぎないようにします。
アクセシビリティ/UX観点での注意(必要な範囲で)
- タップ対象(ボタン/リンク)が密集するなら、
gapとpaddingの両方で誤タップを減らす - 狭幅で
gapを詰めすぎると読みづらいので、文字サイズや行間(line-height)もセットで見る - 間隔をアニメーションする場合は、必要最小限にし
prefers-reduced-motionを尊重する - 「すき間=区切り」に見せるなら、コントラスト(背景/境界線)を確保する
関連プロパティ・関連セレクタとの組み合わせ・相互作用
padding- 外周(コンテナ内側)の余白。
gapと役割を分けると事故が減る。 margin- アイテム自体の余白。端の余白や相殺(
marginの相殺)で調整が増えやすい。 flex-wrap- 折り返しが増えるほど
gapの価値が出る。margin調整より自然に行間が付く。 justify-content/align-content- 余ったスペースの配り方。
gapで間隔を決めたうえで「余り」をどう使うかを決める。 grid-template-columns- 列の幅を決める本体。
gapを大きくすると、同じ幅でも詰まり方が変わるのでセットで調整する。
試験(Webクリエイター能力認定試験)で得点できる整理
用語
- ショートハンド:複数のプロパティを1行でまとめて指定する書き方(
gapはrow-gap/column-gapのまとめ) - コンテナ:子要素の並び方を決める親要素(
display: grid/flexなど) - 折り返し:
flex-wrapや幅不足で行が増える状態
ひっかけポイント
gapを子要素に書いている(→ 効かない)gap: 8px 16pxの順番を逆に覚える(→ 行/列が逆)- 外周の余白を
gapで作れると思う(→ 端はpadding)
ミニ確認
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. 親のdisplay(grid/flex になっているか)と、Computed の row-gap/column-gap が 0 のままかです。
よくある質問(FAQ)
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を調整する