Also available in Español

The Problem

A team hits a styling problem that CSS won't cooperate with. Something needs to change based on a click, a scroll position, a piece of application state. So they reach for more power.

A heavier selector. An !important. Sometimes CSS gets skipped entirely — element.style.display = 'none', set directly from a click handler, because it felt more reliable than trusting the cascade to do what was asked.

None of the last three problems in this series were solved by giving CSS more capability. Resets weren't broken by CSS being too weak to normalize browsers — they were broken by opinion and normalization sharing a boundary that should never have been shared. Specificity wasn't broken by selectors being too weak — it was broken by having no way to declare intent independent of selector weight. Entropy wasn't caused by CSS lacking some feature — it was caused by nothing marking the boundary between what's safe to remove and what isn't.