CSS Best Practices & Architecture
Well-architected CSS is maintainable, scalable, and predictable. Poor CSS turns into an unmaintainable mess of overrides and !important. In this final lesson we cover the methodologies and patterns that professionals rely on.
1 BEM Naming Convention
BEM (Block__Element--Modifier) provides a predictable class naming structure that makes CSS self-documenting.
CSS — BEM
/* Block */
.card { }
/* Element (part of Block) */
.card__header { }
.card__body { }
.card__footer { }
/* Modifier (variant of Block or Element) */
.card--featured { }
.card--dark { }
.card__btn--lg { }
2 CSS Reset / Normalize
CSS — Modern Reset
*, *::before, *::after { box-sizing: border-box; }
* { margin: 0; padding: 0; }
body { -webkit-font-smoothing: antialiased; }
img, video { display: block; max-width: 100%; }
input, button, textarea, select { font: inherit; }
p, h1, h2, h3, h4, h5, h6 { overflow-wrap: break-word; }
3 Performance Tips
- Prefer
transformandopacityfor animations — they run on the GPU compositor thread and don't trigger layout recalculation. - Avoid deeply nested selectors. Each extra level increases specificity and reduces maintainability.
- Use
will-change: transformsparingly on elements you know will animate. - Remove unused CSS with PurgeCSS or similar tools before shipping to production.
- Organize with a clear layer order: Reset → Tokens → Base → Layout → Components → Utilities.
4 Code Challenge
Challenge: Refactor a messy stylesheet using BEM naming, a modern CSS reset, and a
:root design token block. Measure the reduction in selector depth and specificity conflicts.