CSS Classes Considered Harmful
Proposed Alternative: Custom Elements + Data Attributes
- Core idea praised by some: represent components as custom tags (e.g.,
<my-card>) and use attributes (e.g.,data-size="big") instead of multiple classes. - Benefits cited:
- Avoids class “soup” and name collisions.
- Encodes mutually-exclusive state via single attributes (size=big/medium/small) instead of many overlapping classes.
- Keeps visual details in CSS while state/variants live in HTML attributes.
- Some like using one “semantic” class plus attributes (
class="my-thing" data-level="3"), rather than many BEM-style modifier classes.
Skepticism About Replacing Classes
- Many see data-attributes as “classes with extra steps” and not a real improvement.
- Concern that this just moves namespacing and combinatorics from classes to attributes and custom tags.
- Some argue
.Card.big(or BEM-style modifiers) already solves most problems cleanly, especially with preprocessors. - Critics worry about mixing state and style in attributes, making HTML less restylable and more tightly coupled to presentation.
Semantics, Content vs Presentation
- Recurrent theme: “name things for what they are, not how they look,” but several say this is hard to enforce in real projects.
- Others counter that size/layout is inherently presentational and often context-driven (
.hero .cardvs.articles .card). - Some argue strict separation of content and style is more theoretical than practical; modern layout (flex/grid) tightly couples HTML structure and CSS.
Utility / Atomic CSS vs Alternatives
- Defenders of functional/atomic CSS (including Tailwind-like systems) say they reduce mental load and avoid OOCSS bloat, though syntax can be hard to learn.
- Others dislike Tailwind as unreadable “inline styles in class attributes,” but acknowledge why teams adopt it.
- Several commenters prefer simple class-based systems (BEM, ECSS, SCSS placeholders) plus linting over new attribute-driven schemes.
HTML as Document vs Application Platform
- Debate over whether HTML/CSS are well-suited to full applications:
- Some say apps don’t map well to HTML; many UI primitives (dialogs, popovers, complex selects, drag-and-drop) arrived late or require heavy JS.
- Others argue the web’s ubiquity and deployment simplicity outweigh these mismatches, so the platform is being bent into an app runtime.
Tooling, Performance, and DX
- Note that browsers optimize ID/class selectors; attribute selectors can be slower for JS queries.
- Editor tooling today is heavily optimized around
classstrings; attributes/custom tags might enable richer tooling but are less supported now. - Some highlight new CSS capabilities (
:has(), grid/flex,attr()in future specs) as underused ways to manage complexity without abandoning classes.
Accessibility, SEO, and Custom Elements
- Concern that replacing semantic tags with custom elements harms accessibility and requires extra ARIA work.
- Clarification that if no semantic element exists, a custom tag is no worse than a
<div>, but it still shifts responsibility to developers. - One person worries about SEO impact of custom tags; others note standards aim to keep custom element/attribute naming safe (e.g., requiring dashes).
Meta: Human Factors and CSS Complexity
- Several note that most teams lack deep CSS expertise; methodology problems are often social/organizational, not purely technical.
- Some see the entire debate as bikeshedding; CSS is “simple enough” if used as intended, and overengineering is the real issue.
- Others view the proliferation of rules, methodologies, and tooling as evidence that CSS’s design doesn’t align well with how people build modern UIs.