CSS Semantic
Semantic HTML regions, BEM-style naming, and maintainable component styling.
Introduction to Semantic CSS
What You'll Learn
This tutorial explains how to style HTML5 semantic regions (header, nav, main, article, section, aside, footer) so your layouts stay readable, accessible, and easy to maintain.
- Why semantic markup + semantic CSS beats “div soup”
- Patterns for spacing, typography, and hierarchy per region
- Naming conventions (BEM-style) that describe purpose, not looks
- How to avoid tight coupling between structure and presentation
Semantic styling means your selectors and class names reflect meaning (navigation, article body, site footer) rather than incidental appearance (“blue-box-left”). Browsers, screen readers, and future you all benefit when structure and styles align.
Why Semantic HTML Deserves Semantic CSS
Theory: Semantic elements document the role of each block. CSS should reinforce those roles with consistent spacing, contrast, and reading order—without hiding structure behind meaningless wrappers.
When you style <header> and <footer> as distinct bands, and <main> as the primary reading column, users instantly understand where they are on the page. Search engines and assistive tech use the same landmarks.
Seven nested <div>s named .wrapper .inner .box with no connection to real page regions. Hard to theme and to debug in DevTools.
Landmarks + a small set of component classes: .site-header, .site-nav, .content-main, .site-footer. Same visual result, clearer model.
Styling Semantic Regions Step by Step
Theory: Give each region a predictable vertical rhythm: padding, max-width on main content, and separation between header/nav/main/footer.
- Reset noise: Set
box-sizing: border-boxglobally so padding doesn’t break widths. - Constrain reading width: Use
max-width+ horizontalmargin: autoonmainor an inner wrapper. - Separate bands: Slightly different background or border for
header/footervsmain.
Example: Page shell
*, *::before, *::after { box-sizing: border-box; }
body {
margin: 0;
font-family: system-ui, sans-serif;
line-height: 1.6;
color: #0f172a;
background: #f8fafc;
}
.site-header,
.site-footer {
padding: 1rem 1.25rem;
background: #0f172a;
color: #f8fafc;
}
.site-nav {
display: flex;
gap: 0.75rem;
flex-wrap: wrap;
}
main {
max-width: 72ch;
margin: 0 auto;
padding: 2rem 1.25rem;
}
article {
background: #fff;
border-radius: 12px;
padding: 1.25rem;
box-shadow: 0 4px 24px rgba(15, 23, 42, 0.08);
}
Component Naming That Stays Semantic
Theory: Name classes after component + element + modifier (BEM) so styles map to UI meaning, not to one-off colors.
Use modifiers for state (active, disabled) and variants (compact, featured), not for “make it red.”
Example: Navigation with BEM-style modifiers
.site-nav { display: flex; gap: 0.5rem; }
.site-nav__link {
padding: 0.5rem 0.75rem;
border-radius: 8px;
text-decoration: none;
color: #e2e8f0;
}
.site-nav__link:hover {
background: rgba(255, 255, 255, 0.08);
}
.site-nav__link--active {
background: #dbeafe;
color: #1e3a8a;
}
.blue-link everywhere.Article, Section, and Aside
Theory: article is a self-contained composition; section groups a thematic block; aside is tangential. Style them with different emphasis so side notes don’t compete with the main narrative.
Example: Main column + complementary aside
.content-with-sidebar {
display: grid;
gap: 1.5rem;
grid-template-columns: minmax(0, 1fr) 280px;
}
@media (max-width: 900px) {
.content-with-sidebar {
grid-template-columns: 1fr;
}
}
aside.complementary {
font-size: 0.95rem;
padding: 1rem;
border-left: 4px solid #38bdf8;
background: #f0f9ff;
}
Checklist & Summary
| Practice | Why it matters |
|---|---|
| Style landmarks consistently | Users recognize header/footer/main instantly |
| Use purpose-based class names | Easier refactors and design-system alignment |
| Keep specificity low | Avoid fighting cascade when adding components |
| Test with keyboard + screen reader | Semantic structure must match visual order |
What you learned: Semantic CSS mirrors semantic HTML—style regions and components by role, use a clear naming scheme, and keep main content readable with sensible width and spacing.