๐ Understanding Overflow Property
Overflow in CSS Defines what happens when content overflows the box.
๐น visible (default)
Content spills out of the box.
No clipping.
<body>
<h2>CSS Overflow: visible</h2>
<div class="box">
This is a box with a fixed size. The size of the box is fixed and not
flexible. But the content inside this box is very long and will overflow
beyond the box boundaries without being cut or hidden.
</div>
</body>/* styles.css */
.box {
overflow: visible;
}๐น hidden
Content is clipped (cut off).
No scrollbar shown.
<body>
<h2>CSS overflow: hidden</h2>
<div class="box">
This box has a fixed height and width.<br>
But since <code>overflow: hidden</code> is used, extra
content will spill out of the box without being clipped or hidden.
Extra content spilling out... Extra content spilling out...
Extra content spilling out...
</div>
</body>/* styles.css */
.box {
overflow: hidden;
}๐น scroll
Always shows scrollbars (even if not needed).
Both vertical and horizontal if necessary.
<body>
<h2>CSS overflow: scroll</h2>
<div class="box">
This content is very long and will overflow outside the box. Scrollbars
will appear even if all the content fits inside the box. Scroll down to
read more.
More text... More text... More text... More text... More text... More
text... More text... More text... More text... More text...
</div>
</body>/* styles.css */
.box {
overflow: scroll;
}๐น auto
Adds scrollbars only when needed.
<body>
<h2>CSS overflow: auto</h2>
<div class="box">
This box uses <code>overflow: auto</code>.<br />
Scrollbars will appear <strong>only</strong> if the content inside exceeds
the box size. <br /><br />
Extra content... Extra content... Extra content... Extra content... Extra
content... Extra content... Extra content... Extra content... Extra
content...
</div>
</body>/* styles.css */
.box {
overflow: auto;
}๐ Playground
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Overflow Playground</title>
<style>
.infographic-overflow {
--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-overflow[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-content-toggle {
display: flex;
align-items: center;
gap: 0.5rem;
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.78rem;
color: var(--ink-soft);
}
.ha-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0.9rem;
}
@media (max-width: 480px) {
.ha-grid { grid-template-columns: 1fr; }
}
.ha-cell {
background: var(--paper-alt);
border: 1px solid var(--line);
border-radius: 10px;
padding: 0.9rem;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.ha-cell-label {
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.78rem;
font-weight: 700;
}
.ha-cell-label code { color: var(--accent); }
.ha-box {
width: 100%;
height: 90px;
padding: 8px;
border: 2px solid #333;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 0.72rem;
line-height: 1.35;
box-sizing: border-box;
color: #222;
}
#box-visible { background-color: #f9caca; overflow: visible; }
#box-hidden { background-color: #ffdddd; overflow: hidden; }
#box-scroll { background-color: #ddf1ff; overflow: scroll; }
#box-auto { background-color: #e3ffe4; overflow: auto; }
.ha-cell-note {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 0.7rem;
color: var(--ink-soft);
}
</style>
</head>
<body>
<div class="infographic-overflow" id="ha-root">
<div class="ha-inner">
<div class="ha-layout">
<div class="ha-content-toggle">
<input type="checkbox" id="chk-long" checked>
<label for="chk-long">use long overflowing content (uncheck to see short content that fits)</label>
</div>
<div class="ha-grid">
<div class="ha-cell">
<div class="ha-cell-label"><code>visible</code> (default)</div>
<div class="ha-box" id="box-visible"></div>
<div class="ha-cell-note">Nothing is clipped โ text just spills out past the border.</div>
</div>
<div class="ha-cell">
<div class="ha-cell-label"><code>hidden</code></div>
<div class="ha-box" id="box-hidden"></div>
<div class="ha-cell-note">Extra content is clipped away โ no scrollbar, no way to reach it.</div>
</div>
<div class="ha-cell">
<div class="ha-cell-label"><code>scroll</code></div>
<div class="ha-box" id="box-scroll"></div>
<div class="ha-cell-note">Scrollbars always show, even now with short content โ try the checkbox above.</div>
</div>
<div class="ha-cell">
<div class="ha-cell-label"><code>auto</code></div>
<div class="ha-box" id="box-auto"></div>
<div class="ha-cell-note">A scrollbar appears only when content actually overflows.</div>
</div>
</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 chkLong = document.getElementById('chk-long');
const boxes = ['box-visible', 'box-hidden', 'box-scroll', 'box-auto'].map(id => document.getElementById(id));
const longText = "This box has a fixed size. The content inside is long enough to keep going well past its normal boundaries, and there's plenty more of it too. Extra content spilling out, extra content spilling out, extra content spilling out, extra content spilling out, extra content spilling out, extra content spilling out, extra content spilling out.";
const shortText = "Short content that fits.";
function render() {
const text = chkLong.checked ? longText : shortText;
boxes.forEach(b => b.textContent = text);
}
chkLong.addEventListener('change', 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!');
});Full Example:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Overflow Example</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<h2>Overflow: visible</h2>
<div class="box visible">
This is some long overflowing text that goes beyond the box.
</div>
<h2>Overflow: hidden</h2>
<div class="box hidden">
This is some long overflowing text that goes beyond the box.
</div>
<h2>Overflow: scroll</h2>
<div class="box scroll">
This is some long overflowing text that goes beyond the box.
</div>
<h2>Overflow: auto</h2>
<div class="box auto">
This is some long overflowing text that goes beyond the box.
</div>
</body>
</html>.box {
width: 200px;
height: 100px;
padding: 10px;
border: 2px solid black;
margin-bottom: 20px;
background: lightyellow;
}
/* Different overflow types */
.visible {
overflow: visible;
}
.hidden {
overflow: hidden;
}
.scroll {
overflow: scroll;
}
.auto {
overflow: auto;
}How to use overflow-x and overflow-y for fine-grained scroll control?
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Overflow X and Y Anatomy</title>
<style>
.infographic-overflowxy {
--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-overflowxy[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.2rem; }
.ha-code-wrap {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
overflow: hidden;
}
.ha-filetabs {
display: flex;
background: #161616;
border-bottom: 1px solid #2a2a2a;
}
.ha-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;
}
.ha-filetab:hover { color: #e5e5e5; }
.ha-filetab.ha-tab-on {
color: #ffffff;
border-bottom-color: #5b8def;
background: #0b0b0b;
}
.ha-code {
padding: 1rem 1.8rem 1rem 0.9rem;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.76rem;
line-height: 1.8;
overflow-x: auto;
}
.ha-codepane { display: none; }
.ha-codepane.ha-pane-on { display: block; }
.ha-line { display: block; white-space: pre; color: #8a8a8a; padding: 0.05rem 0.4rem; }
.ha-tag { color: #60a5fa; font-weight: 700; }
.ha-attr { color: #f2b96b; }
.ha-str { color: #9ece6a; }
.ha-sel { color: #f472b6; font-weight: 700; }
.ha-prop { color: #c586c0; }
.ha-val { color: #ce9178; }
.ha-hl { color: #ffd166; font-weight: 700; }
.ha-browser {
border: 1px solid var(--line);
border-radius: 10px;
overflow: hidden;
background: var(--paper);
}
.ha-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);
}
.ha-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--line); }
.ha-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;
}
.ha-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;
}
.ha-screen {
background: #ffffff;
color: #111;
padding: 1.2rem 1.4rem 1.4rem;
font-family: Georgia, "Times New Roman", serif;
}
.ha-screen h2 { font-size: 1rem; margin: 0 0 0.5rem; }
.overflow-x {
width: 260px;
height: 90px;
border: 2px solid steelblue;
overflow-x: scroll;
overflow-y: hidden;
white-space: nowrap;
margin-bottom: 1.4rem;
}
.wide-content {
display: inline-block;
width: 550px;
height: 100%;
background-color: lightblue;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 0.82rem;
padding: 0.5rem;
box-sizing: border-box;
white-space: normal;
}
.overflow-y {
width: 260px;
height: 90px;
border: 2px solid tomato;
overflow-x: hidden;
overflow-y: scroll;
}
.tall-content {
width: 100%;
height: 280px;
background-color: lightcoral;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 0.82rem;
padding: 0.5rem;
box-sizing: border-box;
}
</style>
</head>
<body>
<div class="infographic-overflowxy" id="ha-root">
<div class="ha-inner">
<div class="ha-layout">
<div class="ha-code-wrap">
<div class="ha-filetabs">
<button class="ha-filetab ha-tab-on" id="tab-html">index.html</button>
<button class="ha-filetab" id="tab-css">style.css</button>
</div>
<div class="ha-code">
<div class="ha-codepane ha-pane-on" id="pane-html">
<span class="ha-line"><<span class="ha-tag">h2</span>>Overflow-X (Horizontal Scroll Only)</<span class="ha-tag">h2</span>></span>
<span class="ha-line"><<span class="ha-tag">div</span> <span class="ha-attr">class</span>=<span class="ha-str">"overflow-x"</span>></span>
<span class="ha-line"> <<span class="ha-tag">div</span> <span class="ha-attr">class</span>=<span class="ha-str">"wide-content"</span>>This content is too wide for the container.</<span class="ha-tag">div</span>></span>
<span class="ha-line"></<span class="ha-tag">div</span>></span>
<span class="ha-line"><<span class="ha-tag">h2</span>>Overflow-Y (Vertical Scroll Only)</<span class="ha-tag">h2</span>></span>
<span class="ha-line"><<span class="ha-tag">div</span> <span class="ha-attr">class</span>=<span class="ha-str">"overflow-y"</span>></span>
<span class="ha-line"> <<span class="ha-tag">div</span> <span class="ha-attr">class</span>=<span class="ha-str">"tall-content"</span>>This content is too tall.</<span class="ha-tag">div</span>></span>
<span class="ha-line"></<span class="ha-tag">div</span>></span>
</div>
<div class="ha-codepane" id="pane-css">
<span class="ha-line"><span class="ha-sel">.overflow-x</span> {</span>
<span class="ha-line"> <span class="ha-prop">width</span>: <span class="ha-val">300px</span>;</span>
<span class="ha-line"> <span class="ha-prop">height</span>: <span class="ha-val">100px</span>;</span>
<span class="ha-line"> <span class="ha-prop">overflow-x</span>: <span class="ha-hl">scroll</span>;</span>
<span class="ha-line"> <span class="ha-prop">overflow-y</span>: <span class="ha-hl">hidden</span>;</span>
<span class="ha-line"> <span class="ha-prop">white-space</span>: <span class="ha-val">nowrap</span>;</span>
<span class="ha-line">}</span>
<span class="ha-line"><span class="ha-sel">.overflow-y</span> {</span>
<span class="ha-line"> <span class="ha-prop">width</span>: <span class="ha-val">300px</span>;</span>
<span class="ha-line"> <span class="ha-prop">height</span>: <span class="ha-val">100px</span>;</span>
<span class="ha-line"> <span class="ha-prop">overflow-x</span>: <span class="ha-hl">hidden</span>;</span>
<span class="ha-line"> <span class="ha-prop">overflow-y</span>: <span class="ha-hl">scroll</span>;</span>
<span class="ha-line">}</span>
<span class="ha-line"><span class="ha-sel">.wide-content</span> { <span class="ha-prop">width</span>: <span class="ha-val">600px</span>; }</span>
<span class="ha-line"><span class="ha-sel">.tall-content</span> { <span class="ha-prop">height</span>: <span class="ha-val">300px</span>; }</span>
</div>
</div>
</div>
<div class="ha-browser">
<div class="ha-browser-bar">
<span class="ha-dot"></span><span class="ha-dot"></span><span class="ha-dot"></span>
<div class="ha-tab">๐ Overflow Example</div>
</div>
<div class="ha-urlrow">127.0.0.1:5500/html</div>
<div class="ha-screen">
<h2>Overflow-X (Horizontal Scroll Only)</h2>
<div class="overflow-x">
<div class="wide-content">This content is too wide for the container. Scroll horizontally โ</div>
</div>
<h2>Overflow-Y (Vertical Scroll Only)</h2>
<div class="overflow-y">
<div class="tall-content">This content is too tall. Scroll vertically โ</div>
</div>
</div>
</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 tabHtml = document.getElementById('tab-html');
const tabCss = document.getElementById('tab-css');
const paneHtml = document.getElementById('pane-html');
const paneCss = document.getElementById('pane-css');
tabHtml.addEventListener('click', () => {
tabHtml.classList.add('ha-tab-on');
tabCss.classList.remove('ha-tab-on');
paneHtml.classList.add('ha-pane-on');
paneCss.classList.remove('ha-pane-on');
});
tabCss.addEventListener('click', () => {
tabCss.classList.add('ha-tab-on');
tabHtml.classList.remove('ha-tab-on');
paneCss.classList.add('ha-pane-on');
paneHtml.classList.remove('ha-pane-on');
});
})();
</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!');
});โ What This Does:
.overflow-xallows horizontal scrolling only (scrollbar appears at the bottom)..overflow-yallows vertical scrolling only (scrollbar appears at the side).white-space: nowrapis used to prevent line breaks and force horizontal overflow.