Difficulty in CSS Frameworks
Exploring the Complexity Behind Popular CSS Frameworks — and Why Picking One Isn’t Always Easy

Truth be told, there are so many ways CSS tools that struggle to find that perfect balance between easy, DX friendly and they are sometimes blatantly frustrating.
Ideally, your solution should land right in the middle there, next to CSS Modules.
But where this all gets muddled up is with the addition of CSS-in-JS, theming variables, custom variables, preprocessors.
It gets really messy when you start examining what’s fair, what’s BS, what should be easier, what should be customizable.
There are so many variables and it’s largely subjective to each developer’s skill level, that…
I don’t even know where to begin with this article.
How about Bootstrap? One of my first loves in frontend development. It offers you a nice set of defaults.
Which, if you’re a grown-a** developer in 2025 still using Bootstrap, you need to cross “Blazingly Fast” and “Modern” from your CV. Let’s be real!
Now, coding on VS Code with 900 extensions and a light mode so aggressive it damages my retinas, I could just barely, after about 700 styles overrides, barely squeeze my way through a decent landing page.
It was f***ed up! Bootstrap on top of custom design changes, changes a man.
Then I went back and tried it with Tailwind and whooped that layout’s a**.
But here is the problem! Which one did I enjoy more?
Bootstrap was safe. Predictable. But I had to fight it every time I wanted to do something original.
Most of the time, you’re forced to use utility classes like .btn-primary , which sounds good, until you need to add 10 different classes to 3 different pages where the button is situated.
On Tailwind, though, you have way more freedom in how you approach things.
But after writing class="flex flex-col justify-center items-center gap-3" for the 300th time, it just starts to feel like I’m trying to manifest a layout via dark rituals.
To DX or Not To DX — Choosing Your Poison
A lot of frameworks have this annoying gap between beginner-friendly and insane levels of abstraction.
You want the framework to push you to write clean, scalable CSS.
You want it to guide you towards best practices.
But it sucks when the thing that actually works, is just… ugly as hell.
All that design consistency and semantic markup you were promised?
Gone.
Now you’re inspecting devtools and wondering what the hell --tw-ring-offset-shadow even means.
You got severe styling bugs that feel like they were created by a rogue AI.
And what happens is… the junior dev starts pushing back.
He starts seeing the cracks in the framework’s design.
He abuses the plugin system.
He overrides everything with !important .
And when you push that framework to its absolute limit… sometimes, it cracks. And your enjoyment is ruined.
Structure
Bulma. Foundation. UIKit.
These frameworks don’t even let you choose your level of pain.
They offer a fixed design system. So you know your experience is completely tailored around what they think your app should look like.
And honestly? That’s beautiful!
It doesn’t always result in the cleanest, leanest code… But it does lend a huge sense of legitimacy to what you’re building.
Developers should have options in how they style an app…
but letting you pick between a dozen CSS paradigms? Maybe that’s just a step too far.
It’s like my man 50 Cent says:

DaisyUI with custom themes?
Shadcn with Tailwind?
Material UI in dark mode?
These just nailed it for me.
They’re pretty damn close to perfect.
But then you have all these other CSS frameworks that end up being inferior ways to experience the web.
What’s really smart are frameworks that are easy to pick up, but difficult to master.
Let the dev get a hang of the classes, then ramp that s**t up until they’re building a fully accessible modal component with nested transitions and theme toggles.
Take Tailwind, for example. Not the hardest framework out there, but people go feral with this thing, man.
Far beyond what is actually expected of you.
You want that depth.
That margin for improvement.
That dream of a perfect, scalable, beautiful component library that never comes true.
But when you encounter a poorly designed CSS abstraction…
You start second-guessing yourself.
“Is this all Chakra has to offer? A scalable button would be nice.”
You say, “well if I can’t style it properly, why isn’t this just a Wix site?”
Or, “Why am I spending 7 hours fixing the width of this input?”
Why am I wasting my time writing this class?
Why do I even write CSS?
Why do I even code at all?
Conclusion
Now, when you’re having a full-blown existential meltdown because of unstyled focus states, you need to take a break and say:
“This framework is too hard. I need to go build a site with Tailwind.”
Now, in that codebase, all I’m still thinkin’ about is:
“Man, I still gotta f***in’ center this div.”
You’ll probably like these, as well:
“Stale” Closures in React Aren’t Real. Here’s What’s Actually Happening