🔄 Axis Refresher
Inline Axis (Horizontal) → Affected by
justify-*Block Axis (Vertical) → Affected by
align-*
🧍 Aligning Individual Items
Property | Axis | Description |
|---|---|---|
| Horizontal | Aligns grid items inside their cells |
| Vertical | Aligns grid items inside their cells |
| Both | Shorthand for |
✅ justify-items
Aligns items horizontally inside each grid cell (row axis).
❗️It aligns items inside the grid cells not grid cells
Works on the inline direction.
📌 Values:
Value | Description |
|---|---|
| Align to the left of the cell |
| Align to the right of the cell |
| Center horizontally in the cell |
| Fills the cell width |
🧪 Example:
.grid {
justify-items: center;
}Full Code
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CSS Grid: justify-items</title>
<style>
.infographic-justifyitems {
--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-justifyitems[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.ji-inner { padding: 0.5rem; }
.ji-layout { display: flex; flex-direction: column; gap: 1.5rem; }
.ji-code-wrap {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
overflow: hidden;
}
.ji-filetabs {
display: flex;
background: #161616;
border-bottom: 1px solid #2a2a2a;
}
.ji-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;
}
.ji-filetab:hover { color: #e5e5e5; }
.ji-filetab.ji-tab-on {
color: #ffffff;
border-bottom-color: #5b8def;
background: #0b0b0b;
}
.ji-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;
}
.ji-codepane { display: none; }
.ji-codepane.ji-pane-on { display: block; }
.ji-line { display: block; white-space: pre; color: #8a8a8a; padding: 0.05rem 0.4rem; border-radius: 5px; }
.ji-line.ji-active { background: #1c2333; box-shadow: inset 3px 0 0 #5b8def; color: #ffffff; }
.ji-tag { color: #60a5fa; font-weight: 700; }
.ji-attr { color: #f2b96b; }
.ji-str { color: #9ece6a; }
.ji-sel { color: #f472b6; font-weight: 700; }
.ji-prop { color: #c586c0; }
.ji-val { color: #ce9178; }
.ji-browser {
border: 1px solid var(--line);
border-radius: 10px;
overflow: hidden;
background: var(--paper);
}
.ji-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);
}
.ji-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--line); }
.ji-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;
}
.ji-controlrow {
background: var(--paper-alt);
padding: 0.5rem 0.7rem 0.6rem;
display: flex;
align-items: center;
gap: 0.6rem;
flex-wrap: wrap;
}
.ji-control-label {
font-size: 0.72rem;
color: var(--ink-soft);
font-family: "SFMono-Regular", Consolas, monospace;
}
.ji-segmented {
display: flex;
border: 1px solid var(--line);
border-radius: 999px;
overflow: hidden;
}
.ji-seg-btn {
border: none;
background: var(--paper);
color: var(--ink-soft);
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.72rem;
font-weight: 700;
padding: 0.35rem 0.75rem;
cursor: pointer;
transition: background 0.15s ease, color 0.15s ease;
}
.ji-seg-btn + .ji-seg-btn { border-left: 1px solid var(--line); }
.ji-seg-btn.ji-seg-on { background: var(--accent); color: #ffffff; }
.ji-screen {
background: #f9f9f9;
padding: 1.2rem 1.4rem 1.4rem;
}
.ji-out-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: 70px;
border: 2px dashed #ccc;
background: #f9f9f9;
justify-items: start;
transition: justify-items 0.15s ease;
}
.ji-out-item {
background: #4a90e2;
color: white;
text-align: center;
font-weight: bold;
padding: 12px 18px;
box-sizing: border-box;
}
.ji-note {
font-size: 0.82rem;
color: var(--ink-soft);
padding: 0 0.2rem;
}
.ji-note strong { color: var(--ink); }
.ji-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-justifyitems" id="ji-root">
<div class="ji-inner">
<div class="ji-layout">
<div class="ji-code-wrap">
<div class="ji-filetabs">
<button class="ji-filetab ji-tab-on" id="ji-tab-html">index.html</button>
<button class="ji-filetab" id="ji-tab-css">style.css</button>
</div>
<div class="ji-code">
<div class="ji-codepane ji-pane-on" id="ji-pane-html">
<span class="ji-line"><<span class="ji-tag">h2</span>>justify-items: start</<span class="ji-tag">h2</span>></span>
<span class="ji-line"><<span class="ji-tag">div</span> <span class="ji-attr">class</span>=<span class="ji-str">"grid start"</span>></span>
<span class="ji-line"> <<span class="ji-tag">div</span> <span class="ji-attr">class</span>=<span class="ji-str">"item"</span>>1</<span class="ji-tag">div</span>></span>
<span class="ji-line"> <<span class="ji-tag">div</span> <span class="ji-attr">class</span>=<span class="ji-str">"item"</span>>2</<span class="ji-tag">div</span>></span>
<span class="ji-line"> <<span class="ji-tag">div</span> <span class="ji-attr">class</span>=<span class="ji-str">"item"</span>>3</<span class="ji-tag">div</span>></span>
<span class="ji-line"></<span class="ji-tag">div</span>></span>
<span class="ji-line"></span>
<span class="ji-line"><<span class="ji-tag">h2</span>>justify-items: end</<span class="ji-tag">h2</span>></span>
<span class="ji-line"><<span class="ji-tag">div</span> <span class="ji-attr">class</span>=<span class="ji-str">"grid end"</span>></span>
<span class="ji-line"> <<span class="ji-tag">div</span> <span class="ji-attr">class</span>=<span class="ji-str">"item"</span>>1</<span class="ji-tag">div</span>></span>
<span class="ji-line"> <<span class="ji-tag">div</span> <span class="ji-attr">class</span>=<span class="ji-str">"item"</span>>2</<span class="ji-tag">div</span>></span>
<span class="ji-line"> <<span class="ji-tag">div</span> <span class="ji-attr">class</span>=<span class="ji-str">"item"</span>>3</<span class="ji-tag">div</span>></span>
<span class="ji-line"></<span class="ji-tag">div</span>></span>
<span class="ji-line"></span>
<span class="ji-line"><<span class="ji-tag">h2</span>>justify-items: center</<span class="ji-tag">h2</span>></span>
<span class="ji-line"><<span class="ji-tag">div</span> <span class="ji-attr">class</span>=<span class="ji-str">"grid center"</span>></span>
<span class="ji-line"> <<span class="ji-tag">div</span> <span class="ji-attr">class</span>=<span class="ji-str">"item"</span>>1</<span class="ji-tag">div</span>></span>
<span class="ji-line"> <<span class="ji-tag">div</span> <span class="ji-attr">class</span>=<span class="ji-str">"item"</span>>2</<span class="ji-tag">div</span>></span>
<span class="ji-line"> <<span class="ji-tag">div</span> <span class="ji-attr">class</span>=<span class="ji-str">"item"</span>>3</<span class="ji-tag">div</span>></span>
<span class="ji-line"></<span class="ji-tag">div</span>></span>
<span class="ji-line"></span>
<span class="ji-line"><<span class="ji-tag">h2</span>>justify-items: stretch (default)</<span class="ji-tag">h2</span>></span>
<span class="ji-line"><<span class="ji-tag">div</span> <span class="ji-attr">class</span>=<span class="ji-str">"grid stretch"</span>></span>
<span class="ji-line"> <<span class="ji-tag">div</span> <span class="ji-attr">class</span>=<span class="ji-str">"item"</span>>1</<span class="ji-tag">div</span>></span>
<span class="ji-line"> <<span class="ji-tag">div</span> <span class="ji-attr">class</span>=<span class="ji-str">"item"</span>>2</<span class="ji-tag">div</span>></span>
<span class="ji-line"> <<span class="ji-tag">div</span> <span class="ji-attr">class</span>=<span class="ji-str">"item"</span>>3</<span class="ji-tag">div</span>></span>
<span class="ji-line"></<span class="ji-tag">div</span>></span>
</div>
<div class="ji-codepane" id="ji-pane-css">
<span class="ji-line"><span class="ji-sel">body</span> {</span>
<span class="ji-line"> <span class="ji-prop">font-family</span>: <span class="ji-val">sans-serif</span>;</span>
<span class="ji-line"> <span class="ji-prop">padding</span>: <span class="ji-val">20px</span>;</span>
<span class="ji-line">}</span>
<span class="ji-line"><span class="ji-sel">h2</span> { <span class="ji-prop">margin-top</span>: <span class="ji-val">40px</span>; }</span>
<span class="ji-line"><span class="ji-sel">.grid</span> {</span>
<span class="ji-line"> <span class="ji-prop">display</span>: <span class="ji-val">grid</span>;</span>
<span class="ji-line"> <span class="ji-prop">grid-template-columns</span>: <span class="ji-val">repeat(3, 1fr)</span>;</span>
<span class="ji-line"> <span class="ji-prop">grid-template-rows</span>: <span class="ji-val">60px</span>;</span>
<span class="ji-line"> <span class="ji-prop">border</span>: <span class="ji-val">2px dashed #ccc</span>;</span>
<span class="ji-line"> <span class="ji-prop">margin-bottom</span>: <span class="ji-val">20px</span>;</span>
<span class="ji-line"> <span class="ji-prop">background</span>: <span class="ji-val">#f9f9f9</span>;</span>
<span class="ji-line">}</span>
<span class="ji-line"><span class="ji-sel">.item</span> {</span>
<span class="ji-line"> <span class="ji-prop">background</span>: <span class="ji-val">#4a90e2</span>;</span>
<span class="ji-line"> <span class="ji-prop">color</span>: <span class="ji-val">white</span>;</span>
<span class="ji-line"> <span class="ji-prop">padding</span>: <span class="ji-val">30px</span>;</span>
<span class="ji-line"> <span class="ji-prop">text-align</span>: <span class="ji-val">center</span>;</span>
<span class="ji-line">}</span>
<span class="ji-line ji-active" id="ji-line-start"><span class="ji-sel">.start</span> { <span class="ji-prop">justify-items</span>: <span class="ji-val">start</span>; }</span>
<span class="ji-line" id="ji-line-end"><span class="ji-sel">.end</span> { <span class="ji-prop">justify-items</span>: <span class="ji-val">end</span>; }</span>
<span class="ji-line" id="ji-line-center"><span class="ji-sel">.center</span> { <span class="ji-prop">justify-items</span>: <span class="ji-val">center</span>; }</span>
<span class="ji-line" id="ji-line-stretch"><span class="ji-sel">.stretch</span> { <span class="ji-prop">justify-items</span>: <span class="ji-val">stretch</span>; }</span>
</div>
</div>
</div>
<div class="ji-browser">
<div class="ji-browser-bar">
<span class="ji-dot"></span><span class="ji-dot"></span><span class="ji-dot"></span>
<div class="ji-tab">🌐 justify-items Demo</div>
</div>
<div class="ji-controlrow">
<span class="ji-control-label">justify-items:</span>
<div class="ji-segmented" id="ji-segmented">
<button class="ji-seg-btn ji-seg-on" data-val="start">start</button>
<button class="ji-seg-btn" data-val="end">end</button>
<button class="ji-seg-btn" data-val="center">center</button>
<button class="ji-seg-btn" data-val="stretch">stretch</button>
</div>
</div>
<div class="ji-screen">
<div class="ji-out-grid" id="ji-out-grid">
<div class="ji-out-item">1</div>
<div class="ji-out-item">2</div>
<div class="ji-out-item">3</div>
</div>
</div>
</div>
<div class="ji-note" id="ji-note">
<strong>justify-items</strong> aligns each item <em>within its own cell</em> along the row (the inline/horizontal axis) — <code>start</code> hugs the left edge instead of stretching to fill the column.
</div>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.getElementById('ji-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('ji-tab-html');
const tabCss = document.getElementById('ji-tab-css');
const paneHtml = document.getElementById('ji-pane-html');
const paneCss = document.getElementById('ji-pane-css');
tabHtml.addEventListener('click', () => {
tabHtml.classList.add('ji-tab-on');
tabCss.classList.remove('ji-tab-on');
paneHtml.classList.add('ji-pane-on');
paneCss.classList.remove('ji-pane-on');
});
tabCss.addEventListener('click', () => {
tabCss.classList.add('ji-tab-on');
tabHtml.classList.remove('ji-tab-on');
paneCss.classList.add('ji-pane-on');
paneHtml.classList.remove('ji-pane-on');
});
const buttons = document.querySelectorAll('.ji-seg-btn');
const grid = document.getElementById('ji-out-grid');
const note = document.getElementById('ji-note');
const ruleLines = {
start: document.getElementById('ji-line-start'),
end: document.getElementById('ji-line-end'),
center: document.getElementById('ji-line-center'),
stretch: document.getElementById('ji-line-stretch')
};
const notes = {
start: '<strong>justify-items</strong> aligns each item <em>within its own cell</em> along the row — <code>start</code> hugs the left edge instead of stretching to fill the column.',
end: '<code>end</code> pushes each item to the right edge of its own cell, leaving empty space on the left.',
center: '<code>center</code> centers each item horizontally inside its cell, with even space on both sides.',
stretch: '<code>stretch</code> is the default — items fill the full width of their cell when they have no fixed width of their own.'
};
buttons.forEach(btn => {
btn.addEventListener('click', () => {
const val = btn.getAttribute('data-val');
buttons.forEach(b => b.classList.toggle('ji-seg-on', b === btn));
grid.style.justifyItems = val;
Object.entries(ruleLines).forEach(([key, el]) => {
el.classList.toggle('ji-active', key === val);
});
note.innerHTML = notes[val];
tabCss.click();
});
});
})();
</script>
</body>
</html>✅ align-items
Aligns items vertically inside each grid cell (column axis).
Works on the block direction.
📌 Values:
Value | Description |
|---|---|
| Align to the top of the cell |
| Align to the bottom of the cell |
| Center vertically in the cell |
| Fills the cell height |
🧪 Example:
.grid {
align-items: start;
}Full Code
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CSS Grid: align-items</title>
<style>
.infographic-alignitems {
--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-alignitems[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.ai-inner { padding: 0.5rem; }
.ai-layout { display: flex; flex-direction: column; gap: 1.5rem; }
.ai-code-wrap {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
overflow: hidden;
}
.ai-filetabs {
display: flex;
background: #161616;
border-bottom: 1px solid #2a2a2a;
}
.ai-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;
}
.ai-filetab:hover { color: #e5e5e5; }
.ai-filetab.ai-tab-on {
color: #ffffff;
border-bottom-color: #5b8def;
background: #0b0b0b;
}
.ai-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;
}
.ai-codepane { display: none; }
.ai-codepane.ai-pane-on { display: block; }
.ai-line { display: block; white-space: pre; color: #8a8a8a; padding: 0.05rem 0.4rem; border-radius: 5px; }
.ai-line.ai-active { background: #1c2333; box-shadow: inset 3px 0 0 #5b8def; color: #ffffff; }
.ai-tag { color: #60a5fa; font-weight: 700; }
.ai-attr { color: #f2b96b; }
.ai-str { color: #9ece6a; }
.ai-sel { color: #f472b6; font-weight: 700; }
.ai-prop { color: #c586c0; }
.ai-val { color: #ce9178; }
.ai-com { color: #6a6a6a; font-style: italic; }
.ai-browser {
border: 1px solid var(--line);
border-radius: 10px;
overflow: hidden;
background: var(--paper);
}
.ai-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);
}
.ai-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--line); }
.ai-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;
}
.ai-controlrow {
background: var(--paper-alt);
padding: 0.5rem 0.7rem 0.6rem;
display: flex;
align-items: center;
gap: 0.6rem;
flex-wrap: wrap;
}
.ai-control-label {
font-size: 0.72rem;
color: var(--ink-soft);
font-family: "SFMono-Regular", Consolas, monospace;
}
.ai-segmented {
display: flex;
border: 1px solid var(--line);
border-radius: 999px;
overflow: hidden;
}
.ai-seg-btn {
border: none;
background: var(--paper);
color: var(--ink-soft);
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.72rem;
font-weight: 700;
padding: 0.35rem 0.75rem;
cursor: pointer;
transition: background 0.15s ease, color 0.15s ease;
}
.ai-seg-btn + .ai-seg-btn { border-left: 1px solid var(--line); }
.ai-seg-btn.ai-seg-on { background: var(--accent); color: #ffffff; }
.ai-screen {
background: #f9f9f9;
padding: 1.2rem 1.4rem 1.4rem;
}
.ai-out-grid {
display: grid;
grid-template-columns: repeat(3, 90px);
grid-template-rows: 130px;
border: 2px dashed #ccc;
background: #f9f9f9;
gap: 10px;
align-items: start;
}
.ai-out-item {
background: #4a90e2;
color: white;
font-weight: bold;
padding: 5px;
height: 50px;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
transition: height 0.15s ease;
}
.ai-note {
font-size: 0.82rem;
color: var(--ink-soft);
padding: 0 0.2rem;
}
.ai-note strong { color: var(--ink); }
.ai-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-alignitems" id="ai-root">
<div class="ai-inner">
<div class="ai-layout">
<div class="ai-code-wrap">
<div class="ai-filetabs">
<button class="ai-filetab ai-tab-on" id="ai-tab-html">index.html</button>
<button class="ai-filetab" id="ai-tab-css">style.css</button>
</div>
<div class="ai-code">
<div class="ai-codepane ai-pane-on" id="ai-pane-html">
<span class="ai-line"><<span class="ai-tag">h2</span>>align-items: start</<span class="ai-tag">h2</span>></span>
<span class="ai-line"><<span class="ai-tag">div</span> <span class="ai-attr">class</span>=<span class="ai-str">"grid start"</span>></span>
<span class="ai-line"> <<span class="ai-tag">div</span> <span class="ai-attr">class</span>=<span class="ai-str">"item"</span>>A</<span class="ai-tag">div</span>></span>
<span class="ai-line"> <<span class="ai-tag">div</span> <span class="ai-attr">class</span>=<span class="ai-str">"item"</span>>B</<span class="ai-tag">div</span>></span>
<span class="ai-line"> <<span class="ai-tag">div</span> <span class="ai-attr">class</span>=<span class="ai-str">"item"</span>>C</<span class="ai-tag">div</span>></span>
<span class="ai-line"></<span class="ai-tag">div</span>></span>
<span class="ai-line"></span>
<span class="ai-line"><<span class="ai-tag">h2</span>>align-items: center</<span class="ai-tag">h2</span>></span>
<span class="ai-line"><<span class="ai-tag">div</span> <span class="ai-attr">class</span>=<span class="ai-str">"grid center"</span>></span>
<span class="ai-line"> <<span class="ai-tag">div</span> <span class="ai-attr">class</span>=<span class="ai-str">"item"</span>>A</<span class="ai-tag">div</span>></span>
<span class="ai-line"> <<span class="ai-tag">div</span> <span class="ai-attr">class</span>=<span class="ai-str">"item"</span>>B</<span class="ai-tag">div</span>></span>
<span class="ai-line"> <<span class="ai-tag">div</span> <span class="ai-attr">class</span>=<span class="ai-str">"item"</span>>C</<span class="ai-tag">div</span>></span>
<span class="ai-line"></<span class="ai-tag">div</span>></span>
<span class="ai-line"></span>
<span class="ai-line"><<span class="ai-tag">h2</span>>align-items: end</<span class="ai-tag">h2</span>></span>
<span class="ai-line"><<span class="ai-tag">div</span> <span class="ai-attr">class</span>=<span class="ai-str">"grid end"</span>></span>
<span class="ai-line"> <<span class="ai-tag">div</span> <span class="ai-attr">class</span>=<span class="ai-str">"item"</span>>A</<span class="ai-tag">div</span>></span>
<span class="ai-line"> <<span class="ai-tag">div</span> <span class="ai-attr">class</span>=<span class="ai-str">"item"</span>>B</<span class="ai-tag">div</span>></span>
<span class="ai-line"> <<span class="ai-tag">div</span> <span class="ai-attr">class</span>=<span class="ai-str">"item"</span>>C</<span class="ai-tag">div</span>></span>
<span class="ai-line"></<span class="ai-tag">div</span>></span>
<span class="ai-line"></span>
<span class="ai-line"><<span class="ai-tag">h2</span>>align-items: stretch</<span class="ai-tag">h2</span>></span>
<span class="ai-line"><<span class="ai-tag">div</span> <span class="ai-attr">class</span>=<span class="ai-str">"grid stretch"</span>></span>
<span class="ai-line"> <<span class="ai-tag">div</span> <span class="ai-attr">class</span>=<span class="ai-str">"item"</span>>A</<span class="ai-tag">div</span>></span>
<span class="ai-line"> <<span class="ai-tag">div</span> <span class="ai-attr">class</span>=<span class="ai-str">"item"</span>>B</<span class="ai-tag">div</span>></span>
<span class="ai-line"> <<span class="ai-tag">div</span> <span class="ai-attr">class</span>=<span class="ai-str">"item"</span>>C</<span class="ai-tag">div</span>></span>
<span class="ai-line"></<span class="ai-tag">div</span>></span>
</div>
<div class="ai-codepane" id="ai-pane-css">
<span class="ai-line"><span class="ai-sel">body</span> {</span>
<span class="ai-line"> <span class="ai-prop">font-family</span>: <span class="ai-val">sans-serif</span>;</span>
<span class="ai-line"> <span class="ai-prop">padding</span>: <span class="ai-val">20px</span>;</span>
<span class="ai-line">}</span>
<span class="ai-line"><span class="ai-sel">h2</span> { <span class="ai-prop">margin-top</span>: <span class="ai-val">40px</span>; }</span>
<span class="ai-line"><span class="ai-sel">.grid</span> {</span>
<span class="ai-line"> <span class="ai-prop">display</span>: <span class="ai-val">grid</span>;</span>
<span class="ai-line"> <span class="ai-prop">grid-template-columns</span>: <span class="ai-val">repeat(3, 100px)</span>;</span>
<span class="ai-line"> <span class="ai-prop">grid-template-rows</span>: <span class="ai-val">150px</span>; <span class="ai-com">/* taller row to visualize alignment */</span></span>
<span class="ai-line"> <span class="ai-prop">border</span>: <span class="ai-val">2px dashed #ccc</span>;</span>
<span class="ai-line"> <span class="ai-prop">background</span>: <span class="ai-val">#f9f9f9</span>;</span>
<span class="ai-line"> <span class="ai-prop">gap</span>: <span class="ai-val">10px</span>;</span>
<span class="ai-line"> <span class="ai-prop">margin-bottom</span>: <span class="ai-val">20px</span>;</span>
<span class="ai-line">}</span>
<span class="ai-line"><span class="ai-sel">.item</span> {</span>
<span class="ai-line"> <span class="ai-prop">background</span>: <span class="ai-val">#4a90e2</span>;</span>
<span class="ai-line"> <span class="ai-prop">color</span>: <span class="ai-val">white</span>;</span>
<span class="ai-line"> <span class="ai-prop">padding</span>: <span class="ai-val">5px</span>;</span>
<span class="ai-line"> <span class="ai-prop">height</span>: <span class="ai-val">50px</span>; <span class="ai-com">/* fixed height to visualize alignment */</span></span>
<span class="ai-line"> <span class="ai-prop">display</span>: <span class="ai-val">flex</span>;</span>
<span class="ai-line"> <span class="ai-prop">align-items</span>: <span class="ai-val">center</span>;</span>
<span class="ai-line"> <span class="ai-prop">justify-content</span>: <span class="ai-val">center</span>;</span>
<span class="ai-line">}</span>
<span class="ai-line ai-active" id="ai-line-start"><span class="ai-sel">.start</span> { <span class="ai-prop">align-items</span>: <span class="ai-val">start</span>; }</span>
<span class="ai-line" id="ai-line-center"><span class="ai-sel">.center</span> { <span class="ai-prop">align-items</span>: <span class="ai-val">center</span>; }</span>
<span class="ai-line" id="ai-line-end"><span class="ai-sel">.end</span> { <span class="ai-prop">align-items</span>: <span class="ai-val">end</span>; }</span>
<span class="ai-line" id="ai-line-stretch"><span class="ai-sel">.stretch</span> { <span class="ai-prop">align-items</span>: <span class="ai-val">stretch</span>; }</span>
<span class="ai-line" id="ai-line-stretch-item"><span class="ai-sel">.stretch .item</span> { <span class="ai-prop">height</span>: <span class="ai-val">auto</span>; <span class="ai-com">/* let stretch actually work */</span> }</span>
</div>
</div>
</div>
<div class="ai-browser">
<div class="ai-browser-bar">
<span class="ai-dot"></span><span class="ai-dot"></span><span class="ai-dot"></span>
<div class="ai-tab">🌐 align-items Demo</div>
</div>
<div class="ai-controlrow">
<span class="ai-control-label">align-items:</span>
<div class="ai-segmented" id="ai-segmented">
<button class="ai-seg-btn ai-seg-on" data-val="start">start</button>
<button class="ai-seg-btn" data-val="center">center</button>
<button class="ai-seg-btn" data-val="end">end</button>
<button class="ai-seg-btn" data-val="stretch">stretch</button>
</div>
</div>
<div class="ai-screen">
<div class="ai-out-grid" id="ai-out-grid">
<div class="ai-out-item" id="ai-item-a">A</div>
<div class="ai-out-item" id="ai-item-b">B</div>
<div class="ai-out-item" id="ai-item-c">C</div>
</div>
</div>
</div>
<div class="ai-note" id="ai-note">
<strong>align-items</strong> aligns each item <em>within its own cell</em> along the column (the vertical axis) — <code>start</code> pins each 50px-tall item to the top of its 150px-tall row.
</div>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.getElementById('ai-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('ai-tab-html');
const tabCss = document.getElementById('ai-tab-css');
const paneHtml = document.getElementById('ai-pane-html');
const paneCss = document.getElementById('ai-pane-css');
tabHtml.addEventListener('click', () => {
tabHtml.classList.add('ai-tab-on');
tabCss.classList.remove('ai-tab-on');
paneHtml.classList.add('ai-pane-on');
paneCss.classList.remove('ai-pane-on');
});
tabCss.addEventListener('click', () => {
tabCss.classList.add('ai-tab-on');
tabHtml.classList.remove('ai-tab-on');
paneCss.classList.add('ai-pane-on');
paneHtml.classList.remove('ai-pane-on');
});
const buttons = document.querySelectorAll('.ai-seg-btn');
const grid = document.getElementById('ai-out-grid');
const items = [document.getElementById('ai-item-a'), document.getElementById('ai-item-b'), document.getElementById('ai-item-c')];
const note = document.getElementById('ai-note');
const ruleLines = {
start: [document.getElementById('ai-line-start')],
center: [document.getElementById('ai-line-center')],
end: [document.getElementById('ai-line-end')],
stretch: [document.getElementById('ai-line-stretch'), document.getElementById('ai-line-stretch-item')]
};
const notes = {
start: '<strong>align-items</strong> aligns each item <em>within its own cell</em> along the column — <code>start</code> pins each 50px-tall item to the top of its 150px-tall row.',
center: '<code>center</code> centers each 50px-tall item vertically, with even space above and below.',
end: '<code>end</code> pushes each item down to the bottom of its cell.',
stretch: '<code>stretch</code> makes items fill the full row height — but only because <code>.stretch .item { height: auto }</code> overrides the fixed <code>50px</code>. Without that override, the fixed height would block stretch from doing anything.'
};
buttons.forEach(btn => {
btn.addEventListener('click', () => {
const val = btn.getAttribute('data-val');
buttons.forEach(b => b.classList.toggle('ai-seg-on', b === btn));
grid.style.alignItems = val;
items.forEach(it => { it.style.height = (val === 'stretch') ? 'auto' : '50px'; });
document.querySelectorAll('.ai-line').forEach(l => l.classList.remove('ai-active'));
(ruleLines[val] || []).forEach(el => el && el.classList.add('ai-active'));
note.innerHTML = notes[val];
tabCss.click();
});
});
})();
</script>
</body>
</html>✅ place-items
Shorthand for both
align-itemsandjustify-items.Syntax:
place-items: align justify;
🧪 Examples:
.grid {
place-items: center;
/* align-items: center; justify-items: center */
}
.grid {
place-items: start end;
/* align-items: start; justify-items: end; */
}Full Code
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CSS Grid: place-items</title>
<style>
.infographic-placeitems {
--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-placeitems[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.pi-inner { padding: 0.5rem; }
.pi-layout { display: flex; flex-direction: column; gap: 1.5rem; }
.pi-code-wrap {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
overflow: hidden;
}
.pi-filetabs {
display: flex;
background: #161616;
border-bottom: 1px solid #2a2a2a;
}
.pi-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;
}
.pi-filetab:hover { color: #e5e5e5; }
.pi-filetab.pi-tab-on {
color: #ffffff;
border-bottom-color: #5b8def;
background: #0b0b0b;
}
.pi-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;
}
.pi-codepane { display: none; }
.pi-codepane.pi-pane-on { display: block; }
.pi-line { display: block; white-space: pre; color: #8a8a8a; padding: 0.05rem 0.4rem; border-radius: 5px; }
.pi-line.pi-active { background: #1c2333; box-shadow: inset 3px 0 0 #5b8def; color: #ffffff; }
.pi-tag { color: #60a5fa; font-weight: 700; }
.pi-attr { color: #f2b96b; }
.pi-str { color: #9ece6a; }
.pi-sel { color: #f472b6; font-weight: 700; }
.pi-prop { color: #c586c0; }
.pi-val { color: #ce9178; }
.pi-com { color: #6a6a6a; font-style: italic; }
.pi-browser {
border: 1px solid var(--line);
border-radius: 10px;
overflow: hidden;
background: var(--paper);
}
.pi-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);
}
.pi-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--line); }
.pi-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;
}
.pi-controlrow {
background: var(--paper-alt);
padding: 0.5rem 0.7rem 0.6rem;
display: flex;
align-items: center;
gap: 0.6rem;
flex-wrap: wrap;
}
.pi-control-label {
font-size: 0.72rem;
color: var(--ink-soft);
font-family: "SFMono-Regular", Consolas, monospace;
}
.pi-segmented {
display: flex;
border: 1px solid var(--line);
border-radius: 999px;
overflow: hidden;
flex-wrap: wrap;
}
.pi-seg-btn {
border: none;
background: var(--paper);
color: var(--ink-soft);
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.68rem;
font-weight: 700;
padding: 0.35rem 0.6rem;
cursor: pointer;
transition: background 0.15s ease, color 0.15s ease;
white-space: nowrap;
}
.pi-seg-btn + .pi-seg-btn { border-left: 1px solid var(--line); }
.pi-seg-btn.pi-seg-on { background: var(--accent); color: #ffffff; }
.pi-screen {
background: #f9f9f9;
padding: 1.2rem 1.4rem 1.4rem;
}
.pi-out-grid {
display: grid;
grid-template-columns: repeat(3, 90px);
grid-template-rows: 130px;
border: 2px dashed #ccc;
background: #f9f9f9;
gap: 10px;
align-items: start;
justify-items: start;
}
.pi-out-item {
background: #4a90e2;
color: white;
font-weight: bold;
height: 50px;
width: 70px;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
transition: height 0.15s ease, width 0.15s ease;
}
.pi-note {
font-size: 0.82rem;
color: var(--ink-soft);
padding: 0 0.2rem;
}
.pi-note strong { color: var(--ink); }
.pi-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-placeitems" id="pi-root">
<div class="pi-inner">
<div class="pi-layout">
<div class="pi-code-wrap">
<div class="pi-filetabs">
<button class="pi-filetab pi-tab-on" id="pi-tab-html">index.html</button>
<button class="pi-filetab" id="pi-tab-css">style.css</button>
</div>
<div class="pi-code">
<div class="pi-codepane pi-pane-on" id="pi-pane-html">
<span class="pi-line"><<span class="pi-tag">h2</span>>place-items: start start</<span class="pi-tag">h2</span>></span>
<span class="pi-line"><<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"grid start-start"</span>></span>
<span class="pi-line"> <<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"item"</span>>A</<span class="pi-tag">div</span>></span>
<span class="pi-line"> <<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"item"</span>>B</<span class="pi-tag">div</span>></span>
<span class="pi-line"> <<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"item"</span>>C</<span class="pi-tag">div</span>></span>
<span class="pi-line"></<span class="pi-tag">div</span>></span>
<span class="pi-line"></span>
<span class="pi-line"><<span class="pi-tag">h2</span>>place-items: center center</<span class="pi-tag">h2</span>></span>
<span class="pi-line"><<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"grid center-center"</span>></span>
<span class="pi-line"> <<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"item"</span>>A</<span class="pi-tag">div</span>></span>
<span class="pi-line"> <<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"item"</span>>B</<span class="pi-tag">div</span>></span>
<span class="pi-line"> <<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"item"</span>>C</<span class="pi-tag">div</span>></span>
<span class="pi-line"></<span class="pi-tag">div</span>></span>
<span class="pi-line"></span>
<span class="pi-line"><<span class="pi-tag">h2</span>>place-items: end end</<span class="pi-tag">h2</span>></span>
<span class="pi-line"><<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"grid end-end"</span>></span>
<span class="pi-line"> <<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"item"</span>>A</<span class="pi-tag">div</span>></span>
<span class="pi-line"> <<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"item"</span>>B</<span class="pi-tag">div</span>></span>
<span class="pi-line"> <<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"item"</span>>C</<span class="pi-tag">div</span>></span>
<span class="pi-line"></<span class="pi-tag">div</span>></span>
<span class="pi-line"></span>
<span class="pi-line"><<span class="pi-tag">h2</span>>place-items: start end</<span class="pi-tag">h2</span>></span>
<span class="pi-line"><<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"grid start-end"</span>></span>
<span class="pi-line"> <<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"item"</span>>A</<span class="pi-tag">div</span>></span>
<span class="pi-line"> <<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"item"</span>>B</<span class="pi-tag">div</span>></span>
<span class="pi-line"> <<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"item"</span>>C</<span class="pi-tag">div</span>></span>
<span class="pi-line"></<span class="pi-tag">div</span>></span>
<span class="pi-line"></span>
<span class="pi-line"><<span class="pi-tag">h2</span>>place-items: stretch stretch</<span class="pi-tag">h2</span>></span>
<span class="pi-line"><<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"grid stretch-stretch"</span>></span>
<span class="pi-line"> <<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"item"</span>>A</<span class="pi-tag">div</span>></span>
<span class="pi-line"> <<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"item"</span>>B</<span class="pi-tag">div</span>></span>
<span class="pi-line"> <<span class="pi-tag">div</span> <span class="pi-attr">class</span>=<span class="pi-str">"item"</span>>C</<span class="pi-tag">div</span>></span>
<span class="pi-line"></<span class="pi-tag">div</span>></span>
</div>
<div class="pi-codepane" id="pi-pane-css">
<span class="pi-line"><span class="pi-sel">body</span> {</span>
<span class="pi-line"> <span class="pi-prop">font-family</span>: <span class="pi-val">sans-serif</span>;</span>
<span class="pi-line"> <span class="pi-prop">padding</span>: <span class="pi-val">20px</span>;</span>
<span class="pi-line">}</span>
<span class="pi-line"><span class="pi-sel">h2</span> { <span class="pi-prop">margin-top</span>: <span class="pi-val">40px</span>; }</span>
<span class="pi-line"><span class="pi-sel">.grid</span> {</span>
<span class="pi-line"> <span class="pi-prop">display</span>: <span class="pi-val">grid</span>;</span>
<span class="pi-line"> <span class="pi-prop">grid-template-columns</span>: <span class="pi-val">repeat(3, 1fr)</span>;</span>
<span class="pi-line"> <span class="pi-prop">grid-template-rows</span>: <span class="pi-val">150px</span>;</span>
<span class="pi-line"> <span class="pi-prop">border</span>: <span class="pi-val">2px dashed #ccc</span>;</span>
<span class="pi-line"> <span class="pi-prop">background</span>: <span class="pi-val">#f9f9f9</span>;</span>
<span class="pi-line"> <span class="pi-prop">margin-bottom</span>: <span class="pi-val">20px</span>;</span>
<span class="pi-line"> <span class="pi-prop">gap</span>: <span class="pi-val">10px</span>;</span>
<span class="pi-line">}</span>
<span class="pi-line"><span class="pi-sel">.item</span> {</span>
<span class="pi-line"> <span class="pi-prop">background</span>: <span class="pi-val">#4a90e2</span>;</span>
<span class="pi-line"> <span class="pi-prop">color</span>: <span class="pi-val">white</span>;</span>
<span class="pi-line"> <span class="pi-prop">height</span>: <span class="pi-val">50px</span>;</span>
<span class="pi-line"> <span class="pi-prop">width</span>: <span class="pi-val">70px</span>;</span>
<span class="pi-line"> <span class="pi-prop">display</span>: <span class="pi-val">flex</span>;</span>
<span class="pi-line"> <span class="pi-prop">align-items</span>: <span class="pi-val">center</span>;</span>
<span class="pi-line"> <span class="pi-prop">justify-content</span>: <span class="pi-val">center</span>;</span>
<span class="pi-line">}</span>
<span class="pi-line"><span class="pi-com">/* place-items is shorthand: align-items then justify-items */</span></span>
<span class="pi-line pi-active" id="pi-line-start-start"><span class="pi-sel">.start-start</span> { <span class="pi-prop">place-items</span>: <span class="pi-val">start start</span>; }</span>
<span class="pi-line" id="pi-line-center-center"><span class="pi-sel">.center-center</span> { <span class="pi-prop">place-items</span>: <span class="pi-val">center center</span>; }</span>
<span class="pi-line" id="pi-line-end-end"><span class="pi-sel">.end-end</span> { <span class="pi-prop">place-items</span>: <span class="pi-val">end end</span>; }</span>
<span class="pi-line" id="pi-line-start-end"><span class="pi-sel">.start-end</span> { <span class="pi-prop">place-items</span>: <span class="pi-val">start end</span>; }</span>
<span class="pi-line" id="pi-line-stretch-stretch"><span class="pi-sel">.stretch-stretch</span> { <span class="pi-prop">place-items</span>: <span class="pi-val">stretch stretch</span>; }</span>
<span class="pi-line" id="pi-line-stretch-item"><span class="pi-sel">.stretch-stretch .item</span> { <span class="pi-prop">width</span>: <span class="pi-val">100%</span>; <span class="pi-prop">height</span>: <span class="pi-val">100%</span>; }</span>
</div>
</div>
</div>
<div class="pi-browser">
<div class="pi-browser-bar">
<span class="pi-dot"></span><span class="pi-dot"></span><span class="pi-dot"></span>
<div class="pi-tab">🌐 place-items Demo</div>
</div>
<div class="pi-controlrow">
<span class="pi-control-label">place-items:</span>
<div class="pi-segmented" id="pi-segmented">
<button class="pi-seg-btn pi-seg-on" data-val="start-start">start start</button>
<button class="pi-seg-btn" data-val="center-center">center center</button>
<button class="pi-seg-btn" data-val="end-end">end end</button>
<button class="pi-seg-btn" data-val="start-end">start end</button>
<button class="pi-seg-btn" data-val="stretch-stretch">stretch stretch</button>
</div>
</div>
<div class="pi-screen">
<div class="pi-out-grid" id="pi-out-grid">
<div class="pi-out-item" id="pi-item-a">A</div>
<div class="pi-out-item" id="pi-item-b">B</div>
<div class="pi-out-item" id="pi-item-c">C</div>
</div>
</div>
</div>
<div class="pi-note" id="pi-note">
<strong>place-items</strong> is shorthand for two values: <code>align-items</code> (vertical, first) then <code>justify-items</code> (horizontal, second). <code>start start</code> pins each item to the top-left corner of its cell.
</div>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.getElementById('pi-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('pi-tab-html');
const tabCss = document.getElementById('pi-tab-css');
const paneHtml = document.getElementById('pi-pane-html');
const paneCss = document.getElementById('pi-pane-css');
tabHtml.addEventListener('click', () => {
tabHtml.classList.add('pi-tab-on');
tabCss.classList.remove('pi-tab-on');
paneHtml.classList.add('pi-pane-on');
paneCss.classList.remove('pi-pane-on');
});
tabCss.addEventListener('click', () => {
tabCss.classList.add('pi-tab-on');
tabHtml.classList.remove('pi-tab-on');
paneCss.classList.add('pi-pane-on');
paneHtml.classList.remove('pi-pane-on');
});
const buttons = document.querySelectorAll('.pi-seg-btn');
const grid = document.getElementById('pi-out-grid');
const items = [document.getElementById('pi-item-a'), document.getElementById('pi-item-b'), document.getElementById('pi-item-c')];
const note = document.getElementById('pi-note');
const combos = {
'start-start': { align: 'start', justify: 'start' },
'center-center': { align: 'center', justify: 'center' },
'end-end': { align: 'end', justify: 'end' },
'start-end': { align: 'start', justify: 'end' },
'stretch-stretch': { align: 'stretch', justify: 'stretch' }
};
const ruleLines = {
'start-start': [document.getElementById('pi-line-start-start')],
'center-center': [document.getElementById('pi-line-center-center')],
'end-end': [document.getElementById('pi-line-end-end')],
'start-end': [document.getElementById('pi-line-start-end')],
'stretch-stretch': [document.getElementById('pi-line-stretch-stretch'), document.getElementById('pi-line-stretch-item')]
};
const notes = {
'start-start': '<code>start start</code> pins each item to the <strong>top-left</strong> corner of its cell — first value is vertical (align), second is horizontal (justify).',
'center-center': '<code>center center</code> centers each item on <strong>both axes</strong> at once, dead-center in its cell.',
'end-end': '<code>end end</code> pushes each item to the <strong>bottom-right</strong> corner of its cell.',
'start-end': '<code>start end</code> mixes axes: <strong>top</strong> vertically (align: start) but <strong>right</strong> horizontally (justify: end).',
'stretch-stretch': '<code>stretch stretch</code> fills the whole cell on both axes — but only because <code>.stretch-stretch .item { width: 100%; height: 100% }</code> overrides the fixed <code>70px × 50px</code> size.'
};
buttons.forEach(btn => {
btn.addEventListener('click', () => {
const val = btn.getAttribute('data-val');
buttons.forEach(b => b.classList.toggle('pi-seg-on', b === btn));
const combo = combos[val];
grid.style.alignItems = combo.align;
grid.style.justifyItems = combo.justify;
const stretch = val === 'stretch-stretch';
items.forEach(it => {
it.style.width = stretch ? '100%' : '70px';
it.style.height = stretch ? '100%' : '50px';
});
document.querySelectorAll('.pi-line').forEach(l => l.classList.remove('pi-active'));
(ruleLines[val] || []).forEach(el => el && el.classList.add('pi-active'));
note.innerHTML = notes[val];
tabCss.click();
});
});
})();
</script>
</body>
</html>📝 Summary Table
Property | Aligns Along | Controls Position Of | Example Value |
|---|---|---|---|
| Horizontal | Inside grid cell |
|
| Vertical | Inside grid cell |
|
| Both | Inside grid cell |
|