Chapter 4: CSS Backgrounds, Borders & Outlines
Master background layering, image positioning, modern CSS gradients (linear, radial, conic), rounded corners, border-image masking, and outline accessibility standards.
4.1 CSS Background Properties & Image Controls
CSS provides a powerful suite of background properties to style element backdrops with solid colors, background images, or multiple layered images:
| Property | Syntax / Values | Description |
|---|---|---|
background-color |
#0f172a, rgba(...) |
Sets the background color of the element canvas. |
background-image |
url('hero.jpg') |
Sets one or more background images (separated by commas for multiple layers). |
background-repeat |
repeat, no-repeat, space, round |
Controls tiling behavior along X and Y axes. |
background-position |
center, top right, 50% 100% |
Sets the initial alignment position of the background image inside the container. |
background-size |
cover, contain, 100% auto |
cover scales image to completely cover container (clipping edges). contain scales image to fit fully without clipping. |
background-attachment |
scroll, fixed, local |
fixed creates a parallax effect where image remains static during page scrolling. |
Shorthand background Property
Combine background declarations into a single concise shorthand line:
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: system-ui, sans-serif; margin: 0; padding: 0; background: #0f172a; color: #f8fafc; }
/* background-color only */
.box-color {
background-color: #1e293b;
padding: 20px; margin: 12px; border-radius: 10px;
}
/* background-image with position and size */
.box-image {
background-image: url('https://picsum.photos/seed/css4/800/300');
background-repeat: no-repeat;
background-position: center;
background-size: cover;
height: 120px; margin: 12px; border-radius: 10px;
display: flex; align-items: flex-end; padding: 12px;
}
/* Shorthand: color image repeat position/size */
.box-shorthand {
background: #0f172a url('https://picsum.photos/seed/bg/800/200') no-repeat center / cover;
height: 100px; margin: 12px; border-radius: 10px;
display: flex; align-items: center; justify-content: center;
}
</style>
</head>
<body>
<div class="box-color">
<strong>background-color: #1e293b</strong>
<p style="margin:4px 0 0;font-size:13px;color:#94a3b8;">Solid colour background</p>
</div>
<div class="box-image">
<span style="background:rgba(0,0,0,0.6);padding:4px 10px;border-radius:6px;font-size:12px;">
background-image + no-repeat + center + cover
</span>
</div>
<div class="box-shorthand">
<span style="background:rgba(0,0,0,0.7);padding:6px 14px;border-radius:6px;font-size:13px;">
Shorthand: background: color url() repeat position / size
</span>
</div>
</body>
</html>
4.2 CSS Gradients (Linear, Radial & Conic)
Gradients are dynamically rendered color transitions created using CSS functions without requiring heavy image assets:
1. Linear Gradient
Transitions colors along a straight directional line or angle.
2. Radial Gradient
Radiates outward from a central focal point in a circle or ellipse.
3. Conic Gradient
Rotates colors around a center point (ideal for color wheels and pie charts).
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: system-ui, sans-serif; background: #0f172a; color: #f8fafc; padding: 24px; }
.grad-row { display: flex; flex-direction: column; gap: 14px; }
.grad-box {
height: 90px; border-radius: 10px;
display: flex; align-items: center; padding: 0 20px;
font-family: monospace; font-size: 13px; font-weight: 600; color: #fff;
}
h3 { margin-top: 0; color: #818cf8; }
</style>
</head>
<body>
<h3>CSS Gradients — Live Preview</h3>
<div class="grad-row">
<div class="grad-box" style="background: linear-gradient(135deg, #4f46e5, #06b6d4);">
linear-gradient(135deg, #4f46e5, #06b6d4)
</div>
<div class="grad-box" style="background: linear-gradient(to right, #f59e0b, #ef4444, #8b5cf6);">
linear-gradient(to right, #f59e0b, #ef4444, #8b5cf6) — multi-stop
</div>
<div class="grad-box" style="background: radial-gradient(circle at center, #38bdf8, #0f172a);">
radial-gradient(circle at center, #38bdf8, #0f172a)
</div>
<div class="grad-box" style="background: radial-gradient(ellipse at top left, #10b981, #1e293b);">
radial-gradient(ellipse at top left, #10b981, #1e293b)
</div>
<div class="grad-box" style="background: conic-gradient(from 0deg, #6366f1, #38bdf8, #34d399, #6366f1);">
conic-gradient(from 0deg, ...) — color wheel
</div>
</div>
</body>
</html>
4.3 CSS Borders, Border-Radius & Border-Image
Borders frame elements with solid, dashed, or gradient edges, while border-radius turns sharp rectangular corners into smooth rounded curves or pills:
1. Border Styles & Individual Sides
Borders accept width, style (solid, dashed, dotted, double), and color.
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: system-ui, sans-serif; background: #0f172a; color: #f8fafc; padding: 24px; }
.box { padding: 14px 18px; margin: 10px 0; border-radius: 8px; font-size: 13px; font-family: monospace; }
/* All-side borders */
.b-solid { border: 2px solid #6366f1; }
.b-dashed { border: 2px dashed #f59e0b; }
.b-dotted { border: 3px dotted #10b981; }
.b-double { border: 4px double #38bdf8; }
/* Individual side accents */
.b-left { border-left: 5px solid #ef4444; background: #1e293b; }
.b-top { border-top: 3px solid #8b5cf6; background: #1e293b; }
</style>
</head>
<body>
<h3 style="color:#6366f1;margin-top:0;">Border Styles</h3>
<div class="box b-solid">border: 2px solid #6366f1</div>
<div class="box b-dashed">border: 2px dashed #f59e0b</div>
<div class="box b-dotted">border: 3px dotted #10b981</div>
<div class="box b-double">border: 4px double #38bdf8</div>
<div class="box b-left">border-left: 5px solid #ef4444 (callout accent)</div>
<div class="box b-top">border-top: 3px solid #8b5cf6 (section divider)</div>
</body>
</html>
2. border-radius (Rounded Corners & Pills)
Control top-left, top-right, bottom-right, and bottom-left radius individually or simultaneously. Using 50% creates perfect circles!
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: system-ui, sans-serif; background: #0f172a; color: #f8fafc; padding: 24px; }
.shape-row { display: flex; flex-wrap: wrap; gap: 16px; align-items: center; }
/* Pill button */
.btn-pill {
background: #6366f1; color: #fff; border: none;
padding: 10px 24px; border-radius: 9999px;
font-size: 14px; font-weight: 600; cursor: pointer;
}
/* Circle avatar */
.avatar {
width: 64px; height: 64px; border-radius: 50%;
background: radial-gradient(circle, #38bdf8, #0f172a);
display: flex; align-items: center; justify-content: center;
font-weight: 700; color: #fff;
}
/* Standard card */
.card-std {
background: #1e293b; border: 1px solid #334155;
border-radius: 12px; padding: 16px; font-size: 13px; color: #94a3b8;
}
/* Asymmetric organic shape */
.custom-card {
background: linear-gradient(135deg, #4f46e5, #06b6d4);
border-radius: 20px 0 20px 0;
padding: 16px; font-size: 13px; font-weight: 600;
}
</style>
</head>
<body>
<h3 style="color:#10b981;margin-top:0;">border-radius Shapes</h3>
<div class="shape-row">
<button class="btn-pill">Pill (9999px)</button>
<div class="avatar">A</div>
<div class="card-std">Standard card (12px radius)</div>
<div class="custom-card">Asymmetric: 20px 0 20px 0</div>
</div>
</body>
</html>
3. border-image & Gradient Borders
Draw custom gradient borders using border-image and linear-gradient:
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: system-ui, sans-serif; background: #0f172a; color: #f8fafc; padding: 24px; }
.box { padding: 20px; margin: 12px 0; border-radius: 10px; font-size: 13px; }
/* Gradient border using border-image */
.gradient-border-box {
border: 4px solid transparent;
border-image: linear-gradient(to right, #4f46e5, #06b6d4) 1;
background: #1e293b;
}
/* Multi-directional gradient border */
.rainbow-border {
border: 3px solid transparent;
border-image: conic-gradient(from 0deg, #6366f1, #38bdf8, #34d399, #f59e0b, #ef4444, #6366f1) 1;
background: #1e293b;
}
/* Gradient border using box-shadow trick (preserves border-radius) */
.shadow-border {
background: #1e293b;
box-shadow: 0 0 0 3px #6366f1, 0 0 0 6px #06b6d4;
border-radius: 12px;
}
</style>
</head>
<body>
<h3 style="color:#f59e0b;margin-top:0;">Gradient Borders</h3>
<div class="box gradient-border-box">
border-image: linear-gradient(to right, #4f46e5, #06b6d4) 1
</div>
<div class="box rainbow-border">
border-image: conic-gradient(...) 1 — rainbow gradient border
</div>
<div class="box shadow-border">
box-shadow border trick — preserves border-radius (border-image can't)
</div>
</body>
</html>
4.4 Outline vs Border (Accessibility & Focus Ring)
While both borders and outlines draw lines around elements, they differ fundamentally in box model dimensions and accessibility behavior:
| Feature | CSS Border | CSS Outline |
|---|---|---|
| Box Model Layout Space | Takes up physical space (adds to element's calculated width/height). | Drawn outside/above element (does not affect layout or trigger reflows). |
| Side Control | Can set individual sides (e.g. border-left). |
Applies to all 4 sides uniformly. |
| Offset Capability | No offset support. | Supports outline-offset: 4px; to draw rings separated from element edge. |
| Accessibility Role | Visual styling. | Essential for keyboard navigation focus indicators! Never remove with outline: none without providing a focus replacement. |
Focus Ring Best Practice
Always provide visible focus outlines for keyboard users navigating via Tab key:
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: system-ui, sans-serif; background: #0f172a; color: #f8fafc; padding: 24px; }
.btn-row { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; margin: 16px 0; }
button {
padding: 10px 20px; border-radius: 8px; border: 2px solid transparent;
font-size: 14px; font-weight: 600; cursor: pointer;
}
.note { font-size: 12px; color: #64748b; margin: 4px 0 12px; }
/* No outline — accessibility failure! */
.btn-no-outline { background: #ef4444; color: #fff; outline: none; }
/* Standard border — takes layout space */
.btn-border { background: #1e293b; color: #f8fafc; border: 2px solid #6366f1; }
/* Accessible focus-visible ring */
.btn-accessible { background: #4f46e5; color: #fff; }
.btn-accessible:focus-visible {
outline: 3px solid #38bdf8;
outline-offset: 3px;
}
/* Outline with offset — floats above element */
.btn-offset { background: #10b981; color: #fff; }
.btn-offset:focus-visible {
outline: 3px dashed #f59e0b;
outline-offset: 6px;
}
p { font-size: 13px; color: #94a3b8; }
</style>
</head>
<body>
<h3 style="color:#f59e0b;margin-top:0;">Tab through these buttons to see focus rings!</h3>
<p>Press <kbd style="background:#334155;padding:2px 6px;border-radius:4px;">Tab</kbd> to move keyboard focus between buttons:</p>
<div class="btn-row">
<button class="btn-no-outline">No Outline ❌</button>
<button class="btn-border">Border (layout space)</button>
<button class="btn-accessible">Focus-Visible Ring ✅</button>
<button class="btn-offset">Outline + Offset ✅</button>
</div>
<p class="note">① No outline — keyboard users cannot see focus. Never do this!</p>
<p class="note">② Border — visible always, occupies layout space, not ideal for focus</p>
<p class="note">③ :focus-visible outline — only shows for keyboard navigation, not clicks</p>
<p class="note">④ outline-offset — ring floats separated from element edge</p>
</body>
</html>
4.5 Interactive Sandbox — Backgrounds, Gradients & Borders
Experiment live with conic gradients, pill borders, gradient borders, and custom outline offsets in the interactive playground below: