🎨 Backgrounds & Borders
Backgrounds and borders are two of the fastest ways to add visual structure to a page — color a section, frame a card, soften its corners.
🌈 Backgrounds
Almost any element — text, a div, a section, even the whole page — can take a background.
Basic syntax:
selector {
background-color: lightblue;
}The core properties:
Property | What it does |
|---|---|
| Fills the element with a solid color |
| Places an image behind the content |
| Controls whether that image tiles |
| Controls how the image scales to fit |
Solid color example:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Body Background Anatomy</title>
<style>
.infographic-bodybg {
--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-bodybg[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-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: green;
color: #111;
padding: 1.2rem 1.4rem 3rem;
transition: box-shadow 0.2s ease;
}
.ha-screen.ha-lit { box-shadow: inset 0 0 0 3px var(--accent); }
.ha-out-h1 {
font-family: Georgia, "Times New Roman", serif;
font-weight: 700;
font-size: 1.25rem;
margin: 0 0 0.5rem;
color: #111;
}
.ha-out-p {
font-family: Georgia, "Times New Roman", serif;
font-size: 0.85rem;
margin: 0;
color: #111;
}
</style>
</head>
<body>
<div class="infographic-bodybg" 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">body</span>></span>
<span class="ha-line"> <<span class="ha-tag">h1</span>>Page with green background</<span class="ha-tag">h1</span>></span>
<span class="ha-line"> <<span class="ha-tag">p</span>>This page now has a green background color.</<span class="ha-tag">p</span>></span>
<span class="ha-line"></<span class="ha-tag">body</span>></span>
</div>
<div class="ha-codepane" id="pane-css">
<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">green</span>;</span>
<span class="ha-line ha-clickable" data-part="body">}</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">🌐 Body Background Color Example</div>
</div>
<div class="ha-urlrow">127.0.0.1:5500/basicstructure.html</div>
<div class="ha-screen" id="ha-screen">
<h1 class="ha-out-h1">Page with green background</h1>
<p class="ha-out-p">This page now has a green background color.</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');
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');
screen.classList.add('ha-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!');
});🚀 Try and Play Around
<div class="infographic-bgcolor">
<style>
.infographic-bgcolor {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #faf8f4;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--code-bg: #1a1a1a;
--code-text: #f0ece4;
--mono-font: 'IBM Plex Mono', monospace;
--body-font: 'Inter', sans-serif;
color: var(--ink);
font-family: var(--body-font);
max-width: 700px;
margin: 0 auto;
box-sizing: border-box;
background: transparent;
}
.infographic-bgcolor[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--code-bg: #1a1a22;
--code-text: #e8e3d8;
}
.infographic-bgcolor *, .infographic-bgcolor *::before, .infographic-bgcolor *::after {
box-sizing: border-box;
}
.bg-picker { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-bottom: 1.5rem; }
.bg-pill {
border: 1px solid var(--line);
background: var(--paper);
padding: 0.5rem 1rem;
font-size: 0.88rem;
font-family: var(--body-font);
cursor: pointer;
color: var(--ink);
transition: background 0.15s, border-color 0.15s, color 0.15s;
}
.bg-pill.is-active { background: var(--accent-soft); border-color: var(--accent); color: var(--accent); font-weight: 600; }
.bg-stage {
border: 1px solid var(--line);
height: 160px;
margin-bottom: 1.25rem;
background-color: lightblue;
transition: background-color 0.15s, border-color 0.2s ease;
}
.bg-code {
font-family: var(--mono-font);
font-size: 0.9rem;
background: var(--code-bg);
color: var(--code-text);
padding: 0.9rem 1.1rem;
transition: background 0.2s ease, color 0.2s ease;
}
.bg-code .tok-prop { color: #7ec4ff; }
.bg-code .tok-val { color: #ffd479; }
@media (prefers-reduced-motion: reduce) {
.infographic-bgcolor *, .infographic-bgcolor *::before, .infographic-bgcolor *::after {
animation-duration: 0.001ms !important;
transition-duration: 0.001ms !important;
}
}
</style>
<div class="bg-picker">
<button class="bg-pill is-active" data-color="lightblue">lightblue</button>
<button class="bg-pill" data-color="tomato">tomato</button>
<button class="bg-pill" data-color="gold">gold</button>
<button class="bg-pill" data-color="mediumseagreen">mediumseagreen</button>
<button class="bg-pill" data-color="plum">plum</button>
<button class="bg-pill" data-color="#1a1a1a">#1a1a1a</button>
</div>
<div class="bg-stage" id="bg-stage"></div>
<div class="bg-code">
<span class="tok-prop">background-color</span>: <span class="tok-val" id="bg-code-val">lightblue</span>;
</div>
</div>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-bgcolor')
|| document.querySelector('.infographic-bgcolor');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
(function() {
var scripts = document.getElementsByTagName('script');
var thisScript = scripts[scripts.length - 1];
var root = thisScript.closest ? thisScript.closest('.infographic-bgcolor')
: document.querySelector('.infographic-bgcolor');
if (!root) root = document.querySelector('.infographic-bgcolor');
var pills = root.querySelectorAll('.bg-pill');
var stage = root.querySelector('#bg-stage');
var codeVal = root.querySelector('#bg-code-val');
pills.forEach(function(pill) {
pill.addEventListener('click', function() {
pills.forEach(function(p) { p.classList.remove('is-active'); });
pill.classList.add('is-active');
var color = pill.dataset.color;
stage.style.backgroundColor = color;
codeVal.textContent = color;
});
});
})();
</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!');
});Image background:
💡 You can use an image from your local project folder (e.g. url("images/photo.jpg")) or paste a direct image link copied from the web (e.g. url("https://example.com/photo.jpg")).
no-repeat stops the image from tiling, and cover scales it to fill the element without distorting it.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Background Image Anatomy</title>
<style>
.infographic-bgimage {
--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-bgimage[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.78rem;
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-sel { color: #f9a8d4; font-weight: 700; }
.ha-prop { color: #c586c0; }
.ha-val { color: #ce9178; }
.ha-str { color: #9ece6a; }
.ha-comment { color: #5c6370; font-style: italic; }
.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-color: #ffffff;
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 300"><rect width="500" height="300" fill="%23fdf3d3"/><path d="M-20,20 C50,70 80,0 150,35 C210,65 235,10 300,30 C360,50 375,105 445,80 C495,62 510,115 550,90" stroke="%23a9cff0" stroke-width="34" fill="none"/><path d="M-20,90 C40,140 90,80 160,115 C220,145 245,80 310,105 C370,130 385,180 455,155 C500,138 515,190 550,165" stroke="%23a9cff0" stroke-width="34" fill="none"/><path d="M-20,160 C40,205 90,150 160,185 C225,215 250,150 320,175 C380,200 395,245 460,225 C500,210 515,250 550,235" stroke="%23a9cff0" stroke-width="34" fill="none"/><path d="M-20,235 C40,270 90,225 160,255 C225,280 250,225 320,250 C380,272 395,300 460,285" stroke="%23a9cff0" stroke-width="34" fill="none"/><path d="M-20,-40 C30,0 65,-45 125,-15 C180,10 205,-40 265,-20 C320,0 335,45 400,25 C445,10 465,55 550,25" stroke="%23a9cff0" stroke-width="34" fill="none"/></svg>');
background-repeat: no-repeat;
background-size: auto;
color: #111;
padding: 0.9rem 1rem;
height: 210px;
position: relative;
box-sizing: border-box;
transition: box-shadow 0.2s ease;
}
.ha-screen.ha-lit { box-shadow: inset 0 0 0 3px var(--accent); }
.ha-out-h1, .ha-out-p {
font-family: Georgia, "Times New Roman", serif;
font-size: 0.9rem;
margin: 0 0 0.5rem;
position: relative;
z-index: 1;
}
</style>
</head>
<body>
<div class="infographic-bgimage" 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">body</span>></span>
<span class="ha-line"> <<span class="ha-tag">div</span>>Hello World</<span class="ha-tag">div</span>></span>
<span class="ha-line"> <<span class="ha-tag">p</span>>Hope you all are learning properly and having fun</<span class="ha-tag">p</span>></span>
<span class="ha-line"></<span class="ha-tag">body</span>></span>
</div>
<div class="ha-codepane" id="pane-css">
<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-image</span>: <span class="ha-val">url</span>(<span class="ha-str">"yourImage.png"</span>);</span>
<span class="ha-line ha-clickable" data-part="body"> <span class="ha-prop">background-repeat</span>: <span class="ha-val">no-repeat</span>;</span>
<span class="ha-line ha-comment"> /* background-size: cover; */</span>
<span class="ha-line ha-clickable" data-part="body"> <span class="ha-prop">height</span>: <span class="ha-val">300px</span>;</span>
<span class="ha-line ha-clickable" data-part="body">}</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">🌐 127.0.0.1:5500/index.html</div>
</div>
<div class="ha-urlrow">127.0.0.1:5500/index.html</div>
<div class="ha-screen" id="ha-screen">
<div class="ha-out-h1">Hello World</div>
<p class="ha-out-p">Hope you all are learning properly and having fun</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');
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');
screen.classList.add('ha-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!');
});🚀 Try and Play Around
<div class="infographic-bgimage">
<style>
.infographic-bgimage {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #faf8f4;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--code-bg: #1a1a1a;
--code-text: #f0ece4;
--mono-font: 'IBM Plex Mono', monospace;
--body-font: 'Inter', sans-serif;
color: var(--ink);
font-family: var(--body-font);
max-width: 700px;
margin: 0 auto;
box-sizing: border-box;
background: transparent;
}
.infographic-bgimage[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--code-bg: #1a1a22;
--code-text: #e8e3d8;
}
.infographic-bgimage *, .infographic-bgimage *::before, .infographic-bgimage *::after {
box-sizing: border-box;
}
.bi-group { margin-bottom: 1.25rem; }
.bi-group-label {
font-size: 0.78rem;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--ink-soft);
margin-bottom: 0.5rem;
font-family: var(--mono-font);
}
.bi-picker { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.bi-pill {
border: 1px solid var(--line);
background: var(--paper);
padding: 0.5rem 0.9rem;
font-size: 0.85rem;
font-family: var(--body-font);
cursor: pointer;
color: var(--ink);
transition: background 0.15s, border-color 0.15s, color 0.15s;
}
.bi-pill.is-active { background: var(--accent-soft); border-color: var(--accent); color: var(--accent); font-weight: 600; }
.bi-stage {
border: 1px solid var(--line);
height: 220px;
margin: 1.5rem 0 1.25rem;
background-color: var(--paper-alt);
transition: background-color 0.2s ease, border-color 0.2s ease;
}
.bi-code {
font-family: var(--mono-font);
font-size: 0.88rem;
background: var(--code-bg);
color: var(--code-text);
padding: 0.9rem 1.1rem;
line-height: 1.6;
transition: background 0.2s ease, color 0.2s ease;
}
.bi-code .tok-sel { color: var(--code-text); }
.bi-code .tok-prop { color: #7ec4ff; }
.bi-code .tok-val { color: #ffd479; }
@media (prefers-reduced-motion: reduce) {
.infographic-bgimage *, .infographic-bgimage *::before, .infographic-bgimage *::after {
animation-duration: 0.001ms !important;
transition-duration: 0.001ms !important;
}
}
</style>
<div class="bi-group">
<div class="bi-group-label">background-image</div>
<div class="bi-picker">
<button class="bi-pill is-active" data-prop="image" data-val="mountains">Mountains</button>
<button class="bi-pill" data-prop="image" data-val="forest">Forest</button>
<button class="bi-pill" data-prop="image" data-val="none">none</button>
</div>
</div>
<div class="bi-group">
<div class="bi-group-label">background-repeat</div>
<div class="bi-picker">
<button class="bi-pill" data-prop="repeat" data-val="repeat">repeat</button>
<button class="bi-pill is-active" data-prop="repeat" data-val="no-repeat">no-repeat</button>
<button class="bi-pill" data-prop="repeat" data-val="repeat-x">repeat-x</button>
<button class="bi-pill" data-prop="repeat" data-val="repeat-y">repeat-y</button>
</div>
</div>
<div class="bi-group">
<div class="bi-group-label">background-size</div>
<div class="bi-picker">
<button class="bi-pill" data-prop="size" data-val="auto">auto</button>
<button class="bi-pill is-active" data-prop="size" data-val="cover">cover</button>
<button class="bi-pill" data-prop="size" data-val="contain">contain</button>
<button class="bi-pill" data-prop="size" data-val="100px">100px</button>
</div>
</div>
<div class="bi-stage" id="bi-stage"></div>
<div class="bi-code">
<span class="tok-sel">div {</span><br>
<span class="tok-prop">background-image</span>: <span class="tok-val" id="bi-val-image">url('mountains.jpg')</span>;<br>
<span class="tok-prop">background-repeat</span>: <span class="tok-val" id="bi-val-repeat">no-repeat</span>;<br>
<span class="tok-prop">background-size</span>: <span class="tok-val" id="bi-val-size">cover</span>;<br>
<span class="tok-prop">height</span>: <span class="tok-val" id="bi-val-height">300px</span>;<br>
<span class="tok-sel">}</span>
</div>
</div>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-bgimage')
|| document.querySelector('.infographic-bgimage');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
(function() {
var scripts = document.getElementsByTagName('script');
var thisScript = scripts[scripts.length - 1];
var root = thisScript.closest ? thisScript.closest('.infographic-bgimage')
: document.querySelector('.infographic-bgimage');
if (!root) root = document.querySelector('.infographic-bgimage');
var pills = root.querySelectorAll('.bi-pill');
var stage = root.querySelector('#bi-stage');
var valImage = root.querySelector('#bi-val-image');
var valRepeat = root.querySelector('#bi-val-repeat');
var valSize = root.querySelector('#bi-val-size');
var mountainsSvg = '<svg xmlns="http://www.w3.org/2000/svg" width="300" height="200" viewBox="0 0 300 200">' +
'<rect width="300" height="200" fill="#bcdcf2"/>' +
'<circle cx="240" cy="40" r="22" fill="#fff3b0"/>' +
'<polygon points="0,200 70,80 130,200" fill="#76a5c4"/>' +
'<polygon points="60,200 150,60 240,200" fill="#5a89ab"/>' +
'<polygon points="170,200 230,100 300,200" fill="#7fb0d6"/>' +
'<polygon points="70,80 130,200 95,200 60,110" fill="#eef5fb"/>' +
'<polygon points="150,60 240,200 195,200 130,110" fill="#eef5fb"/>' +
'</svg>';
var forestSvg = '<svg xmlns="http://www.w3.org/2000/svg" width="300" height="200" viewBox="0 0 300 200">' +
'<rect width="300" height="200" fill="#cfe8d6"/>' +
'<rect y="170" width="300" height="30" fill="#7a9a6e"/>' +
'<polygon points="40,170 65,100 90,170" fill="#2f6e44"/>' +
'<polygon points="45,140 65,85 85,140" fill="#3a8252"/>' +
'<polygon points="110,170 140,80 170,170" fill="#286038"/>' +
'<polygon points="115,135 140,70 165,135" fill="#347a47"/>' +
'<polygon points="190,170 215,100 240,170" fill="#2f6e44"/>' +
'<polygon points="195,140 215,85 235,140" fill="#3a8252"/>' +
'<polygon points="250,170 275,110 300,170" fill="#286038"/>' +
'</svg>';
var images = {
mountains: { css: "url(\"data:image/svg+xml," + encodeURIComponent(mountainsSvg) + "\")", label: "url('mountains.svg')" },
forest: { css: "url(\"data:image/svg+xml," + encodeURIComponent(forestSvg) + "\")", label: "url('forest.svg')" },
none: { css: 'none', label: 'none' }
};
var state = {
image: images.mountains.css,
imageLabel: images.mountains.label,
repeat: 'no-repeat',
size: 'cover'
};
function render() {
stage.style.backgroundImage = state.image;
stage.style.backgroundRepeat = state.repeat;
stage.style.backgroundSize = state.size;
valImage.textContent = state.imageLabel;
valRepeat.textContent = state.repeat;
valSize.textContent = state.size;
}
pills.forEach(function(pill) {
pill.addEventListener('click', function() {
var group = pill.closest('.bi-group');
group.querySelectorAll('.bi-pill').forEach(function(p) { p.classList.remove('is-active'); });
pill.classList.add('is-active');
var prop = pill.dataset.prop;
var val = pill.dataset.val;
if (prop === 'image') {
state.image = images[val].css;
state.imageLabel = images[val].label;
} else if (prop === 'repeat') {
state.repeat = val;
} else if (prop === 'size') {
state.size = val;
}
render();
});
});
render();
})();
</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!');
});📦 Borders
Borders frame an element, giving it a visible edge and a clearer boundary from whatever's around it.
Basic syntax:
selector {
border: 2px solid black;
}That one line sets three things at once: 2px thickness, a solid line style, and black color.
Each piece can be set on its own:
Property | What it controls |
|---|---|
| How thick the border is — e.g. |
| The line style — |
| The border's color — e.g. |
| How rounded the corners are — e.g. |
🚀 Try and Play Around
<div class="infographic-border">
<style>
.infographic-border {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #faf8f4;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--code-bg: #1a1a1a;
--code-text: #f0ece4;
--mono-font: 'IBM Plex Mono', monospace;
--body-font: 'Inter', sans-serif;
color: var(--ink);
font-family: var(--body-font);
max-width: 700px;
margin: 0 auto;
box-sizing: border-box;
background: transparent;
}
.infographic-border[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--code-bg: #1a1a22;
--code-text: #e8e3d8;
}
.infographic-border *, .infographic-border *::before, .infographic-border *::after {
box-sizing: border-box;
}
.bd-group { margin-bottom: 1.1rem; }
.bd-group-label {
font-size: 0.78rem;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--ink-soft);
margin-bottom: 0.5rem;
font-family: var(--mono-font);
}
.bd-picker { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center; }
.bd-pill {
border: 1px solid var(--line);
background: var(--paper);
padding: 0.5rem 0.9rem;
font-size: 0.85rem;
font-family: var(--body-font);
cursor: pointer;
color: var(--ink);
transition: background 0.15s, border-color 0.15s, color 0.15s;
}
.bd-pill.is-active { background: var(--accent-soft); border-color: var(--accent); color: var(--accent); font-weight: 600; }
.bd-pill.bd-swatch {
width: 34px;
height: 34px;
padding: 0;
border-radius: 50%;
border: 2px solid var(--line);
}
.bd-pill.bd-swatch.is-active { border-color: var(--ink); box-shadow: 0 0 0 2px var(--paper), 0 0 0 4px var(--accent); }
.bd-range-row { display: flex; align-items: center; gap: 0.75rem; flex: 1; min-width: 180px; }
.bd-range-row input[type="range"] { flex: 1; accent-color: var(--accent); }
.bd-range-val { font-family: var(--mono-font); font-size: 0.82rem; color: var(--accent); min-width: 3.2em; }
.bd-stage {
border: 2px solid crimson;
border-radius: 8px;
height: 160px;
margin: 1.5rem 0 1.25rem;
background: var(--paper-alt);
transition: background 0.2s ease;
}
.bd-code {
font-family: var(--mono-font);
font-size: 0.88rem;
background: var(--code-bg);
color: var(--code-text);
padding: 0.9rem 1.1rem;
line-height: 1.6;
transition: background 0.2s ease, color 0.2s ease;
}
.bd-code .tok-sel { color: var(--code-text); }
.bd-code .tok-prop { color: #7ec4ff; }
.bd-code .tok-val { color: #ffd479; }
@media (prefers-reduced-motion: reduce) {
.infographic-border *, .infographic-border *::before, .infographic-border *::after {
animation-duration: 0.001ms !important;
transition-duration: 0.001ms !important;
}
}
</style>
<div class="bd-group">
<div class="bd-group-label">border (width · style · color)</div>
<div class="bd-picker">
<div class="bd-range-row">
<input type="range" id="bd-width" min="1" max="16" value="2">
<span class="bd-range-val" id="bd-width-val">2px</span>
</div>
</div>
<div class="bd-picker" style="margin-top: 0.6rem;">
<button class="bd-pill is-active" data-style="solid">solid</button>
<button class="bd-pill" data-style="dashed">dashed</button>
<button class="bd-pill" data-style="dotted">dotted</button>
<button class="bd-pill" data-style="double">double</button>
<button class="bd-pill" data-style="groove">groove</button>
</div>
<div class="bd-picker" style="margin-top: 0.6rem;">
<button class="bd-pill bd-swatch is-active" data-color="crimson" style="background: crimson;" title="crimson"></button>
<button class="bd-pill bd-swatch" data-color="#2563eb" style="background: #2563eb;" title="blue"></button>
<button class="bd-pill bd-swatch" data-color="goldenrod" style="background: goldenrod;" title="goldenrod"></button>
<button class="bd-pill bd-swatch" data-color="seagreen" style="background: seagreen;" title="seagreen"></button>
<button class="bd-pill bd-swatch" data-color="#1a1a1a" style="background: #1a1a1a;" title="black"></button>
</div>
</div>
<div class="bd-group">
<div class="bd-group-label">border-radius</div>
<div class="bd-picker">
<div class="bd-range-row">
<input type="range" id="bd-radius" min="0" max="80" value="8">
<span class="bd-range-val" id="bd-radius-val">8px</span>
</div>
</div>
</div>
<div class="bd-stage" id="bd-stage"></div>
<div class="bd-code">
<span class="tok-sel">div {</span><br>
<span class="tok-prop">border</span>: <span class="tok-val" id="bd-code-border">2px solid crimson</span>;<br>
<span class="tok-prop">border-radius</span>: <span class="tok-val" id="bd-code-radius">8px</span>;<br>
<span class="tok-sel">}</span>
</div>
</div>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-border')
|| document.querySelector('.infographic-border');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
(function() {
var scripts = document.getElementsByTagName('script');
var thisScript = scripts[scripts.length - 1];
var root = thisScript.closest ? thisScript.closest('.infographic-border')
: document.querySelector('.infographic-border');
if (!root) root = document.querySelector('.infographic-border');
var stage = root.querySelector('#bd-stage');
var widthRange = root.querySelector('#bd-width');
var widthVal = root.querySelector('#bd-width-val');
var radiusRange = root.querySelector('#bd-radius');
var radiusVal = root.querySelector('#bd-radius-val');
var stylePills = root.querySelectorAll('[data-style]');
var colorPills = root.querySelectorAll('[data-color]');
var codeBorder = root.querySelector('#bd-code-border');
var codeRadius = root.querySelector('#bd-code-radius');
var state = { width: 2, style: 'solid', color: 'crimson', radius: 8 };
function render() {
stage.style.borderWidth = state.width + 'px';
stage.style.borderStyle = state.style;
stage.style.borderColor = state.color;
stage.style.borderRadius = state.radius + 'px';
widthVal.textContent = state.width + 'px';
radiusVal.textContent = state.radius + 'px';
codeBorder.textContent = state.width + 'px ' + state.style + ' ' + state.color;
codeRadius.textContent = state.radius + 'px';
}
widthRange.addEventListener('input', function() {
state.width = Number(widthRange.value);
render();
});
radiusRange.addEventListener('input', function() {
state.radius = Number(radiusRange.value);
render();
});
stylePills.forEach(function(pill) {
pill.addEventListener('click', function() {
stylePills.forEach(function(p) { p.classList.remove('is-active'); });
pill.classList.add('is-active');
state.style = pill.dataset.style;
render();
});
});
colorPills.forEach(function(pill) {
pill.addEventListener('click', function() {
colorPills.forEach(function(p) { p.classList.remove('is-active'); });
pill.classList.add('is-active');
state.color = pill.dataset.color;
render();
});
});
render();
})();
</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!');
});💡 Example: Combine Background & Border
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Card Anatomy</title>
<style>
.infographic-card {
--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-card[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-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.3rem 1.4rem 1.6rem;
}
.ha-out-card {
background-color: #fffbe7;
border: 2px solid #ffcc00;
border-radius: 8px;
padding: 20px;
width: 220px;
box-sizing: border-box;
transition: box-shadow 0.2s ease;
}
.ha-out-card.ha-lit { box-shadow: 0 0 0 3px var(--accent-soft), inset 0 0 0 1px var(--accent); }
.ha-out-h1 {
font-family: Georgia, "Times New Roman", serif;
font-weight: 700;
font-size: 1.25rem;
margin: 0 0 0.6rem;
}
.ha-out-p {
font-family: Georgia, "Times New Roman", serif;
font-size: 0.85rem;
margin: 0;
line-height: 1.4;
}
</style>
</head>
<body>
<div class="infographic-card" 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">body</span>></span>
<span class="ha-line ha-clickable" data-part="card"> <<span class="ha-tag">div</span> <span class="ha-attr">class</span>=<span class="ha-str">"card"</span>></span>
<span class="ha-line ha-clickable" data-part="card"> <<span class="ha-tag">h1</span>>Card Title</<span class="ha-tag">h1</span>></span>
<span class="ha-line ha-clickable" data-part="card"> <<span class="ha-tag">p</span>>This is some card content with padding and a border</<span class="ha-tag">p</span>></span>
<span class="ha-line ha-clickable" data-part="card"> </<span class="ha-tag">div</span>></span>
<span class="ha-line"></<span class="ha-tag">body</span>></span>
</div>
<div class="ha-codepane" id="pane-css">
<span class="ha-line ha-clickable" data-part="card"><span class="ha-sel">.card</span> {</span>
<span class="ha-line ha-clickable" data-part="card"> <span class="ha-prop">background-color</span>: <span class="ha-val">#fffbe7</span>;</span>
<span class="ha-line ha-clickable" data-part="card"> <span class="ha-prop">border</span>: <span class="ha-val">2px solid #ffcc00</span>;</span>
<span class="ha-line ha-clickable" data-part="card"> <span class="ha-prop">border-radius</span>: <span class="ha-val">8px</span>;</span>
<span class="ha-line ha-clickable" data-part="card"> <span class="ha-prop">padding</span>: <span class="ha-val">20px</span>;</span>
<span class="ha-line ha-clickable" data-part="card"> <span class="ha-prop">width</span>: <span class="ha-val">300px</span>;</span>
<span class="ha-line ha-clickable" data-part="card">}</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">🌐 127.0.0.1:5500/index.html</div>
</div>
<div class="ha-urlrow">127.0.0.1:5500/index.html</div>
<div class="ha-screen">
<div class="ha-out-card" id="out-card">
<h1 class="ha-out-h1">Card Title</h1>
<p class="ha-out-p">This is some card content with padding and a border</p>
</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');
});
const card = document.getElementById('out-card');
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');
card.classList.add('ha-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!');
});This will create a soft yellow card with a golden border and rounded edges.
✅ Quick Recap
PROPERTY | what it does |
|---|---|
background-color | Sets the background color |
background-image | Adds an image behind the content |
border | Adds a frame around the element |
border-radius | Rounds the corners of the border |