Convenciones de nombres CSS: BEM, OOCSS, SMACSS comparados

6 min de lectura

Nombrar clases CSS puede parecer trivial, pero en grandes bases de código se convierte en una de las decisiones arquitectónicas más importantes. Una buena convención de nombres previene guerras de especificidad, reduce colisiones de nombres y hace que las hojas de estilo se autodocumenten.

Por qué importa la nomenclatura CSS

CSS tiene un espacio de nombres global. Cada nombre de clase está disponible en todas partes, y las reglas de especificidad determinan qué estilos ganan. Sin una convención de nombres, los equipos inevitablemente crean conflictos: dos desarrolladores nombran su clase .card, y uno sobrescribe al otro.

BEM (Block Element Modifier)

BEM es la convención de nombres CSS más ampliamente adoptada. Usa un patrón estructurado:

.block {}
.block__element {}
.block--modifier {}

/* Ejemplo */
.card {}
.card__title {}
.card__image {}
.card--featured {}
.card__title--large {}

Reglas de BEM

  • Bloque: Un componente independiente. Nombrado en kebab-case: .search-form, .nav-bar.
  • Elemento: Una parte del bloque sin significado independiente. Separador de doble guion bajo: .search-form__input.
  • Modificador: Una variante o estado de un bloque/elemento. Separador de doble guion: .search-form--dark.

Beneficios de BEM

  • Autodocumentado: .card__title--highlighted te dice exactamente qué es
  • Baja especificidad: todo es un selector de clase simple
  • Sin colisiones de nombres: el nombre del bloque delimita todo
  • Agnóstico de framework: funciona con cualquier stack tecnológico

OOCSS (CSS Orientado a Objetos)

OOCSS separa estructura de apariencia y contenedor de contenido:

/* Estructura */
.media { display: flex; align-items: start; }
.media__body { flex: 1; }

/* Apariencia */
.theme-dark { background: #333; color: #fff; }
.theme-light { background: #fff; color: #333; }

OOCSS crea objetos de utilidad altamente reutilizables, pero puede resultar en muchas clases en un solo elemento HTML.

SMACSS (Arquitectura Escalable y Modular)

SMACSS categoriza las reglas CSS en cinco tipos con prefijos:

CategoríaPrefijoEjemplo
Baseningunohtml, body, h1
Layoutl-.l-sidebar
Móduloninguno.card
Estadois-.is-active
Temat-.t-dark

CSS Modules y CSS-in-JS

Frameworks modernos como React ofrecen alternativas que resuelven las colisiones de nombres a nivel de herramientas:

  • CSS Modules: Delimita automáticamente los nombres de clase. Escribes .title, la herramienta de build produce .Card_title_x7kd2. Usa camelCase para los nombres de clase ya que se convierten en propiedades JavaScript.
  • Tailwind CSS: Usa clases de utilidad, eliminando por completo la nomenclatura personalizada.
  • styled-components / Emotion: CSS-in-JS con nombres de clase autogenerados.

¿Cuál deberías elegir?

EnfoqueMejor para
BEMCSS tradicional, equipos multi-desarrollador, temas CMS
CSS ModulesProyectos basados en componentes React/Vue/Svelte
TailwindPrototipado rápido, flujos de trabajo utility-first
SMACSSGrandes bases de código legacy que necesitan organización

Convierte tus nombres de clase

Las clases CSS siempre usan kebab-case. Convierte desde otros formatos con nuestro conversor kebab-case. Si necesitas camelCase para CSS Modules, prueba el conversor camelCase o el hub de conversión de case.