😵💫 Flex grow-shrink-basis
The three core properties that determine how flex items size themselves inside a Flex container are:
flex-grow: How items expandflex-shrink: How items shrinkflex-basis: The item’s initial size
Together, they define how space is distributed among flex items.
🧱 Syntax
flex: 1 0 200px;
/* short form for using flex grow, shrink and basis all together*/🧱 HTML code to be used further
<div class="flex-container">
<div class="flex-item item-0">Item 1</div>
<div class="flex-item item-1">Item 2</div>
<div class="flex-item item-2">Item 3</div>
</div>This means:
Item can grow (value
1)It will not shrink (
0)Starts at a base width of 200px
🔹 1. flex-grow
Controls how much a flex item can grow relative to others when extra space is available in the container.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Flex Grow Playground</title>
<style>
.infographic-flexgrow {
--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-flexgrow[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.ha-inner { padding: 0.5rem; }
.ha-layout { display: flex; flex-direction: column; gap: 1.1rem; }
.ha-code {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
padding: 0.8rem 1.8rem 0.8rem 0.9rem;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.8rem;
line-height: 1.7;
color: #e5e5e5;
overflow-x: auto;
white-space: pre-wrap;
}
.ha-code .ha-prop { color: #c586c0; }
.ha-code .ha-val { color: #ce9178; }
.ha-code .ha-val-hl { color: #ffd166; font-weight: 700; }
.ha-code .ha-sel { color: #f472b6; font-weight: 700; }
.ha-code .ha-comment { color: #5c6370; font-style: italic; }
.ha-slider-row {
display: grid;
grid-template-columns: 90px 1fr 30px;
align-items: center;
gap: 0.6rem;
}
.ha-slider-row label {
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.76rem;
font-weight: 700;
}
.ha-row-1 label { color: #2c5f8a; }
.ha-row-2 label { color: #1c4a6e; }
.ha-row-3 label { color: #123249; }
.ha-slider-row input[type="range"] { width: 100%; accent-color: var(--accent); }
.ha-slider-row .ha-val {
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.76rem;
color: var(--ink-soft);
text-align: right;
}
.ha-stage {
background: lightgrey;
border-radius: 8px;
padding: 10px;
height: 100px;
display: flex;
box-sizing: border-box;
}
.ha-flex-item {
background-color: steelblue;
color: white;
margin: 5px;
padding: 20px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-weight: 700;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
border-radius: 3px;
flex-basis: auto;
flex-shrink: 1;
transition: flex-grow 0.35s ease;
box-sizing: border-box;
white-space: nowrap;
}
.ha-note {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 0.78rem;
color: var(--ink-soft);
}
</style>
</head>
<body>
<div class="infographic-flexgrow" id="ha-root">
<div class="ha-inner">
<div class="ha-layout">
<div class="ha-code" id="code-out"></div>
<div class="ha-slider-row ha-row-1">
<label>.item-0 (Item 1)</label>
<input type="range" id="s-1" min="0" max="4" value="0">
<span class="ha-val" id="v-1">0</span>
</div>
<div class="ha-slider-row ha-row-2">
<label>.item-1 (Item 2)</label>
<input type="range" id="s-2" min="0" max="4" value="1">
<span class="ha-val" id="v-2">1</span>
</div>
<div class="ha-slider-row ha-row-3">
<label>.item-2 (Item 3)</label>
<input type="range" id="s-3" min="0" max="4" value="2">
<span class="ha-val" id="v-3">2</span>
</div>
<div class="ha-stage" id="stage">
<div class="ha-flex-item" id="item-1">Item 1</div>
<div class="ha-flex-item" id="item-2">Item 2</div>
<div class="ha-flex-item" id="item-3">Item 3</div>
</div>
<div class="ha-note" id="note-out"></div>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.getElementById('ha-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 s1 = document.getElementById('s-1');
const s2 = document.getElementById('s-2');
const s3 = document.getElementById('s-3');
const v1 = document.getElementById('v-1');
const v2 = document.getElementById('v-2');
const v3 = document.getElementById('v-3');
const item1 = document.getElementById('item-1');
const item2 = document.getElementById('item-2');
const item3 = document.getElementById('item-3');
const codeOut = document.getElementById('code-out');
const note = document.getElementById('note-out');
function render() {
const g1 = +s1.value, g2 = +s2.value, g3 = +s3.value;
v1.textContent = g1; v2.textContent = g2; v3.textContent = g3;
item1.style.flexGrow = g1;
item2.style.flexGrow = g2;
item3.style.flexGrow = g3;
codeOut.innerHTML =
'<span class="ha-sel">.flex-container</span> {\n' +
' <span class="ha-prop">display</span>: <span class="ha-val">flex</span>;\n' +
' <span class="ha-prop">background-color</span>: <span class="ha-val">lightgrey</span>;\n' +
' <span class="ha-prop">padding</span>: <span class="ha-val">10px</span>;\n' +
' <span class="ha-prop">height</span>: <span class="ha-val">100px</span>;\n' +
'}\n' +
'<span class="ha-sel">.flex-item</span> {\n' +
' <span class="ha-prop">background-color</span>: <span class="ha-val">steelblue</span>;\n' +
' <span class="ha-prop">color</span>: <span class="ha-val">white</span>;\n' +
' <span class="ha-prop">margin</span>: <span class="ha-val">5px</span>;\n' +
' <span class="ha-prop">padding</span>: <span class="ha-val">20px</span>;\n' +
'}\n' +
'<span class="ha-comment">/* Flex grow values */</span>\n' +
'<span class="ha-sel">.item-0</span> {\n <span class="ha-prop">flex-grow</span>: <span class="ha-val-hl">' + g1 + '</span>;\n}\n' +
'<span class="ha-sel">.item-1</span> {\n <span class="ha-prop">flex-grow</span>: <span class="ha-val-hl">' + g2 + '</span>;\n}\n' +
'<span class="ha-sel">.item-2</span> {\n <span class="ha-prop">flex-grow</span>: <span class="ha-val-hl">' + g3 + '</span>;\n}';
const total = g1 + g2 + g3;
if (total === 0) {
note.textContent = 'All flex-grow values are 0 — no item claims any leftover space, so each stays at its natural (content) width.';
} else {
note.textContent = 'Leftover space splits in the ratio ' + g1 + ':' + g2 + ':' + g3 + ' — item ' +
(g1 >= g2 && g1 >= g3 ? '1' : (g2 >= g3 ? '2' : '3')) +
' currently claims the largest share.';
}
}
[s1, s2, s3].forEach(el => el.addEventListener('input', render));
render();
})();
</script>
</body>
</html>.demo {
font-family: system-ui, sans-serif;
padding: 16px;
}
.demo h1 {
color: #2563eb;
margin: 0 0 8px;
}
.demo p {
color: #4b5563;
margin: 0;
}document.querySelector('.demo h1')?.addEventListener('click', () => {
alert('Hello from live preview!');
});flex-grow: 0→ the item won’t grow at allflex-grow: 1or more → the item can grow and fill extra spaceIf all items have
flex-grow: 1, they share space equallyIf one item has
2and others have1, it will get twice the spaceThe higher the number, the more space the item takes compared to others
🔹 2. flex-shrink
Controls how items shrink when there’s not enough space in the container.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Flex Shrink Playground</title>
<style>
.infographic-flexshrink {
--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-flexshrink[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.ha-inner { padding: 0.5rem; }
.ha-layout { display: flex; flex-direction: column; gap: 1.1rem; }
.ha-code {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
padding: 0.8rem 1.8rem 0.8rem 0.9rem;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.78rem;
line-height: 1.7;
color: #e5e5e5;
overflow-x: auto;
white-space: pre-wrap;
}
.ha-code .ha-prop { color: #c586c0; }
.ha-code .ha-val { color: #ce9178; }
.ha-code .ha-val-hl { color: #ffd166; font-weight: 700; }
.ha-code .ha-sel { color: #f472b6; font-weight: 700; }
.ha-code .ha-comment { color: #5c6370; font-style: italic; }
.ha-slider-row {
display: grid;
grid-template-columns: 100px 1fr 30px;
align-items: center;
gap: 0.6rem;
}
.ha-slider-row label {
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.76rem;
font-weight: 700;
}
.ha-row-1 label { color: #2c5f8a; }
.ha-row-2 label { color: #1c4a6e; }
.ha-row-3 label { color: #123249; }
.ha-slider-row input[type="range"] { width: 100%; accent-color: var(--accent); }
.ha-slider-row .ha-val {
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.76rem;
color: var(--ink-soft);
text-align: right;
}
.ha-stage-outer {
background: var(--paper-alt);
border-radius: 10px;
padding: 1rem;
}
.ha-stage-label {
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.65rem;
color: var(--ink-soft);
margin-bottom: 0.5rem;
text-align: center;
}
.ha-stage {
background: lightgrey;
border-radius: 8px;
padding: 10px;
width: 380px;
max-width: 100%;
margin: 0 auto;
display: flex;
box-sizing: border-box;
}
.ha-flex-item {
background-color: steelblue;
color: white;
margin: 5px;
padding: 20px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-weight: 700;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
border-radius: 3px;
flex-basis: 130px;
flex-grow: 0;
transition: flex-shrink 0.35s ease;
box-sizing: border-box;
white-space: nowrap;
overflow: hidden;
}
.ha-note {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 0.78rem;
color: var(--ink-soft);
}
</style>
</head>
<body>
<div class="infographic-flexshrink" id="ha-root">
<div class="ha-inner">
<div class="ha-layout">
<div class="ha-code" id="code-out"></div>
<div class="ha-slider-row ha-row-1">
<label>.item-0 (Item 1)</label>
<input type="range" id="s-1" min="0" max="4" value="0">
<span class="ha-val" id="v-1">0</span>
</div>
<div class="ha-slider-row ha-row-2">
<label>.item-1 (Item 2)</label>
<input type="range" id="s-2" min="0" max="4" value="1">
<span class="ha-val" id="v-2">1</span>
</div>
<div class="ha-slider-row ha-row-3">
<label>.item-2 (Item 3)</label>
<input type="range" id="s-3" min="0" max="4" value="2">
<span class="ha-val" id="v-3">2</span>
</div>
<div class="ha-stage-outer">
<div class="ha-stage-label">container: 380px — three items each want 130px + margins (~480px) — too wide to fit, so they must shrink</div>
<div class="ha-stage" id="stage">
<div class="ha-flex-item" id="item-1">Item 1</div>
<div class="ha-flex-item" id="item-2">Item 2</div>
<div class="ha-flex-item" id="item-3">Item 3</div>
</div>
</div>
<div class="ha-note" id="note-out"></div>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.getElementById('ha-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 s1 = document.getElementById('s-1');
const s2 = document.getElementById('s-2');
const s3 = document.getElementById('s-3');
const v1 = document.getElementById('v-1');
const v2 = document.getElementById('v-2');
const v3 = document.getElementById('v-3');
const item1 = document.getElementById('item-1');
const item2 = document.getElementById('item-2');
const item3 = document.getElementById('item-3');
const codeOut = document.getElementById('code-out');
const note = document.getElementById('note-out');
function render() {
const sh1 = +s1.value, sh2 = +s2.value, sh3 = +s3.value;
v1.textContent = sh1; v2.textContent = sh2; v3.textContent = sh3;
item1.style.flexShrink = sh1;
item2.style.flexShrink = sh2;
item3.style.flexShrink = sh3;
codeOut.innerHTML =
'<span class="ha-sel">.flex-container</span> {\n' +
' <span class="ha-prop">display</span>: <span class="ha-val">flex</span>;\n' +
' <span class="ha-prop">background-color</span>: <span class="ha-val">lightgrey</span>;\n' +
' <span class="ha-prop">padding</span>: <span class="ha-val">10px</span>;\n' +
' <span class="ha-prop">width</span>: <span class="ha-val">500px</span>; <span class="ha-comment">/* small width to force shrinking */</span>\n' +
'}\n' +
'<span class="ha-sel">.flex-item</span> {\n' +
' <span class="ha-prop">background-color</span>: <span class="ha-val">steelblue</span>;\n' +
' <span class="ha-prop">color</span>: <span class="ha-val">white</span>;\n' +
' <span class="ha-prop">margin</span>: <span class="ha-val">5px</span>;\n' +
' <span class="ha-prop">padding</span>: <span class="ha-val">20px</span>;\n' +
' <span class="ha-prop">width</span>: <span class="ha-val">200px</span>; <span class="ha-comment">/* large width to trigger shrink */</span>\n' +
'}\n' +
'<span class="ha-comment">/* Shrink values */</span>\n' +
'<span class="ha-sel">.item-0</span> {\n <span class="ha-prop">flex-shrink</span>: <span class="ha-val-hl">' + sh1 + '</span>;\n}\n' +
'<span class="ha-sel">.item-1</span> {\n <span class="ha-prop">flex-shrink</span>: <span class="ha-val-hl">' + sh2 + '</span>;\n}\n' +
'<span class="ha-sel">.item-2</span> {\n <span class="ha-prop">flex-shrink</span>: <span class="ha-val-hl">' + sh3 + '</span>;\n}';
if (sh1 === 0 && sh2 === 0 && sh3 === 0) {
note.textContent = 'All flex-shrink values are 0 — nothing is allowed to shrink, so items overflow the container at their full basis width.';
} else {
const total = sh1 + sh2 + sh3;
const biggest = sh1 >= sh2 && sh1 >= sh3 ? '1' : (sh2 >= sh3 ? '2' : '3');
note.textContent = sh1 === 0 || sh2 === 0 || sh3 === 0
? 'Any item at flex-shrink: 0 refuses to shrink at all and stays at its full basis width, while the others absorb the deficit in the ratio ' + sh1 + ':' + sh2 + ':' + sh3 + '.'
: 'The shortfall is distributed in the ratio ' + sh1 + ':' + sh2 + ':' + sh3 + ' — item ' + biggest + ' shrinks the most since it has the highest flex-shrink factor.';
}
}
[s1, s2, s3].forEach(el => el.addEventListener('input', render));
render();
})();
</script>
</body>
</html>.demo {
font-family: system-ui, sans-serif;
padding: 16px;
}
.demo h1 {
color: #2563eb;
margin: 0 0 8px;
}
.demo p {
color: #4b5563;
margin: 0;
}document.querySelector('.demo h1')?.addEventListener('click', () => {
alert('Hello from live preview!');
});flex-shrink: 0→ the item stays the same size (doesn’t shrink)flex-shrink: 1or more → the item can shrink to fitBigger numbers = shrinks more compared to others
🔹 3. flex-basis
Defines the initial size of a flex item before space distribution.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Flex Basis Playground</title>
<style>
.infographic-flexbasis {
--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-flexbasis[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.ha-inner { padding: 0.5rem; }
.ha-layout { display: flex; flex-direction: column; gap: 1.1rem; }
.ha-code {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
padding: 0.8rem 1.8rem 0.8rem 0.9rem;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.78rem;
line-height: 1.7;
color: #e5e5e5;
overflow-x: auto;
white-space: pre-wrap;
}
.ha-code .ha-prop { color: #c586c0; }
.ha-code .ha-val { color: #ce9178; }
.ha-code .ha-val-hl { color: #ffd166; font-weight: 700; }
.ha-code .ha-sel { color: #f472b6; font-weight: 700; }
.ha-code .ha-comment { color: #5c6370; font-style: italic; }
.ha-slider-row {
display: grid;
grid-template-columns: 100px 1fr 40px;
align-items: center;
gap: 0.6rem;
}
.ha-slider-row label {
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.76rem;
font-weight: 700;
}
.ha-row-1 label { color: #2c5f8a; }
.ha-row-2 label { color: #1c4a6e; }
.ha-slider-row input[type="range"] { width: 100%; accent-color: var(--accent); }
.ha-slider-row .ha-val {
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.76rem;
color: var(--ink-soft);
text-align: right;
}
.ha-toggle-row {
display: flex;
align-items: center;
gap: 0.6rem;
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.76rem;
color: #123249;
font-weight: 700;
}
.ha-toggle-row input[type="range"] { flex: 1; accent-color: var(--accent); }
.ha-toggle-row .ha-val {
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.76rem;
color: var(--ink-soft);
text-align: right;
width: 40px;
}
.ha-basis-toggle {
display: flex;
background: var(--paper-alt);
border: 1px solid var(--line);
border-radius: 999px;
padding: 0.2rem;
gap: 0.2rem;
}
.ha-basis-toggle button {
border: none;
background: transparent;
color: var(--ink-soft);
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.7rem;
font-weight: 700;
padding: 0.3rem 0.6rem;
border-radius: 999px;
cursor: pointer;
}
.ha-basis-toggle button.ha-on { background: var(--accent); color: #fff; }
.ha-stage {
background: lightgrey;
border-radius: 8px;
padding: 10px;
display: flex;
box-sizing: border-box;
}
.ha-flex-item {
background-color: steelblue;
color: white;
margin: 5px;
padding: 10px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-weight: 700;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
border-radius: 3px;
flex-grow: 0;
flex-shrink: 0;
transition: flex-basis 0.35s ease, width 0.35s ease;
box-sizing: border-box;
white-space: nowrap;
}
.ha-note {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 0.78rem;
color: var(--ink-soft);
}
</style>
</head>
<body>
<div class="infographic-flexbasis" id="ha-root">
<div class="ha-inner">
<div class="ha-layout">
<div class="ha-code" id="code-out"></div>
<div class="ha-slider-row ha-row-1">
<label>.item-0 basis</label>
<input type="range" id="s-1" min="0" max="200" value="50">
<span class="ha-val" id="v-1">50px</span>
</div>
<div class="ha-slider-row ha-row-2">
<label>.item-1 basis</label>
<input type="range" id="s-2" min="0" max="200" value="100">
<span class="ha-val" id="v-2">100px</span>
</div>
<div class="ha-toggle-row">
<span>.item-2 basis</span>
<div class="ha-basis-toggle" id="basis-toggle">
<button class="ha-on" data-mode="auto">auto (uses width)</button>
<button data-mode="fixed">fixed value</button>
</div>
</div>
<div class="ha-slider-row ha-row-2" id="width-row">
<label>.item-2 width</label>
<input type="range" id="s-3" min="40" max="250" value="150">
<span class="ha-val" id="v-3">150px</span>
</div>
<div class="ha-stage" id="stage">
<div class="ha-flex-item" id="item-1">Item 1</div>
<div class="ha-flex-item" id="item-2">Item 2</div>
<div class="ha-flex-item" id="item-3">Item 3</div>
</div>
<div class="ha-note" id="note-out"></div>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.getElementById('ha-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 s1 = document.getElementById('s-1');
const s2 = document.getElementById('s-2');
const s3 = document.getElementById('s-3');
const v1 = document.getElementById('v-1');
const v2 = document.getElementById('v-2');
const v3 = document.getElementById('v-3');
const item1 = document.getElementById('item-1');
const item2 = document.getElementById('item-2');
const item3 = document.getElementById('item-3');
const codeOut = document.getElementById('code-out');
const note = document.getElementById('note-out');
const widthRow = document.getElementById('width-row');
const basisToggle = document.getElementById('basis-toggle');
let item3Mode = 'auto';
function render() {
const b1 = +s1.value, b2 = +s2.value, w3 = +s3.value;
v1.textContent = b1 + 'px';
v2.textContent = b2 + 'px';
v3.textContent = w3 + 'px';
item1.style.flexBasis = b1 + 'px';
item2.style.flexBasis = b2 + 'px';
let item2CssBasis, item3Block;
if (item3Mode === 'auto') {
item3.style.flexBasis = 'auto';
item3.style.width = w3 + 'px';
widthRow.style.opacity = '1';
item3Block = '<span class="ha-sel">.item-2</span> {\n <span class="ha-prop">flex-basis</span>: <span class="ha-val-hl">auto</span>;\n <span class="ha-prop">width</span>: <span class="ha-val-hl">' + w3 + 'px</span>; <span class="ha-comment">/* respected only if basis is auto */</span>\n}';
note.textContent = "Item 3's flex-basis is auto, so its width comes straight from the width property (" + w3 + "px) — that's the only case where width has any effect on a flex item's main size.";
} else {
item3.style.flexBasis = w3 + 'px';
item3.style.width = '';
widthRow.style.opacity = '1';
item3Block = '<span class="ha-sel">.item-2</span> {\n <span class="ha-prop">flex-basis</span>: <span class="ha-val-hl">' + w3 + 'px</span>;\n <span class="ha-prop">width</span>: <span class="ha-val">150px</span>; <span class="ha-comment">/* ignored — flex-basis wins */</span>\n}';
note.textContent = "With flex-basis set to a real value (" + w3 + "px), the width property is completely ignored — flex-basis always overrides width once it's anything other than auto.";
}
codeOut.innerHTML =
'<span class="ha-sel">.flex-container</span> {\n' +
' <span class="ha-prop">display</span>: <span class="ha-val">flex</span>;\n' +
' <span class="ha-prop">background-color</span>: <span class="ha-val">lightgrey</span>;\n' +
' <span class="ha-prop">padding</span>: <span class="ha-val">10px</span>;\n' +
'}\n' +
'<span class="ha-sel">.flex-item</span> {\n' +
' <span class="ha-prop">background-color</span>: <span class="ha-val">steelblue</span>;\n' +
' <span class="ha-prop">color</span>: <span class="ha-val">white</span>;\n' +
' <span class="ha-prop">margin</span>: <span class="ha-val">5px</span>;\n' +
' <span class="ha-prop">padding</span>: <span class="ha-val">10px</span>;\n' +
'}\n' +
'<span class="ha-comment">/* Flex-basis variations */</span>\n' +
'<span class="ha-sel">.item-0</span> {\n <span class="ha-prop">flex-basis</span>: <span class="ha-val-hl">' + b1 + 'px</span>;\n}\n' +
'<span class="ha-sel">.item-1</span> {\n <span class="ha-prop">flex-basis</span>: <span class="ha-val-hl">' + b2 + 'px</span>;\n}\n' +
item3Block;
}
basisToggle.querySelectorAll('button').forEach(btn => {
btn.addEventListener('click', () => {
basisToggle.querySelectorAll('button').forEach(b => b.classList.remove('ha-on'));
btn.classList.add('ha-on');
item3Mode = btn.getAttribute('data-mode');
render();
});
});
[s1, s2, s3].forEach(el => el.addEventListener('input', render));
render();
})();
</script>
</body>
</html>.demo {
font-family: system-ui, sans-serif;
padding: 16px;
}
.demo h1 {
color: #2563eb;
margin: 0 0 8px;
}
.demo p {
color: #4b5563;
margin: 0;
}document.querySelector('.demo h1')?.addEventListener('click', () => {
alert('Hello from live preview!');
});auto(default) → uses the content size or the setwidth0→ ignores content size, lets the item fully flexpx,%,em, etc. → sets a fixed starting size for the item
💡 Common Values:
Shorthand | Meaning |
|---|---|
|
|
| Default value |
| Fixed-size item that doesn't grow or shrink |
| Growable item starting from 200px width |
🎯 Summary Table
Property | Role | Default |
|---|---|---|
| Can the item grow? |
|
| Can the item shrink? |
|
| Initial size before flexing |
|
📌 Use flex shorthand for cleaner code and more responsive layouts.