โ๏ธ Grid Gaps
Grid gaps allow you to add spacing between rows and columns in a grid layout โ without affecting the size of the grid items themselves.
๐น Basic Properties
โ
grid-gap (shorthand)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CSS Grid: Gap On/Off</title>
<style>
.infographic-gaptoggle {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
box-sizing: border-box;
margin: 0 auto;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
background: var(--paper);
color: var(--ink);
border-radius: 14px;
overflow: hidden;
}
.infographic-gaptoggle[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.gt-inner { padding: 0.5rem; }
.gt-layout { display: flex; flex-direction: column; gap: 1.5rem; }
.gt-code-wrap {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
overflow: hidden;
}
.gt-filetabs {
display: flex;
background: #161616;
border-bottom: 1px solid #2a2a2a;
}
.gt-filetab {
border: none;
background: transparent;
color: #8a8a8a;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.78rem;
font-weight: 700;
padding: 0.6rem 1rem;
cursor: pointer;
border-bottom: 2px solid transparent;
transition: color 0.15s ease, border-color 0.15s ease, background 0.15s ease;
}
.gt-filetab:hover { color: #e5e5e5; }
.gt-filetab.gt-tab-on {
color: #ffffff;
border-bottom-color: #5b8def;
background: #0b0b0b;
}
.gt-code {
padding: 1rem 1.8rem 1rem 0.9rem;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.8rem;
line-height: 1.85;
overflow-x: auto;
}
.gt-codepane { display: none; }
.gt-codepane.gt-pane-on { display: block; }
.gt-line { display: block; white-space: pre; color: #8a8a8a; padding: 0.05rem 0.4rem; border-radius: 5px; }
.gt-line.gt-live { color: #e5e5e5; transition: background 0.2s ease, box-shadow 0.2s ease, opacity 0.2s ease; }
.gt-line.gt-active { background: #1c2333; box-shadow: inset 3px 0 0 #5b8def; color: #ffffff; }
.gt-line.gt-strike { opacity: 0.4; text-decoration: line-through; text-decoration-color: #b0413e; }
.gt-tag { color: #60a5fa; font-weight: 700; }
.gt-attr { color: #f2b96b; }
.gt-str { color: #9ece6a; }
.gt-sel { color: #f472b6; font-weight: 700; }
.gt-prop { color: #c586c0; }
.gt-val { color: #ce9178; }
.gt-com { color: #6a6a6a; font-style: italic; }
.gt-errflag {
color: #ff6b6b;
font-weight: 700;
}
.gt-browser {
border: 1px solid var(--line);
border-radius: 10px;
overflow: hidden;
background: var(--paper);
}
.gt-browser-bar {
background: var(--paper-alt);
padding: 0.5rem 0.7rem;
display: flex;
align-items: center;
gap: 0.5rem;
border-bottom: 1px solid var(--line);
}
.gt-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--line); }
.gt-tab {
background: var(--paper);
border: 1px solid var(--line);
border-bottom: none;
border-radius: 6px 6px 0 0;
font-size: 0.72rem;
color: var(--ink-soft);
padding: 0.25rem 0.6rem;
}
.gt-urlrow {
background: var(--paper-alt);
padding: 0.35rem 0.7rem 0.6rem;
font-size: 0.72rem;
color: var(--ink-soft);
font-family: "SFMono-Regular", Consolas, monospace;
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.6rem;
}
.gt-toggle-wrap {
display: flex;
align-items: center;
gap: 0.5rem;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}
.gt-toggle-label {
font-size: 0.72rem;
color: var(--ink-soft);
font-weight: 600;
}
.gt-toggle {
position: relative;
width: 40px;
height: 22px;
border-radius: 999px;
border: none;
background: var(--line);
cursor: pointer;
padding: 0;
transition: background 0.2s ease;
flex-shrink: 0;
}
.gt-toggle::after {
content: "";
position: absolute;
top: 2px;
left: 2px;
width: 18px;
height: 18px;
border-radius: 50%;
background: #ffffff;
transition: transform 0.2s ease;
box-shadow: 0 1px 2px rgba(0,0,0,0.25);
}
.gt-toggle.gt-on { background: var(--accent); }
.gt-toggle.gt-on::after { transform: translateX(18px); }
.gt-screen {
background: #ffffff;
padding: 1.2rem 1.4rem 1.4rem;
}
.gt-out-grid {
display: grid;
grid-template-columns: repeat(2, 130px);
gap: 0px;
transition: gap 0.25s ease;
}
.gt-out-grid.gt-gap-on { gap: 20px; }
.gt-out-item {
background: #a2d2ff;
text-align: center;
font-weight: bold;
border: 2px solid #333;
padding: 45px 10px;
box-sizing: border-box;
color: #1a1a1a;
}
.gt-note {
font-size: 0.82rem;
color: var(--ink-soft);
padding: 0 0.2rem;
}
.gt-note strong { color: var(--ink); }
.gt-note code {
font-family: "SFMono-Regular", Consolas, monospace;
background: var(--paper-alt);
padding: 0.05rem 0.3rem;
border-radius: 4px;
}
</style>
</head>
<body>
<div class="infographic-gaptoggle" id="gt-root">
<div class="gt-inner">
<div class="gt-layout">
<div class="gt-code-wrap">
<div class="gt-filetabs">
<button class="gt-filetab gt-tab-on" id="gt-tab-html">index.html</button>
<button class="gt-filetab" id="gt-tab-css">style.css</button>
</div>
<div class="gt-code">
<div class="gt-codepane gt-pane-on" id="gt-pane-html">
<span class="gt-line"><<span class="gt-tag">div</span> <span class="gt-attr">class</span>=<span class="gt-str">"container"</span>></span>
<span class="gt-line"> <<span class="gt-tag">div</span> <span class="gt-attr">class</span>=<span class="gt-str">"item"</span>>A</<span class="gt-tag">div</span>></span>
<span class="gt-line"> <<span class="gt-tag">div</span> <span class="gt-attr">class</span>=<span class="gt-str">"item"</span>>B</<span class="gt-tag">div</span>></span>
<span class="gt-line"> <<span class="gt-tag">div</span> <span class="gt-attr">class</span>=<span class="gt-str">"item"</span>>C</<span class="gt-tag">div</span>></span>
<span class="gt-line"> <<span class="gt-tag">div</span> <span class="gt-attr">class</span>=<span class="gt-str">"item"</span>>D</<span class="gt-tag">div</span>></span>
<span class="gt-line"></<span class="gt-tag">div</span>></span>
</div>
<div class="gt-codepane" id="gt-pane-css">
<span class="gt-line"><span class="gt-sel">.container</span> {</span>
<span class="gt-line"> <span class="gt-prop">display</span>: <span class="gt-val">grid</span>;</span>
<span class="gt-line"> <span class="gt-prop">grid-template-columns</span>: <span class="gt-val">repeat(2, 200px)</span>;</span>
<span class="gt-line gt-live" id="gt-gap-line"> <span class="gt-prop">gap</span>: <span class="gt-val" id="gt-gap-val">0px</span>;</span>
<span class="gt-line">}</span>
<span class="gt-line"><span class="gt-sel">.item</span> { <span class="gt-com">/* background, padding, border */</span> }</span>
</div>
</div>
</div>
<div class="gt-browser">
<div class="gt-browser-bar">
<span class="gt-dot"></span><span class="gt-dot"></span><span class="gt-dot"></span>
<div class="gt-tab">๐ Grid Gap</div>
</div>
<div class="gt-urlrow">
<span>127.0.0.1:5500/index.html</span>
<div class="gt-toggle-wrap">
<span class="gt-toggle-label" id="gt-toggle-label">gap: off</span>
<button class="gt-toggle" id="gt-toggle" aria-pressed="false" aria-label="Toggle grid gap"></button>
</div>
</div>
<div class="gt-screen">
<div class="gt-out-grid" id="gt-out-grid">
<div class="gt-out-item">A</div>
<div class="gt-out-item">B</div>
<div class="gt-out-item">C</div>
<div class="gt-out-item">D</div>
</div>
</div>
</div>
<div class="gt-note" id="gt-note">
Without <strong>gap</strong>, items butt up against each other โ their borders touch and can even double up. Flip the toggle to add <code>gap: 20px</code> and watch the cells separate.
</div>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.getElementById('gt-root');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
(function () {
const tabHtml = document.getElementById('gt-tab-html');
const tabCss = document.getElementById('gt-tab-css');
const paneHtml = document.getElementById('gt-pane-html');
const paneCss = document.getElementById('gt-pane-css');
tabHtml.addEventListener('click', () => {
tabHtml.classList.add('gt-tab-on');
tabCss.classList.remove('gt-tab-on');
paneHtml.classList.add('gt-pane-on');
paneCss.classList.remove('gt-pane-on');
});
tabCss.addEventListener('click', () => {
tabCss.classList.add('gt-tab-on');
tabHtml.classList.remove('gt-tab-on');
paneCss.classList.add('gt-pane-on');
paneHtml.classList.remove('gt-pane-on');
});
const toggle = document.getElementById('gt-toggle');
const label = document.getElementById('gt-toggle-label');
const grid = document.getElementById('gt-out-grid');
const gapVal = document.getElementById('gt-gap-val');
const gapLine = document.getElementById('gt-gap-line');
const note = document.getElementById('gt-note');
let on = false;
toggle.addEventListener('click', () => {
on = !on;
toggle.classList.toggle('gt-on', on);
toggle.setAttribute('aria-pressed', String(on));
label.textContent = on ? 'gap: on' : 'gap: off';
grid.classList.toggle('gt-gap-on', on);
gapVal.textContent = on ? '20px' : '0px';
gapLine.classList.toggle('gt-active', on);
tabCss.click();
note.innerHTML = on
? 'With <strong>gap: 20px</strong> set, the browser inserts even space between every row and column โ no margins or extra markup needed.'
: 'Without <strong>gap</strong> (or <code>gap: 0</code>), items butt up against each other โ their borders touch and can even double up.';
});
})();
</script>
</body>
</html>โ
row-gap: Sets the vertical space between grid rows.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CSS Grid: row-gap Only</title>
<style>
.infographic-rowgap {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
box-sizing: border-box;
margin: 0 auto;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
background: var(--paper);
color: var(--ink);
border-radius: 14px;
overflow: hidden;
}
.infographic-rowgap[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.rg-inner { padding: 0.5rem; }
.rg-layout { display: flex; flex-direction: column; gap: 1.5rem; }
.rg-code-wrap {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
overflow: hidden;
}
.rg-filebar {
display: flex;
background: #161616;
border-bottom: 1px solid #2a2a2a;
padding: 0.6rem 1rem;
}
.rg-filename {
color: #ffffff;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.78rem;
font-weight: 700;
}
.rg-code {
padding: 1rem 1.8rem 1rem 0.9rem;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.8rem;
line-height: 1.85;
overflow-x: auto;
}
.rg-line { display: block; white-space: pre; color: #e5e5e5; padding: 0.05rem 0.4rem; border-radius: 5px; transition: background 0.2s ease, box-shadow 0.2s ease; }
.rg-line.rg-active { background: #1c2333; box-shadow: inset 3px 0 0 #5b8def; color: #ffffff; }
.rg-sel { color: #f472b6; font-weight: 700; }
.rg-prop { color: #c586c0; }
.rg-val { color: #ce9178; }
.rg-browser {
border: 1px solid var(--line);
border-radius: 10px;
overflow: hidden;
background: var(--paper);
}
.rg-browser-bar {
background: var(--paper-alt);
padding: 0.5rem 0.7rem;
display: flex;
align-items: center;
gap: 0.5rem;
border-bottom: 1px solid var(--line);
}
.rg-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--line); }
.rg-tab {
background: var(--paper);
border: 1px solid var(--line);
border-bottom: none;
border-radius: 6px 6px 0 0;
font-size: 0.72rem;
color: var(--ink-soft);
padding: 0.25rem 0.6rem;
}
.rg-urlrow {
background: var(--paper-alt);
padding: 0.35rem 0.7rem 0.6rem;
font-size: 0.72rem;
color: var(--ink-soft);
font-family: "SFMono-Regular", Consolas, monospace;
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.6rem;
}
.rg-toggle-wrap {
display: flex;
align-items: center;
gap: 0.5rem;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}
.rg-toggle-label {
font-size: 0.72rem;
color: var(--ink-soft);
font-weight: 600;
}
.rg-toggle {
position: relative;
width: 40px;
height: 22px;
border-radius: 999px;
border: none;
background: var(--line);
cursor: pointer;
padding: 0;
transition: background 0.2s ease;
flex-shrink: 0;
}
.rg-toggle::after {
content: "";
position: absolute;
top: 2px;
left: 2px;
width: 18px;
height: 18px;
border-radius: 50%;
background: #ffffff;
transition: transform 0.2s ease;
box-shadow: 0 1px 2px rgba(0,0,0,0.25);
}
.rg-toggle.rg-on { background: var(--accent); }
.rg-toggle.rg-on::after { transform: translateX(18px); }
.rg-screen {
background: #ffffff;
padding: 1.2rem 1.4rem 1.4rem;
}
.rg-out-grid {
display: grid;
grid-template-columns: repeat(2, 130px);
row-gap: 0px;
column-gap: 0px;
transition: row-gap 0.25s ease;
}
.rg-out-grid.rg-gap-on { row-gap: 30px; }
.rg-out-item {
background: #a2d2ff;
text-align: center;
font-weight: bold;
border: 2px solid #333;
padding: 40px 10px;
box-sizing: border-box;
color: #1a1a1a;
}
.rg-note {
font-size: 0.82rem;
color: var(--ink-soft);
padding: 0 0.2rem;
}
.rg-note strong { color: var(--ink); }
.rg-note code {
font-family: "SFMono-Regular", Consolas, monospace;
background: var(--paper-alt);
padding: 0.05rem 0.3rem;
border-radius: 4px;
}
</style>
</head>
<body>
<div class="infographic-rowgap" id="rg-root">
<div class="rg-inner">
<div class="rg-layout">
<div class="rg-code-wrap">
<div class="rg-filebar"><span class="rg-filename">style.css</span></div>
<div class="rg-code">
<span class="rg-line"><span class="rg-sel">.container</span> {</span>
<span class="rg-line"> <span class="rg-prop">display</span>: <span class="rg-val">grid</span>;</span>
<span class="rg-line"> <span class="rg-prop">grid-template-columns</span>: <span class="rg-val">repeat(2, 200px)</span>;</span>
<span class="rg-line rg-active" id="rg-gap-line"> <span class="rg-prop">row-gap</span>: <span class="rg-val" id="rg-gap-val">0px</span>;</span>
<span class="rg-line">}</span>
</div>
</div>
<div class="rg-browser">
<div class="rg-browser-bar">
<span class="rg-dot"></span><span class="rg-dot"></span><span class="rg-dot"></span>
<div class="rg-tab">๐ row-gap</div>
</div>
<div class="rg-urlrow">
<span>127.0.0.1:5500/index.html</span>
<div class="rg-toggle-wrap">
<span class="rg-toggle-label" id="rg-toggle-label">row-gap: off</span>
<button class="rg-toggle" id="rg-toggle" aria-pressed="false" aria-label="Toggle row-gap"></button>
</div>
</div>
<div class="rg-screen">
<div class="rg-out-grid" id="rg-out-grid">
<div class="rg-out-item">A</div>
<div class="rg-out-item">B</div>
<div class="rg-out-item">C</div>
<div class="rg-out-item">D</div>
</div>
</div>
</div>
<div class="rg-note" id="rg-note">
<strong>row-gap</strong> only touches the space between rows โ A/B and C/D stay pressed together column-wise since no <code>column-gap</code> is set. Flip the toggle to see rows push apart while columns don't.
</div>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.getElementById('rg-root');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
(function () {
const toggle = document.getElementById('rg-toggle');
const label = document.getElementById('rg-toggle-label');
const grid = document.getElementById('rg-out-grid');
const gapVal = document.getElementById('rg-gap-val');
const note = document.getElementById('rg-note');
let on = false;
toggle.addEventListener('click', () => {
on = !on;
toggle.classList.toggle('rg-on', on);
toggle.setAttribute('aria-pressed', String(on));
label.textContent = on ? 'row-gap: on' : 'row-gap: off';
grid.classList.toggle('rg-gap-on', on);
gapVal.textContent = on ? '40px' : '0px';
note.innerHTML = on
? '<strong>row-gap: 40px</strong> pushes A/B away from C/D vertically โ but the columns still touch, because no <code>column-gap</code> was set.'
: 'With <strong>row-gap</strong> at <code>0</code>, all four items press directly against each other on every side.';
});
})();
</script>
</body>
</html>โ
column-gap: Sets the horizontal space between grid columns.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CSS Grid: column-gap Only</title>
<style>
.infographic-colgap {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
box-sizing: border-box;
margin: 0 auto;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
background: var(--paper);
color: var(--ink);
border-radius: 14px;
overflow: hidden;
}
.infographic-colgap[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.cg-inner { padding: 0.5rem; }
.cg-layout { display: flex; flex-direction: column; gap: 1.5rem; }
.cg-code-wrap {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
overflow: hidden;
}
.cg-filebar {
display: flex;
background: #161616;
border-bottom: 1px solid #2a2a2a;
padding: 0.6rem 1rem;
}
.cg-filename {
color: #ffffff;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.78rem;
font-weight: 700;
}
.cg-code {
padding: 1rem 1.8rem 1rem 0.9rem;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.8rem;
line-height: 1.85;
overflow-x: auto;
}
.cg-line { display: block; white-space: pre; color: #e5e5e5; padding: 0.05rem 0.4rem; border-radius: 5px; transition: background 0.2s ease, box-shadow 0.2s ease; }
.cg-line.cg-active { background: #1c2333; box-shadow: inset 3px 0 0 #5b8def; color: #ffffff; }
.cg-sel { color: #f472b6; font-weight: 700; }
.cg-prop { color: #c586c0; }
.cg-val { color: #ce9178; }
.cg-browser {
border: 1px solid var(--line);
border-radius: 10px;
overflow: hidden;
background: var(--paper);
}
.cg-browser-bar {
background: var(--paper-alt);
padding: 0.5rem 0.7rem;
display: flex;
align-items: center;
gap: 0.5rem;
border-bottom: 1px solid var(--line);
}
.cg-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--line); }
.cg-tab {
background: var(--paper);
border: 1px solid var(--line);
border-bottom: none;
border-radius: 6px 6px 0 0;
font-size: 0.72rem;
color: var(--ink-soft);
padding: 0.25rem 0.6rem;
}
.cg-urlrow {
background: var(--paper-alt);
padding: 0.35rem 0.7rem 0.6rem;
font-size: 0.72rem;
color: var(--ink-soft);
font-family: "SFMono-Regular", Consolas, monospace;
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.6rem;
}
.cg-toggle-wrap {
display: flex;
align-items: center;
gap: 0.5rem;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}
.cg-toggle-label {
font-size: 0.72rem;
color: var(--ink-soft);
font-weight: 600;
}
.cg-toggle {
position: relative;
width: 40px;
height: 22px;
border-radius: 999px;
border: none;
background: var(--line);
cursor: pointer;
padding: 0;
transition: background 0.2s ease;
flex-shrink: 0;
}
.cg-toggle::after {
content: "";
position: absolute;
top: 2px;
left: 2px;
width: 18px;
height: 18px;
border-radius: 50%;
background: #ffffff;
transition: transform 0.2s ease;
box-shadow: 0 1px 2px rgba(0,0,0,0.25);
}
.cg-toggle.cg-on { background: var(--accent); }
.cg-toggle.cg-on::after { transform: translateX(18px); }
.cg-screen {
background: #ffffff;
padding: 1.2rem 1.4rem 1.4rem;
}
.cg-out-grid {
display: grid;
grid-template-columns: repeat(2, 130px);
column-gap: 0px;
row-gap: 0px;
transition: column-gap 0.25s ease;
}
.cg-out-grid.cg-gap-on { column-gap: 30px; }
.cg-out-item {
background: #a2d2ff;
text-align: center;
font-weight: bold;
border: 2px solid #333;
padding: 40px 10px;
box-sizing: border-box;
color: #1a1a1a;
}
.cg-note {
font-size: 0.82rem;
color: var(--ink-soft);
padding: 0 0.2rem;
}
.cg-note strong { color: var(--ink); }
.cg-note code {
font-family: "SFMono-Regular", Consolas, monospace;
background: var(--paper-alt);
padding: 0.05rem 0.3rem;
border-radius: 4px;
}
</style>
</head>
<body>
<div class="infographic-colgap" id="cg-root">
<div class="cg-inner">
<div class="cg-layout">
<div class="cg-code-wrap">
<div class="cg-filebar"><span class="cg-filename">style.css</span></div>
<div class="cg-code">
<span class="cg-line"><span class="cg-sel">.container</span> {</span>
<span class="cg-line"> <span class="cg-prop">display</span>: <span class="cg-val">grid</span>;</span>
<span class="cg-line"> <span class="cg-prop">grid-template-columns</span>: <span class="cg-val">repeat(2, 200px)</span>;</span>
<span class="cg-line cg-active" id="cg-gap-line"> <span class="cg-prop">column-gap</span>: <span class="cg-val" id="cg-gap-val">0px</span>;</span>
<span class="cg-line">}</span>
</div>
</div>
<div class="cg-browser">
<div class="cg-browser-bar">
<span class="cg-dot"></span><span class="cg-dot"></span><span class="cg-dot"></span>
<div class="cg-tab">๐ column-gap</div>
</div>
<div class="cg-urlrow">
<span>127.0.0.1:5500/index.html</span>
<div class="cg-toggle-wrap">
<span class="cg-toggle-label" id="cg-toggle-label">column-gap: off</span>
<button class="cg-toggle" id="cg-toggle" aria-pressed="false" aria-label="Toggle column-gap"></button>
</div>
</div>
<div class="cg-screen">
<div class="cg-out-grid" id="cg-out-grid">
<div class="cg-out-item">A</div>
<div class="cg-out-item">B</div>
<div class="cg-out-item">C</div>
<div class="cg-out-item">D</div>
</div>
</div>
</div>
<div class="cg-note" id="cg-note">
<strong>column-gap</strong> only touches the space between columns โ A/C and B/D stay pressed together row-wise since no <code>row-gap</code> is set. Flip the toggle to see columns push apart while rows don't.
</div>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.getElementById('cg-root');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
(function () {
const toggle = document.getElementById('cg-toggle');
const label = document.getElementById('cg-toggle-label');
const grid = document.getElementById('cg-out-grid');
const gapVal = document.getElementById('cg-gap-val');
const note = document.getElementById('cg-note');
let on = false;
toggle.addEventListener('click', () => {
on = !on;
toggle.classList.toggle('cg-on', on);
toggle.setAttribute('aria-pressed', String(on));
label.textContent = on ? 'column-gap: on' : 'column-gap: off';
grid.classList.toggle('cg-gap-on', on);
gapVal.textContent = on ? '40px' : '0px';
note.innerHTML = on
? '<strong>column-gap: 40px</strong> pushes A away from B (and C from D) horizontally โ but the rows still touch, because no <code>row-gap</code> was set.'
: 'With <strong>column-gap</strong> at <code>0</code>, all four items press directly against each other on every side.';
});
})();
</script>
</body>
</html>๐ Key Notes
Gaps appear between grid items only, not before the first or after the last.
Works only in grid (or flex) containers.
Does not add margin or padding to items.
โ Summary
Property | Use |
|---|---|
| Shorthand for both row and column gaps |
| Controls vertical spacing |
| Controls horizontal spacing |