Organizando e escalando CSS

A primeira folha de estilos em um novo projeto é um prazer escrever. Algumas centenas de linhas depois, algo muda: você muda a cor de um botão e três outros botões mudam também, um título se recusa a se mover até você colar !important ao lado dele, e toda nova regra parece que pode quebrar uma antiga. O CSS em si ainda está correto. O que se esgotou é a estrutura que o sustenta, e essa estrutura, não a sintaxe, é o que decide se uma folha de estilos permanece funcionável em mil linhas ou cem mil.
Por que CSS fica difícil de escalar
CSS é global por padrão. Toda regra que você escreve pode alcançar qualquer elemento correspondente em qualquer lugar da página. Escreva p { color: navy; } e todo parágrafo em todo o projeto fica azul marinho, quer você tenha querido ou não. Em uma página pequena isso é conveniente. Conforme o projeto cresce, essa é a raiz da maioria dos problemas.
O problema aparece como regras colidindo. Duas folhas de estilos têm como alvo p, ou uma regra geral e uma específica ambas se aplicam ao mesmo elemento, e agora você tem que trabalhar para descobrir qual vence. Você viu o mecanismo que decide isso em como CSS funciona: o navegador resolve conflitos pela especificidade e ordem. Escalar CSS bem é basicamente sobre não criar esses conflitos em primeiro lugar.
/* Uma regra global alcançando todo parágrafo na página */
p {
color: navy;
}
/* Uma segunda regra, em outro lugar, competindo pelos mesmos elementos */
.notice p {
color: crimson; /* vence dentro de .notice: mais específico */
}Mantenha a especificidade baixa e plana
O hábito único mais útil é estilizar com classes, e principalmente uma classe por vez. Uma classe como .card é rápida de aplicar, reutilizável, e indolor de substituir mais tarde se precisar, porque uma única classe é um nível baixo e gentil de especificidade.
O problema vem de duas coisas: ids e longas cadeias de seletores. Um id como #header é muito mais difícil de substituir do que uma classe, e uma cadeia como .sidebar ul li a está presa a uma estrutura exata. Prefira uma classe simples que você possa colocar em qualquer lugar:
/* Prefira: uma única classe, baixa e plana */
.nav-link {
color: navy;
}
/* Evite: um id, difícil de substituir depois */
#nav-link {
color: navy;
}
/* Evite: uma cadeia profunda, frágil e especificidade mais alta */
.sidebar nav ul li a {
color: navy;
}.card ou .nav-link. Uma única classe é rápida de reutilizar e indolor de substituir depois, que é exatamente o que você quer. Mantenha distância de ids como #header e cadeias longas como .sidebar ul li a, porque ambos são muito mais difíceis de mudar. Uma convenção de nomenclatura
Uma vez que você esteja estilizando com classes, a próxima pergunta é como nomeá-las. Nomes como .blue ou .thing2 caem rápido, porque não dizem nada sobre o que a classe é para. Uma convenção de nomenclatura é uma forma acordada de nomear classes para que o nome lhe diga o que uma classe faz e onde pertence.
A amplamente usada é chamada BEM, que significa Bloco, Elemento, Modificador. Um bloco é um componente como um cartão. Um elemento é uma parte dentro dele, escrita com dois hífens baixos. Um modificador é uma variação, escrita com dois hífens:
/* Bloco: o componente em si */
.card { }
/* Elemento: uma parte do bloco, dois hífens baixos */
.card__title { }
.card__body { }
/* Modificador: uma variante do bloco, dois hífens */
.card--featured { }<article class="card card--featured">
<h2 class="card__title">Oficina do fim de semana</h2>
<p class="card__body">Uma breve introdução ao layout.</p>
</article>.card, um elemento dentro dele como .card__title com dois hífens baixos, e uma variante como .card--featured com dois hífens. Você não tem que usar BEM, mas escolha algum esquema consistente e mantenha-o. Estruturando os arquivos
Conforme uma folha de estilos cresce, um arquivo longo fica difícil de se mover. A correção comum é dividir CSS em algumas pastas pelo que as regras fazem: estilos base (os padrões para elementos simples como body e títulos), componentes (os cartões, botões, e outras peças), e utilitários (pequenos auxiliares de propósito único como uma classe de espaçamento ou alinhamento de texto).
Um detalhe importa quando você divide os arquivos: a ordem em que você os carrega. Quando duas regras têm a mesma especificidade, a que vem depois vence, então uma folha de estilos carregada depois pode substituir uma anterior. Carregue seus arquivos do mais geral para o mais específico:
/* main.css: a ordem corre do menos ao mais específico */
@import "base/reset.css"; /* padrões de elemento */
@import "base/typography.css";
@import "components/card.css"; /* peças autossuficientes */
@import "components/button.css";
@import "utilities/spacing.css"; /* carregado por último então pode substituir */
@import "utilities/text.css";Tornando a cascata explícita
Tudo até agora mantém a cascata gerenciável por convenção: especificidade baixa, bons nomes, ordem de arquivo cuidadosa. Há mais aqui conforme você vai mais fundo, e vale a pena saber a direção de viagem. CSS moderno permite que você assuma o controle da ordenação diretamente em vez de confiar em onde um arquivo acontece de estar, e oferece maneiras de manter a cascata previsível conforme mais pessoas trabalham na mesma folha de estilos. Você conhecerá essas ferramentas conforme seus projetos crescem, e os hábitos acima são o que o preparam para elas.

