↔️ Different ways to add CSS
When you want to style your HTML, you can add CSS in three main ways. Here’s how they work:
<div class="infographic-css3">
<style>
.infographic-css3 {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #faf8f4;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-deep: #1d4ed8;
--accent-soft: #e3ebfd;
--line: #ddd6c9;
--display-font: 'Fraunces', serif;
--body-font: 'Inter', sans-serif;
--mono-font: 'IBM Plex Mono', monospace;
font-family: var(--body-font);
color: var(--ink);
max-width: 720px;
margin: 0 auto;
box-sizing: border-box;
background: transparent;
}
.infographic-css3[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-deep: #8fb3ff;
--accent-soft: #202942;
--line: #2c313d;
}
.infographic-css3 * { box-sizing: border-box; }
.ic3-title {
font-family: var(--display-font);
font-size: clamp(1.6rem, 5vw, 2.1rem);
margin: 0 0 0.3rem;
text-align: center;
color: var(--ink);
}
.ic3-sub {
color: var(--ink-soft);
font-size: 0.85rem;
text-align: center;
margin: 0 0 1.75rem;
}
/* Tabs = the three "places CSS can live" */
.ic3-tabs {
display: flex;
gap: 0;
border: 1px solid var(--line);
border-bottom: none;
}
.ic3-tab {
flex: 1;
font-family: var(--mono-font);
font-size: 0.82rem;
font-weight: 600;
text-align: center;
padding: 0.75rem 0.5rem;
background: var(--paper-alt);
border: none;
border-right: 1px solid var(--line);
cursor: pointer;
color: var(--ink-soft);
transition: background 0.15s, color 0.15s;
}
.ic3-tab:last-child { border-right: none; }
.ic3-tab:hover { color: var(--ink); }
.ic3-tab.is-active {
background: var(--paper);
color: var(--accent);
box-shadow: inset 0 3px 0 var(--accent);
}
/* VS Code style editor — intentionally a fixed dark editor palette in
both themes, the way a code editor pane stays dark regardless of the
page around it. Not tied to --paper/--ink on purpose. */
.ic3-editor {
display: grid;
grid-template-columns: 160px 1fr;
border: 1px solid var(--line);
border-top: none;
background: #1e1e1e;
overflow: hidden;
}
.ic3-sidebar {
background: #252526;
padding: 0.75rem 0;
border-right: 1px solid #3a3a3a;
}
.ic3-sidebar-title {
font-family: var(--mono-font);
font-size: 0.62rem;
text-transform: uppercase;
letter-spacing: 0.07em;
color: #8b8b8b;
padding: 0 0.9rem;
margin-bottom: 0.45rem;
}
.ic3-tree-folder {
font-family: var(--mono-font);
font-size: 0.78rem;
color: #cccccc;
padding: 0.3rem 0.9rem;
display: flex;
align-items: center;
gap: 0.35rem;
}
.ic3-tree-item {
display: flex;
align-items: center;
gap: 0.45rem;
font-family: var(--mono-font);
font-size: 0.78rem;
color: #b8b8b8;
padding: 0.32rem 0.9rem 0.32rem 1.6rem;
cursor: pointer;
transition: opacity 0.3s ease, color 0.2s, background 0.2s;
white-space: nowrap;
}
.ic3-tree-item:hover { color: #ffffff; }
.ic3-tree-item .dot {
width: 6px; height: 6px; border-radius: 50%;
background: #5a5a5a; flex-shrink: 0;
}
.ic3-tree-item.is-active {
background: #37373d;
color: #ffffff;
}
.ic3-tree-item.is-active .dot { background: var(--accent); }
.ic3-tree-item.is-new {
opacity: 0;
pointer-events: none;
}
.ic3-tree-item.is-new.is-shown {
opacity: 1;
pointer-events: auto;
}
.ic3-tree-item.is-new.is-shown .dot { background: #4caf50; }
.ic3-editor-main { display: flex; flex-direction: column; min-width: 0; }
.ic3-editor-tabbar {
display: flex;
background: #252526;
border-bottom: 1px solid #1e1e1e;
}
.ic3-editor-tab {
font-family: var(--mono-font);
font-size: 0.74rem;
color: #8b8b8b;
padding: 0.55rem 1.1rem;
border-right: 1px solid #1e1e1e;
display: flex;
align-items: center;
gap: 0.4rem;
transition: opacity 0.3s ease, color 0.2s;
white-space: nowrap;
}
.ic3-editor-tab.is-active {
background: #1e1e1e;
color: #ffffff;
border-top: 2px solid var(--accent);
margin-top: -1px;
}
.ic3-editor-tab.is-new { opacity: 0; }
.ic3-editor-tab.is-new.is-shown { opacity: 1; }
.ic3-editor-tab .dot {
width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0;
}
.ic3-editor-tab[data-lang="html"] .dot { background: #e34c26; }
.ic3-editor-tab[data-lang="css"] .dot { background: var(--accent); }
.ic3-code-panel {
background: #1e1e1e;
padding: 1rem 1.25rem;
font-family: var(--mono-font);
font-size: 0.8rem;
line-height: 1.9;
color: #cfc8b8;
min-height: 175px;
overflow-x: auto;
white-space: pre;
}
.ic3-code-panel .hl {
color: #7da6ff;
font-weight: 700;
background: rgba(37,99,235,0.15);
padding: 0.05rem 0.2rem;
border-radius: 2px;
}
.ic3-code-panel .tag { color: #e8e3d8; }
.ic3-code-panel .attr { color: #9cdcfe; }
.ic3-code-panel .str { color: #ce9178; }
.ic3-code-panel .prop { color: #9cdcfe; }
.ic3-code-panel .val { color: #ce9178; }
.ic3-code-panel .sel { color: #d7ba7d; }
.ic3-code-panel .punct { color: #808080; }
/* Preview = live styled result */
.ic3-preview-label {
font-family: var(--mono-font);
font-size: 0.72rem;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--ink-soft);
margin: 1.25rem 0 0.5rem;
display: block;
}
.ic3-preview {
border: 1px solid var(--line);
border-top: 3px solid var(--accent);
background: var(--paper-alt);
padding: 1.5rem;
display: flex;
align-items: center;
justify-content: center;
min-height: 90px;
transition: background 0.2s ease, border-color 0.2s ease;
}
.ic3-preview-box {
font-size: 1rem;
padding: 0.6rem 1.2rem;
border-radius: 4px;
transition: color 0.3s ease, background 0.3s ease, border-radius 0.3s ease, font-weight 0.3s ease;
color: var(--ink);
background: transparent;
}
@media (prefers-reduced-motion: reduce) {
.ic3-preview-box, .ic3-tree-item, .ic3-editor-tab { transition: none !important; }
}
@media (max-width: 560px) {
.ic3-tabs { flex-direction: column; }
.ic3-tab { border-right: none; border-bottom: 1px solid var(--line); }
.ic3-tab:last-child { border-bottom: none; }
.ic3-editor { grid-template-columns: 120px 1fr; }
.ic3-sidebar-title, .ic3-tree-folder { padding-left: 0.6rem; }
.ic3-tree-item { padding-left: 1.2rem; padding-right: 0.4rem; }
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Fraunces:wght@700&family=Inter:wght@400;500&family=IBM+Plex+Mono:wght@500;700&display=swap" rel="stylesheet">
<p class="ic3-sub">Click a tab to see where the style lives — and watch the box below change.</p>
<div class="ic3-tabs" id="ic3Tabs">
<button class="ic3-tab" data-mode="inline">inline</button>
<button class="ic3-tab" data-mode="internal">internal</button>
<button class="ic3-tab" data-mode="external">external</button>
</div>
<div class="ic3-editor">
<div class="ic3-sidebar">
<div class="ic3-sidebar-title">explorer</div>
<div class="ic3-tree-folder">📁 project</div>
<div class="ic3-tree-item is-active" data-file="html" id="ic3TreeHtml">
<span class="dot"></span> index.html
</div>
<div class="ic3-tree-item is-new" data-file="css" id="ic3TreeCss">
<span class="dot"></span> style.css
</div>
</div>
<div class="ic3-editor-main">
<div class="ic3-editor-tabbar">
<div class="ic3-editor-tab is-active" data-lang="html" id="ic3TabHtml">
<span class="dot"></span> index.html
</div>
<div class="ic3-editor-tab is-new" data-lang="css" id="ic3TabCss">
<span class="dot"></span> style.css
</div>
</div>
<div class="ic3-code-panel" id="ic3Code"></div>
</div>
</div>
<span class="ic3-preview-label">preview</span>
<div class="ic3-preview">
<p class="ic3-preview-box" id="ic3PreviewBox">Hello World</p>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-css3')
|| document.querySelector('.infographic-css3');
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 tabs = document.querySelectorAll('#ic3Tabs .ic3-tab');
const codePanel = document.getElementById('ic3Code');
const previewBox = document.getElementById('ic3PreviewBox');
const treeHtml = document.getElementById('ic3TreeHtml');
const treeCss = document.getElementById('ic3TreeCss');
const tabHtml = document.getElementById('ic3TabHtml');
const tabCss = document.getElementById('ic3TabCss');
const htmlCode = {
inline: `<span class="punct"><</span><span class="tag">p</span> <span class="attr">style</span><span class="punct">=</span><span class="hl str">"color: blue; font-weight: bold;"</span><span class="punct">></span>\n Hello World\n<span class="punct"></</span><span class="tag">p</span><span class="punct">></span>`,
internal: `<span class="punct"><</span><span class="tag">head</span><span class="punct">></span>\n <span class="punct"><</span><span class="tag">style</span><span class="punct">></span>\n <span class="hl sel">p</span> <span class="punct">{</span>\n <span class="prop">color</span><span class="punct">:</span> <span class="val">white</span><span class="punct">;</span>\n <span class="prop">background</span><span class="punct">:</span> <span class="val">#2563eb</span><span class="punct">;</span>\n <span class="prop">border-radius</span><span class="punct">:</span> <span class="val">6px</span><span class="punct">;</span>\n <span class="punct">}</span>\n <span class="punct"></</span><span class="tag">style</span><span class="punct">></span>\n<span class="punct"></</span><span class="tag">head</span><span class="punct">></span>\n<span class="punct"><</span><span class="tag">body</span><span class="punct">></span>\n <span class="punct"><</span><span class="tag">p</span><span class="punct">></span>Hello World<span class="punct"></</span><span class="tag">p</span><span class="punct">></span>\n<span class="punct"></</span><span class="tag">body</span><span class="punct">></span>`,
external: `<span class="punct"><</span><span class="tag">head</span><span class="punct">></span>\n <span class="punct"><</span><span class="tag">link</span> <span class="attr">rel</span><span class="punct">=</span><span class="str">"stylesheet"</span> <span class="attr">href</span><span class="punct">=</span><span class="hl str">"style.css"</span><span class="punct">></span>\n<span class="punct"></</span><span class="tag">head</span><span class="punct">></span>\n<span class="punct"><</span><span class="tag">body</span><span class="punct">></span>\n <span class="punct"><</span><span class="tag">p</span><span class="punct">></span>Hello World<span class="punct"></</span><span class="tag">p</span><span class="punct">></span>\n<span class="punct"></</span><span class="tag">body</span><span class="punct">></span>`
};
const cssCode = `<span class="sel">p</span> <span class="punct">{</span>\n <span class="prop">color</span><span class="punct">:</span> <span class="val">#2563eb</span><span class="punct">;</span>\n <span class="prop">border</span><span class="punct">:</span> <span class="val">2px dashed #2563eb</span><span class="punct">;</span>\n <span class="prop">border-radius</span><span class="punct">:</span> <span class="val">6px</span><span class="punct">;</span>\n<span class="punct">}</span>`;
const modes = {
inline: {
preview: { color: '#2563eb', fontWeight: '700', background: 'transparent', borderRadius: '0px', border: 'none' },
hasCssFile: false,
activeFile: 'html'
},
internal: {
preview: { color: '#ffffff', fontWeight: '400', background: '#2563eb', borderRadius: '6px', border: 'none' },
hasCssFile: false,
activeFile: 'html'
},
external: {
preview: { color: '#2563eb', fontWeight: '400', background: 'transparent', borderRadius: '6px', border: '2px dashed #2563eb' },
hasCssFile: true,
activeFile: 'css'
}
};
function showFile(fileName) {
const isCss = fileName === 'css';
codePanel.innerHTML = isCss ? cssCode : htmlCode[currentMode];
treeHtml.classList.toggle('is-active', !isCss);
treeCss.classList.toggle('is-active', isCss);
tabHtml.classList.toggle('is-active', !isCss);
tabCss.classList.toggle('is-active', isCss);
}
let currentMode = 'inline';
function applyMode(name) {
currentMode = name;
const mode = modes[name];
tabs.forEach(t => t.classList.toggle('is-active', t.dataset.mode === name));
treeCss.classList.toggle('is-shown', mode.hasCssFile);
tabCss.classList.toggle('is-shown', mode.hasCssFile);
showFile(mode.activeFile);
previewBox.style.color = mode.preview.color;
previewBox.style.fontWeight = mode.preview.fontWeight;
previewBox.style.background = mode.preview.background;
previewBox.style.borderRadius = mode.preview.borderRadius;
previewBox.style.border = mode.preview.border;
}
tabs.forEach(tab => {
tab.addEventListener('click', () => applyMode(tab.dataset.mode));
});
treeHtml.addEventListener('click', () => showFile('html'));
treeCss.addEventListener('click', () => { if (modes[currentMode].hasCssFile) showFile('css'); });
tabHtml.addEventListener('click', () => showFile('html'));
tabCss.addEventListener('click', () => { if (modes[currentMode].hasCssFile) showFile('css'); });
applyMode('inline');
})();
</script>
</div>.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!');
});1️⃣ Inline CSS
Written directly inside the HTML tag
Good for quick, one-time styling
Not ideal for bigger projects
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Inline CSS Anatomy</title>
<style>
.infographic-inlinecss {
--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-inlinecss[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.ha-layout { display: flex; flex-direction: column; gap: 1.5rem; }
.ha-code {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
padding: 1rem 0.9rem;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.8rem;
line-height: 1.85;
overflow-x: auto;
}
@media (max-width: 480px) {
.ha-code {
padding-right: 2rem;
}
}
.ha-line {
display: block;
white-space: pre;
color: #8a8a8a;
border-radius: 5px;
padding: 0.05rem 0.4rem;
}
.ha-line.ha-clickable {
cursor: pointer;
color: #e5e5e5;
transition: background 0.15s ease, box-shadow 0.15s ease;
}
.ha-line.ha-clickable:hover { background: #1c2333; }
.ha-line.ha-active {
background: #1c2333;
box-shadow: inset 3px 0 0 #5b8def;
color: #ffffff;
}
.ha-tag { color: #60a5fa; font-weight: 700; }
.ha-attr { color: #f2b96b; }
.ha-str { color: #9ece6a; }
.ha-style-attr { color: #f472b6; font-weight: 700; }
.ha-style-val { color: #f9a8d4; }
.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-out-h1 {
font-size: 1.4rem;
font-weight: 700;
margin: 0 0 0.6rem;
padding: 0.1rem 0.3rem;
margin-left: -0.3rem;
border-radius: 6px;
transition: background 0.2s ease, outline 0.2s ease;
}
.ha-out-p {
color: blue;
font-size: 1.05rem;
margin: 0;
padding: 0.1rem 0.3rem;
margin-left: -0.3rem;
border-radius: 6px;
transition: background 0.2s ease, outline 0.2s ease;
}
.ha-out-lit {
background: var(--accent-soft);
outline: 2px solid var(--accent);
}
</style>
</head>
<body>
<div class="infographic-inlinecss" id="ha-root">
<div class="ha-inner">
<div class="ha-layout">
<div class="ha-code">
<span class="ha-line"><<span class="ha-tag">body</span>></span>
<span class="ha-line ha-clickable" data-part="h1"> <<span class="ha-tag">h1</span>>Inline CSS Example</<span class="ha-tag">h1</span>></span>
<span class="ha-line ha-clickable ha-active" data-part="p" id="line-p"> <<span class="ha-tag">p</span> <span class="ha-style-attr">style</span>=<span class="ha-str">"<span class="ha-style-val">color: blue; font-size: 18px</span>"</span>>This is inline styled text.</<span class="ha-tag">p</span>></span>
<span class="ha-line"></<span class="ha-tag">body</span>></span>
</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">🌐 Inline CSS Example</div>
</div>
<div class="ha-urlrow">127.0.0.1:5500/basicstructure.html</div>
<div class="ha-screen">
<h1 class="ha-out-h1" id="out-h1">Inline CSS Example</h1>
<p class="ha-out-p ha-out-lit" id="out-p">This is inline styled text.</p>
</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 outMap = { h1: 'out-h1', p: 'out-p' };
const lines = document.querySelectorAll('.ha-line.ha-clickable');
lines.forEach(line => {
line.addEventListener('click', () => {
const part = line.getAttribute('data-part');
document.querySelectorAll('.ha-line').forEach(l => {
l.classList.toggle('ha-active', l.getAttribute('data-part') === part);
});
document.getElementById('out-h1').classList.remove('ha-out-lit');
document.getElementById('out-p').classList.remove('ha-out-lit');
document.getElementById(outMap[part]).classList.add('ha-out-lit');
});
});
})();
</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!');
});🟡 Use it only when you want to style one specific element quickly.
2️⃣ Internal CSS
CSS is written in a <style> tag
Goes inside the <head> section of your HTML file
Great for small pages or when testing styles
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Internal CSS Anatomy</title>
<style>
.infographic-internalcss {
--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-internalcss[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.ha-layout { display: flex; flex-direction: column; gap: 1.5rem; }
.ha-code {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
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;
}
.ha-line {
display: block;
white-space: pre;
color: #8a8a8a;
border-radius: 5px;
padding: 0.05rem 0.4rem;
}
.ha-line.ha-clickable {
cursor: pointer;
color: #e5e5e5;
transition: background 0.15s ease, box-shadow 0.15s ease;
}
.ha-line.ha-clickable:hover { background: #1c2333; }
.ha-line.ha-active {
background: #1c2333;
box-shadow: inset 3px 0 0 #5b8def;
color: #ffffff;
}
.ha-tag { color: #60a5fa; font-weight: 700; }
.ha-style-tag { color: #f472b6; font-weight: 700; }
.ha-sel { color: #f9a8d4; font-weight: 700; }
.ha-prop { color: #c586c0; }
.ha-val { color: #ce9178; }
.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;
}
.ha-out-h1 {
font-family: Georgia, "Times New Roman", serif;
color: darkgreen;
font-size: 1.7rem;
font-weight: 700;
margin: 0 0 0.6rem;
padding: 0.1rem 0.3rem;
margin-left: -0.3rem;
border-radius: 6px;
transition: background 0.2s ease, outline 0.2s ease;
}
.ha-out-p {
font-family: Arial, sans-serif;
font-size: 0.95rem;
margin: 0;
padding: 0.1rem 0.3rem;
margin-left: -0.3rem;
border-radius: 6px;
transition: background 0.2s ease, outline 0.2s ease;
}
.ha-out-lit {
background: var(--accent-soft);
outline: 2px solid var(--accent);
}
</style>
</head>
<body>
<div class="infographic-internalcss" id="ha-root">
<div class="ha-inner">
<div class="ha-layout">
<div class="ha-code">
<span class="ha-line"><<span class="ha-tag">html</span>></span>
<span class="ha-line"> <<span class="ha-tag">head</span>></span>
<span class="ha-line ha-clickable ha-active" data-part="style"> <<span class="ha-style-tag">style</span>></span>
<span class="ha-line ha-clickable ha-active" data-part="style"> <span class="ha-sel">h1</span> {</span>
<span class="ha-line ha-clickable ha-active" data-part="style"> <span class="ha-prop">color</span>: <span class="ha-val">darkgreen</span>;</span>
<span class="ha-line ha-clickable ha-active" data-part="style"> <span class="ha-prop">font-size</span>: <span class="ha-val">36px</span>;</span>
<span class="ha-line ha-clickable ha-active" data-part="style"> }</span>
<span class="ha-line ha-clickable ha-active" data-part="style"> <span class="ha-sel">p</span> {</span>
<span class="ha-line ha-clickable ha-active" data-part="style"> <span class="ha-prop">font-family</span>: <span class="ha-val">Arial</span>;</span>
<span class="ha-line ha-clickable ha-active" data-part="style"> }</span>
<span class="ha-line ha-clickable ha-active" data-part="style"> </<span class="ha-style-tag">style</span>></span>
<span class="ha-line"> </<span class="ha-tag">head</span>></span>
<span class="ha-line ha-clickable" data-part="style"> <<span class="ha-tag">body</span>></span>
<span class="ha-line ha-clickable" data-part="h1body"> <<span class="ha-tag">h1</span>>Welcome</<span class="ha-tag">h1</span>></span>
<span class="ha-line ha-clickable" data-part="pbody"> <<span class="ha-tag">p</span>>This is a paragraph.</<span class="ha-tag">p</span>></span>
<span class="ha-line"> </<span class="ha-tag">body</span>></span>
<span class="ha-line"></<span class="ha-tag">html</span>></span>
</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">🌐 127.0.0.1:5500/basicstructure.htm</div>
</div>
<div class="ha-urlrow">127.0.0.1:5500/basicstructure.html</div>
<div class="ha-screen">
<h1 class="ha-out-h1 ha-out-lit" id="out-h1">Welcome</h1>
<p class="ha-out-p ha-out-lit" id="out-p">This is a paragraph.</p>
</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 outMap = { style: ['out-h1', 'out-p'], h1body: ['out-h1'], pbody: ['out-p'] };
const lines = document.querySelectorAll('.ha-line.ha-clickable');
lines.forEach(line => {
line.addEventListener('click', () => {
const part = line.getAttribute('data-part');
document.querySelectorAll('.ha-line').forEach(l => {
l.classList.toggle('ha-active', l.getAttribute('data-part') === part);
});
document.getElementById('out-h1').classList.remove('ha-out-lit');
document.getElementById('out-p').classList.remove('ha-out-lit');
outMap[part].forEach(id => document.getElementById(id).classList.add('ha-out-lit'));
});
});
})();
</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!');
});🟢 Handy when working with just one HTML file.
3️⃣ External CSS
Best practice for most real projects
You write your styles in a separate .css file
Link it to your HTML using <link> in the <head>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>External CSS Anatomy</title>
<style>
.infographic-externalcss {
--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-externalcss[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.ha-layout { display: flex; flex-direction: column; gap: 1.5rem; }
.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.8rem;
line-height: 1.85;
overflow-x: auto;
}
.ha-codepane { display: none; }
.ha-codepane.ha-pane-on { display: block; }
.ha-line {
display: block;
white-space: pre;
color: #8a8a8a;
border-radius: 5px;
padding: 0.05rem 0.4rem;
}
.ha-line.ha-clickable {
cursor: pointer;
color: #e5e5e5;
transition: background 0.15s ease, box-shadow 0.15s ease;
}
.ha-line.ha-clickable:hover { background: #1c2333; }
.ha-line.ha-active {
background: #1c2333;
box-shadow: inset 3px 0 0 #5b8def;
color: #ffffff;
}
.ha-tag { color: #60a5fa; font-weight: 700; }
.ha-attr { color: #f2b96b; }
.ha-str { color: #9ece6a; }
.ha-comment { color: #5c6370; font-style: italic; }
.ha-sel { color: #f9a8d4; font-weight: 700; }
.ha-prop { color: #c586c0; }
.ha-val { color: #ce9178; }
.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: #f0f0f0;
color: #111;
padding: 1.3rem 1.4rem 1.6rem;
transition: background 0.2s ease;
border-radius: 6px;
}
.ha-out-h2 {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
color: crimson;
font-weight: 800;
font-size: 1.4rem;
margin: 0 0 0.6rem;
padding: 0.1rem 0.3rem;
margin-left: -0.3rem;
border-radius: 6px;
transition: background 0.2s ease, outline 0.2s ease;
}
.ha-out-p {
font-family: Verdana, sans-serif;
font-size: 0.85rem;
margin: 0;
padding: 0.1rem 0.3rem;
margin-left: -0.3rem;
border-radius: 6px;
transition: background 0.2s ease, outline 0.2s ease;
}
.ha-out-lit {
background: var(--accent-soft);
outline: 2px solid var(--accent);
}
.ha-screen.ha-out-lit {
outline: 2px solid var(--accent);
}
</style>
</head>
<body>
<div class="infographic-externalcss" 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">html</span> <span class="ha-attr">lang</span>=<span class="ha-str">"en"</span>></span>
<span class="ha-line"> <<span class="ha-tag">head</span>></span>
<span class="ha-line"> <<span class="ha-tag">title</span>>External CSS Example</<span class="ha-tag">title</span>></span>
<span class="ha-line ha-clickable" data-part="link"> <<span class="ha-tag">link</span> <span class="ha-attr">rel</span>=<span class="ha-str">"stylesheet"</span> <span class="ha-attr">href</span>=<span class="ha-str">"style.css"</span> /></span>
<span class="ha-line"> </<span class="ha-tag">head</span>></span>
<span class="ha-line"> <<span class="ha-tag">body</span>></span>
<span class="ha-line ha-clickable" data-part="h2"> <<span class="ha-tag">h2</span>>This is a heading</<span class="ha-tag">h2</span>></span>
<span class="ha-line ha-clickable" data-part="p"> <<span class="ha-tag">p</span>>This paragraph uses styles from the external CSS file.</<span class="ha-tag">p</span>></span>
<span class="ha-line"> </<span class="ha-tag">body</span>></span>
<span class="ha-line"></<span class="ha-tag">html</span>></span>
</div>
<div class="ha-codepane" id="pane-css">
<span class="ha-line ha-comment">/* style.css */</span>
<span class="ha-line"> </span>
<span class="ha-line ha-clickable" data-part="body"><span class="ha-sel">body</span> {</span>
<span class="ha-line ha-clickable" data-part="body"> <span class="ha-prop">background-color</span>: <span class="ha-val">#f0f0f0</span>;</span>
<span class="ha-line ha-clickable" data-part="body"> <span class="ha-prop">font-family</span>: <span class="ha-val">Verdana</span>;</span>
<span class="ha-line ha-clickable" data-part="body">}</span>
<span class="ha-line"> </span>
<span class="ha-line ha-clickable" data-part="h2"><span class="ha-sel">h2</span> {</span>
<span class="ha-line ha-clickable" data-part="h2"> <span class="ha-prop">color</span>: <span class="ha-val">crimson</span>;</span>
<span class="ha-line ha-clickable" data-part="h2">}</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">🌐 External CSS Example</div>
</div>
<div class="ha-urlrow">127.0.0.1:5500/basicstructure.html</div>
<div class="ha-screen" id="ha-screen">
<h2 class="ha-out-h2" id="out-h2">This is a heading</h2>
<p class="ha-out-p" id="out-p">This paragraph uses styles from the external CSS file.</p>
</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');
});
const screen = document.getElementById('ha-screen');
const outH2 = document.getElementById('out-h2');
const outP = document.getElementById('out-p');
function clearOutput() {
screen.classList.remove('ha-out-lit');
outH2.classList.remove('ha-out-lit');
outP.classList.remove('ha-out-lit');
}
document.querySelectorAll('.ha-line.ha-clickable').forEach(line => {
line.addEventListener('click', () => {
document.querySelectorAll('.ha-line').forEach(l => l.classList.remove('ha-active'));
line.classList.add('ha-active');
clearOutput();
const part = line.getAttribute('data-part');
if (part === 'h2') outH2.classList.add('ha-out-lit');
if (part === 'p') outP.classList.add('ha-out-lit');
if (part === 'body') screen.classList.add('ha-out-lit');
if (part === 'link') { screen.classList.add('ha-out-lit'); outH2.classList.add('ha-out-lit'); outP.classList.add('ha-out-lit'); }
});
});
})();
</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!');
});✅ Clean, reusable, and easier to manage when your project grows.
📌 Summary Table
Method | Where? | Best for |
|---|---|---|
Inline | Inside an HTML element | Quick fixes (not recommended long-term) |
Internal | <style> in <head> | Small or single-page sites |
External | Linked .css file | Larger projects, best practice ✅ |