21 de outubro de 2023
Visão Geral das Arquiteturas CSS: OCSS, SMACSS e BEM
CSS
Introdução
O CSS é uma linguagem de marcação assim como o HTML. Ela é uma das primeiras tecnologias que exploramos ao iniciar no desenvolvimento web, justamente por ser simples e ter um resultado visual imediato na tela. Entretanto, apesar de ser simples, a estrutura do CSS num projeto deve ser muito bem organizada. Dado que facilmente podemos se perder em meio a tantas classes, seletores e folhas de estilos que sobrescrevem o que não deveria, ou não apresentam efeito quando deveriam.
Por esse motivo surgiram vários modelos de arquiteturas CSS, algumas que ditam regras a serem seguidas e outras apenas recomendações e guias. Vou comentar sobre as três principais:
- OOCSS (Object-Oriented CSS).
- SMACSS.
- BEM.
Só vamos se atentar que, nenhuma arquitetura suprime a boa comunicação e convenções de códigos estabelecidas pelo seu time ainda nos primórdios do projeto.
OOCSS - CSS Orientado a Objetos.
Essa metodologia foi proposta por Nicole Sullivan, em 2008. O seu objetivo era aplicar conceitos de POO já conhecidos, principalmente através das linguagens Java e C#.
Desse modo podemos abstrair as pequenas partes de um site em objetos e estilizá-los independente de sua localização. Isso porque um dos conceitos de OOCSS é criar uma nova classe específica para cada novo tipo de elemento que você quer.
As duas premissas para criar as classes são:
- Separar a estrutura do estilo.
- Separar o container do conteúdo.
Assim, podemos reutilizar melhor as estilizações de forma mais específica.
Estrutura vs Estilo
Abaixo há um exemplo de separação entre estrutura e estilo.
1/* ESTRUTURA */
2.btn {
3 padding: 10px 15px;
4 border: 1px solid gray;
5}
6/* ESTILO */
7.greenScheme {
8 border-color: rgb(14, 143, 14);
9 background-color: green;
10}
11.greenScheme:hover {
12 border-color: rgb(14, 143, 14);
13 background-color: rgb(14, 90, 14);
14}
Container vs Conteúdo
Em adição, Sullivan sugere a separação entre o container e conteúdo para evitar ao máximo a dependência de localização do objeto na árvore de renderização do HTML - o famoso DOM, Document Object Model -. Lembre-se que é uma boa prática manter um elemento com a mesma aparência, não importa onde estiver.
Por exemplo, ao invés de estilizar todos os links dentro de footer...
1.footer a { /* styles */ }
…podemos fazer algo mais flexível e específico.
1.external-link { /* styles */ }
Alguns outros detalhes importantes
- Evite usar IDs.
- Evite citar tags HTML dentro do arquivo CSS. Use classes.
- Evite usar seletor descendente (como explicado no último exemplo).
- Apenas use !important em casos extremos.
SMACSS
Agora vamos falar de SMACSS (lê-se smacks). Foi criado por Jonathan Snook. O autor tem um livro sobre e uma excelente documentação.
Conforme o guia, as regras CSS têm 5 categorias: base, layout, module, state e theme.
Base
São estilos comuns ou iniciais dos elementos, levando em consideração todo o projeto. Exemplo:
- Cor de fundo e texto comum.
- Estilo padrão de links e listas.
- “Resets” do CSS.
- Box-sizing.
Algo como abaixo. (E sim, eu usei o seletor universal).
1* {
2 box-sizing: border-box;
3 font-family: 'Ubuntu', sans-serif;
4}
5
6html,
7body,
8button,
9textarea,
10input {
11 @media (max-width: 768px) {
12 font-size: 93.75%;
13 }
14 @media (max-width: 425px) {
15 font-size: 87.50%;
16 }
17}
Layout (estrutura)
Geralmente as classes dessa categoria podem ser prefixas com “l-”. Aqui vão entrar header, footer, main, aside, etc.
1.layout {
2 display: grid;
3 grid-auto-columns: 1fr;
4 grid-auto-rows: 1fr;
5 grid-template-columns: 1fr 2fr;
6 grid-template-rows: 4em 1fr 4em;
7 gap: 0px 0px;
8 grid-template-areas:
9 "header header"
10 "aside main"
11 "footer footer"
12;}
13
14#aside { grid-area: aside; }
15#main { grid-area: main; }
16#header { grid-area: header; }
17#footer { grid-area: footer; }
Module
A parte mais funcional do site, específicos e reutilizáveis. Aqui vamos estilizar botões, links, drawers, listas, entre outros. São a maioria dos elementos.
State (Estado)
Nessa parte são os estilos relacionados a um “estado”, como estar selecionado, estar ativo, ou qualquer outra condição. Aqui há uma estreita relação com Javascript para aplicar ou retirar esses estilos dinamicamente. Comumente são usados prefixos como “is-” e “has-” na nomenclatura de classes.
1.is-selected {
2 color: red;
3}
4.is-active {
5 font-weight: 700;
6}
7.has-search-value {
8 border: 1px dashed green;
9}
Theme
Estilos que dependem da preferência do usuário. Essa parte é bem opcional, pois nem todos os projetos têm escolha de temas (dark/light), estilo de listagem (tabela/lista/grade), entre outros.
Importante ressaltar que SMACSS não te dita regra alguma, é apenar um guia.
Uma opção de estrutura de pastas pode ser a seguinte:
1 ├── base.scss
2 ├── layout.scss
3 └── module
4 ├── home.scss
5 └── about.scss
6 ├── state.scss
7 └── theme.scss
BEM
BEM foi criado pela Yandex, uma empresa russa com um mercado gigante em serviços para web. O principal propósito dessa estrutura é dividir a interface em pequenos blocos independentes. Assim podem ser reutilizados e não causar efeitos indesejados além do seu escopo.
BEM é um acrônimo para Block, Element, Modifier. Que são três partes que podemos dividir uma interface do usuário.
Block (Bloco)
Blocos são elementos reutilizáveis e independentes de uma página. Pense num bloco como um módulo do SMACSS ou um grande componente. O seu nome deve ser o seu propósito e não sua aparência. Para ilustrar, um Header é considerado um bloco.
A sua estilização não pode modificar o que está do lado de fora.
Element (Elemento)
Um elemento deve fazer parte do bloco, pois não tem função fora deste. Os links dentro do Header e a Logo são os elementos do bloco Header.
Modifier (Modificador)
Uma variação ou extensão do bloco. Um link ativo seria um modificador específico do Header.
Nomenclatura
A nomenclatura é a parte mais marcante de BEM. Você vai saber que um projeto usa BEM no exato momento que bater o olho num arquivo CSS. O nome do bloco descreve sua função/propósito, o elemento é prefixo com “__“ e o modificador com “—”.
1/* .[Block]__[Element]--[Modifier] */
2
3.header { }
4.header__link { }
5.header__link--active { }
Conclusão
Estas são apenas 3 das estratégias de manter os códigos CSS organizados conforme aumente sua complexidade. Agora que você viu uma geral sobre cada uma delas, escolha qual te agrada mais, explore a documentação e comece a pôr em prática. Bons estudos! 👋
Referência
Home · stubbornella/oocss Wiki (github.com)
Home - Scalable and Modular Architecture for CSS (smacss.com)