Convenções de Nomenclatura: BEM, OOCSS, SMACSS
Descubra metodologias para nomear classes de forma consistente e escalável.
Quando você começa a escrever CSS, é fácil cair na armadilha de dar nomes aleatórios às suas classes. minha-div, botao-azul, texto-grande... parece inofensivo no início. Mas à medida que seu projeto cresce, essa falta de padrão se transforma em caos: classes duplicadas, estilos que se sobrescrevem de forma inesperada, dificuldade em entender o que cada classe faz e um pesadelo para manter.
É aí que entram as Convenções de Nomenclatura CSS. Elas são conjuntos de regras e diretrizes para nomear suas classes e IDs de forma consistente, lógica e previsível. O objetivo principal é tornar seu CSS mais:
- Modular: Cada parte do seu CSS deve ser independente e reutilizável.
- Escalável: Fácil de adicionar novas funcionalidades sem quebrar as existentes.
- Manutenível: Simples de entender, modificar e depurar.
- Colaborativo: Todos na equipe seguem o mesmo padrão, facilitando o trabalho em conjunto.
Vamos explorar três das metodologias mais populares: BEM, OOCSS e SMACSS.
1. BEM (Block, Element, Modifier)
BEM é uma metodologia de nomenclatura que ajuda a criar componentes de interface de usuário (UI) reutilizáveis e independentes. É talvez a mais popular e rigorosa das três.
Block (Bloco): Uma entidade independente e significativa. Pode ser um componente autônomo.
- Exemplos:
header,menu,button,card,form. - Nomenclatura:
nome-do-bloco(minúsculas, hífens para separar palavras).
- Exemplos:
Element (Elemento): Uma parte de um bloco que não tem significado autônomo e está semanticamente ligada ao seu bloco.
- Exemplos:
menu__item,card__title,form__input. - Nomenclatura:
nome-do-bloco__nome-do-elemento(dois underscores__).
- Exemplos:
Modifier (Modificador): Uma flag em um bloco ou elemento que representa uma mudança de estado, comportamento ou aparência.
- Exemplos:
button--primary,button--disabled,menu__item--active,card--featured. - Nomenclatura:
nome-do-bloco--nome-do-modificadorounome-do-bloco__nome-do-elemento--nome-do-modificador(dois hífens--).
- Exemplos:
Exemplo BEM:
<div class="card card--featured">
<h2 class="card__title">Título do Card</h2>
<p class="card__description">Descrição do card.</p>
<button class="button button--primary">Comprar</button>
<button class="button button--secondary button--disabled">Detalhes</button>
</div>
/* Bloco */
.card {
border: 1px solid #ccc;
padding: 20px;
}
/* Modificador de Bloco */
.card--featured {
border-color: gold;
box-shadow: 0 0 10px rgba(0,0,0,0.2);
}
/* Elemento */
.card__title {
font-size: 1.5em;
color: #333;
}
/* Elemento */
.card__description {
font-size: 1em;
line-height: 1.5;
}
/* Bloco */
.button {
padding: 10px 15px;
border: none;
cursor: pointer;
}
/* Modificador de Bloco */
.button--primary {
background-color: blue;
color: white;
}
/* Modificador de Bloco */
.button--secondary {
background-color: gray;
color: white;
}
/* Modificador de Bloco */
.button--disabled {
opacity: 0.5;
cursor: not-allowed;
}
Vantagens do BEM:
- Clareza e previsibilidade: Você sabe exatamente o que cada classe faz e onde ela pertence.
- Modularidade: Componentes são independentes e reutilizáveis.
- Evita conflitos: Nomes longos e específicos reduzem a chance de sobrescrever estilos.
Desvantagens do BEM:
- Nomes de classes podem ficar muito longos.
- Pode parecer excessivo para projetos muito pequenos.
2. OOCSS (Object-Oriented CSS)
OOCSS foca em dois princípios principais:
Separar Estrutura de Skin (Aparência):
- Estrutura: Propriedades que definem o layout e o posicionamento (ex:
width,height,margin,padding). - Skin: Propriedades que definem a aparência visual (ex:
background-color,color,border,box-shadow). - Isso permite reutilizar a estrutura em diferentes contextos visuais.
- Estrutura: Propriedades que definem o layout e o posicionamento (ex:
Separar Container de Conteúdo:
- Evitar seletores aninhados que dependem da localização do elemento no HTML.
- Ex: Em vez de
.sidebar h2, use.sidebar-titleou.heading--sidebar. Isso torna o componente mais flexível para ser movido.
Exemplo OOCSS:
<div class="media">
<img class="media__img" src="avatar.jpg" alt="Avatar">
<div class="media__body">
<h3 class="media__title">Nome do Usuário</h3>
<p>Alguma descrição.</p>
</div>
</div>
<button class="button button--primary">Comprar</button>
<button class="button button--secondary">Detalhes</button>
/* Objeto Media (Estrutura) */
.media {
overflow: hidden; /* Clearfix */
margin-bottom: 20px;
}
.media__img {
float: left;
margin-right: 10px;
}
.media__body {
overflow: hidden; /* Ocupa o espaço restante */
}
/* Objeto Button (Estrutura e Skin) */
.button {
padding: 10px 15px;
border: none;
cursor: pointer;
border-radius: 5px; /* Skin */
}
.button--primary {
background-color: blue; /* Skin */
color: white; /* Skin */
}
.button--secondary {
background-color: gray; /* Skin */
color: white; /* Skin */
}
Vantagens do OOCSS:
- Reutilização de código: Reduz a duplicação de CSS.
- Manutenção: Mudanças em um "objeto" não afetam outros.
- Performance: Menos CSS para o navegador processar.
Desvantagens do OOCSS:
- Pode levar a muitas classes no HTML.
- A separação de estrutura e skin pode ser difícil de aplicar consistentemente.
3. SMACSS (Scalable and Modular Architecture for CSS)
SMACSS é mais uma arquitetura do que uma convenção de nomenclatura estrita. Ele propõe categorizar as regras CSS em cinco tipos, o que ajuda a organizar os arquivos e a pensar sobre a responsabilidade de cada estilo.
- Base: Estilos padrão para tags HTML (reset, normalize,
body,h1,p,a). Sem classes ou IDs. - Layout: Estilos para a estrutura principal da página (header, footer, sidebar, grid). Geralmente prefixados com
l-oulayout-.- Ex:
.l-header,.l-sidebar.
- Ex:
- Module (Módulo): Componentes reutilizáveis e independentes (botões, cards, navegação, formulários).
- Ex:
.card,.button,.menu.
- Ex:
- State (Estado): Estilos que descrevem o estado de um módulo ou layout (escondido, ativo, desabilitado, expandido). Geralmente prefixados com
is-ouis-active.- Ex:
.is-hidden,.is-active,.is-collapsed.
- Ex:
- Theme (Tema): Estilos que sobrescrevem os módulos e layouts para criar diferentes temas visuais.
Exemplo SMACSS (foco na estrutura e prefixos):
<div class="l-container">
<header class="l-header">
<nav class="module-nav">
<ul class="module-nav__list">
<li class="module-nav__item is-active"><a href="#">Home</a></li>
<li class="module-nav__item"><a href="#">Sobre</a></li>
</ul>
</nav>
</header>
<main class="l-main">
<div class="module-card">
<h2 class="module-card__title">Produto</h2>
<button class="button is-primary">Comprar</button>
</div>
</main>
</div>
/* Base */
body { font-family: sans-serif; }
h1, h2 { margin-top: 0; }
/* Layout */
.l-container {
max-width: 960px;
margin: 0 auto;
}
.l-header {
padding: 20px;
background-color: #f0f0f0;
}
.l-main {
padding: 20px;
}
/* Module */
.module-card {
border: 1px solid #ccc;
padding: 15px;
}
.module-card__title {
font-size: 1.2em;
}
.button {
padding: 8px 12px;
border-radius: 3px;
}
/* State */
.is-active {
font-weight: bold;
color: blue;
}
.is-primary { /* Modificador de estado para o botão */
background-color: green;
color: white;
}
Vantagens do SMACSS:
- Estrutura clara e organizada para arquivos e regras CSS.
- Ajuda a pensar sobre a responsabilidade de cada regra.
- Flexível o suficiente para ser combinado com BEM ou OOCSS.
Desvantagens do SMACSS:
- Menos focado em regras de nomenclatura estritas (precisa de outras metodologias para isso).
- A categorização pode ser subjetiva às vezes.
Qual escolher?
Não existe uma "melhor" metodologia universal. A escolha depende do tamanho do projeto, da equipe, das ferramentas e das preferências.
- BEM: Ótimo para projetos grandes e complexos, onde a clareza e a modularidade dos componentes são cruciais. Excelente para equipes grandes.
- OOCSS: Bom para reduzir a duplicação de código e criar estilos reutilizáveis.
- SMACSS: Excelente para estruturar a arquitetura geral do seu CSS, especialmente em projetos maiores.
Muitas vezes, as equipes combinam elementos de diferentes metodologias (ex: SMACSS para a estrutura geral e BEM para a nomenclatura de módulos). O importante é escolher um padrão e segui-lo consistentemente.