CSS in 2026: What Actually Matters for a Small Business Website

For a small business site in 2026, skip the CSS framework. Native layout, container queries, and custom properties for colors and spacing cover almost everything. You get a faster site with less code to maintain. I only reach for a framework on large teams that need enforced consistency.
Part of the complete web design guide.
On this page
- Stop shipping a framework for a five-page site
- Use custom properties for theming, not for everything
- Modern color is genuinely better now
- Accessibility is not a separate pass
- Performance decisions that pay off
- What I’d skip in 2026
- FAQ
- Do I need to rewrite my site to use container queries?
- Is it safe to use oklch() and relative color syntax in production?
- How much CSS is too much?
Most “web design secrets” articles are recycled lists of the same five tips from 2019. The real shift in the last few years is that CSS itself got much more capable, and a lot of the old workarounds are now dead weight. Here’s what I actually reach for when building a site today, and what I leave out.
Stop shipping a framework for a five-page site
If you’re paying for a 200KB CSS bundle so a local business can have a hero section and three cards, something went wrong. Modern CSS handles layout, spacing, and theming natively. You don’t need a grid system, and you don’t need a utility framework unless you’re on a large team that genuinely benefits from the consistency.
Container queries are the clearest example. For years we sized components by viewport width, which breaks the moment a card sits in a sidebar. Now components respond to their own container:
.card-wrap {
container-type: inline-size;
}
@container (min-width: 30rem) {
.card {
display: grid;
grid-template-columns: 8rem 1fr;
gap: 1.5rem;
}
}
That’s a real layout switch with no JavaScript and no media query guessing. Browser support is solid across current versions of Chrome, Safari, Firefox, and Edge, so this is production-ready in 2026.
Use custom properties for theming, not for everything
CSS variables are great for colors, spacing scales, and anything a client might want to tweak. They’re not a substitute for a design system, and people overuse them on one-off values that never change.
:root {
--brand: #1f4e79;
--brand-ink: #0f2a42;
--space-2: 0.75rem;
--space-4: 1.5rem;
--radius: 10px;
}
.btn {
background: var(--brand);
color: #fff;
padding: var(--space-2) var(--space-4);
border-radius: var(--radius);
}
.btn:hover { background: var(--brand-ink); }
One caveat: custom properties inherit. If you set a variable on a component, every child sees it. That’s usually what you want, but it bites people who set a global name like --color and then wonder why a nested element picked up the wrong value.
Modern color is genuinely better now
oklch() gives you perceptually even color. If you’ve ever built a palette in HSL and watched the “light” variants turn muddy or the dark ones look gray, that’s the problem it solves.
:root {
--brand: oklch(45% 0.11 250);
}
.btn:hover {
background: oklch(from var(--brand) calc(l - 0.08) c h);
}
Relative color syntax lets you derive hover and active states from a single source of truth. That means fewer hardcoded hex values to update when a client changes their brand color, which happens more often than you’d think.
Accessibility is not a separate pass
This is the part most template sites get wrong. A few things that take minutes and matter a lot:
- Visible focus states. Don’t remove the outline. Style it.
- Contrast of at least 4.5:1 for body text, 3:1 for large text.
- Real
<button>elements for actions, real<a>elements for navigation. - Respect
prefers-reduced-motionif you animate anything.
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
:focus-visible {
outline: 3px solid var(--brand);
outline-offset: 2px;
}
Performance decisions that pay off
CSS is rarely the bottleneck. Fonts and images usually are. Still, a few habits keep things fast:
- Self-host fonts and subset them. Loading three weights from a CDN you don’t control adds latency and a privacy headache.
- Use
font-display: swapso text isn’t invisible while a font loads. - Prefer system font stacks for body copy when the brand allows it. It’s free performance.
- Minify and serve CSS compressed. That’s table stakes, not a strategy.
What I’d skip in 2026
Not everything new earns a place. I’d skip CSS-in-JS for a content site, skip scroll-jacking, and skip heavy animation libraries for a brochure site. I’d also skip the temptation to rebuild everything with the newest feature the day it ships. Support is good, but “good” isn’t “universal,” and a contractor’s phone is a bad place to discover that.
If you’re weighing a rebuild and want a second opinion on what’s actually worth changing, that’s most of what I do as a Long Island web design consultant. Half the time the honest answer is that the current site is fine and the problem is content or speed, not the CSS.
FAQ
Do I need to rewrite my site to use container queries?
No. Add them where components actually break, like cards in a sidebar. Rewriting a working site for a new CSS feature is rarely worth it.
Is it safe to use oklch() and relative color syntax in production?
Yes, in current browsers. If you have a meaningful share of older visitors, provide a fallback color before the oklch declaration and let the newer value override it.
How much CSS is too much?
There’s no magic number, but if your stylesheet is over 100KB uncompressed for a small site, look at what’s unused. Usually it’s a framework or a page builder shipping rules you never use.


