DEV Community

Cover image for Arquitetura CSS (BEM - OOCSS - Functional CSS - CSS in Js) - PT
Gustavo Scarpim
Gustavo Scarpim

Posted on

Arquitetura CSS (BEM - OOCSS - Functional CSS - CSS in Js) - PT

Ao falar sobre arquitetura de software, geralmente nos concentramos na arquitetura do frontend ou backend, mas há uma arquitetura igualmente importante que os desenvolvedores muitas vezes negligenciam: a arquitetura CSS.

Embora muitas pessoas acreditem que o CSS seja apenas um conjunto de regras de estilo visual, a verdade é que ele também precisa ser organizado e estruturado de maneira clara e coerente para garantir a manutenção e evolução do código a longo prazo.

A arquitetura CSS envolve a definição de padrões e diretrizes para a organização, nomenclatura e estruturação das regras de estilo, com o objetivo de criar um código coeso e sustentável. As técnicas mais utilizadas incluem o uso de metodologias como BEM, OOCSS, CSS Funcional e CSS-in-js, que propõem maneiras de dividir o código em módulos reutilizáveis e independentes, além do uso de pré-processadores como Sass e Less, que permitem escrever CSS de maneira mais modular e dinâmica.

Uma boa arquitetura de CSS pode trazer muitos benefícios para um projeto, como a redução de duplicação de código, maior facilidade de manutenção, aumento da produtividade da equipe e melhorias significativas na performance da aplicação. Por isso, é importante valorizar a arquitetura de CSS e investir em boas práticas de organização e estruturação do código.

Aqui está uma imagem que resumo um pouco as características sobre cada uma delas:

Fonte: PUC
Image description


BEM Style Guide

O BEM (Block-Element-Modifier) é um Style Guide onde não precisamos de uma lib externa e possuí uma compatibilidade com qualquer tipo de frameworks, ela serve para padronizar nomes de classes:

  • Block: Header, Container, Menu, Checkbox, Input...
  • Element: Menu item, list item, titulo de cabeçalho...
  • Modifier: Disabled, Active, Fixed...

Exemplo:

<style>
.main-nav {...}
.main-nav__item {...}
.main-nav__item--is-active {...}
</style>

<nav class="main-nav" >
  <li class="main-nav__item">Item menu</li>
  <li class="main-nav__item--is-active">Item menu Active</li>
</nav>
Enter fullscreen mode Exit fullscreen mode

Prós:

  • Organização clara e intuitiva
  • Reutilização
  • Nomenclatura padronizada e consistente
  • Escalabilidade

Contras:

  • Muito verbose
  • Uso excessivo de BEM pode levar a uma redundância de código
  • A necessidade de definir muitas classes pode levar a um aumento do tamanho do arquivo CSS

OOCSS Style Guide

OOCSS (Object Oriented CSS) é uma metodologia de desenvolvimento de CSS que se concentra na criação de classes reutilizáveis e independentes de contextos específicos. A ideia é separar as propriedades de estilo em classes que podem ser aplicadas a qualquer elemento no HTML, independentemente do contexto em que aparecem.

O objetivo do OOCSS é criar um código CSS escalável, sustentável e fácil de manter. Ele busca reduzir as duplicações de códigos, melhorar a legibilidade do código e permitir a criação de novos estilos de forma mais eficiente.

Exemplo:

<style>
.button {
  font-size: 14px;
  font-weight: 600;
}

.button--primary {
  background-color: #007bff;
  color: #fff;
}

.button--secondary {
  background-color: #fff;
  border: 1px solid #007bff;
  color: #007bff;
}

.button--alert {
  background-color: #dc3545;
  color: #fff;
}
</style>

<button class="button button--primary">primary</button>
<button class="button button--secondary">secondary</button>
<button class="button button--alert">alert</button>
Enter fullscreen mode Exit fullscreen mode

OOCSS é uma metodologia de escrita de CSS, não uma biblioteca ou framework. Porém, algumas bibliotecas CSS adotam os princípios do OOCSS:

  • Bootstrap
  • Foundation
  • Semantic UI
  • Materialize CSS
  • Bulma

Prós:

  • Reutilização de código
  • Flexibilidade
  • Escalabilidade
  • Manutenção

Contras:

  • Curva de aprendizado
  • Complexidade
  • Inconsistência
  • Tamanho do arquivo

CSS Funcional Style Guide

Esse Style Guide utiliza micro classes, para compor outros componentes, cada micro classe altera uma única propriedade do CSS.

Exemplo:

.container {
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 1em;
}

.row {
  display: flex;
  flex-wrap: wrap;
  margin: 0 -0.5em;
}

.col {
  flex: 1;
  margin: 0 0.5em;
}
Enter fullscreen mode Exit fullscreen mode

Algumas bibliotecas que utilizam o CSS Funcional:

  • Tachyons
  • Tailwind CSS
  • Basscss
  • Functional CSS
  • Primer CSS

Prós:

  • Redução do tamanho do arquivo CSS
  • Reutilização de estilos
  • Flexibilidade
  • Clareza

Contras:

  • Curva de aprendizado alta
  • Dificuldade de controle
  • Limitações
  • Necessidade de planejamento

Style-in-JS Style Guide

Esse Style Guide é a técnica de estilização utilizando Javascript. Em vez de separar o CSS em um arquivo externo ou incorporá-lo em um documento HTML separado, o estilo é criado e aplicado diretamente no componente usando uma biblioteca ou framework de estilo em JavaScript.

Exemplo utilizando Styled Components:

import styled from 'styled-components';

const Button = styled.button`
  background-color: #007bff;
  &:hover {
    background-color: #0069d9;
  }
`

function App() {
  return (
    <div>
      <Button>Click me!</Button>
    </div>
  )
}
Enter fullscreen mode Exit fullscreen mode

Algumas bibliotecas que utilizam CSS-IN-JS:

  • styled-components
  • Emotion
  • JSS
  • Glamorous
  • Radium

Como melhorar a performance do seu código css

  • Evitando overrides de estilos repetidos
  • Evitar sempre de utilizar !important porque ele causa um número de re-render na fase de "Painting"
  • Reduza o tamanho do arquivo CSS
  • Use seletores específicos
  • Utilize arquivos separados
  • Minimize o número de reflows e repaints
  • Utilize técnicas de cache
  • Sempre utilize técnicas de otimização de imagens

Espero que tenha agregado em algo.

Autor: Gustavo Scarpim
Linkedin: https://www.linkedin.com/in/gustavoscarpim/
GitHub: https://github.com/guscarpim
Portfolio: https://gustavoscarpim.com/

Top comments (0)