Categorias
Projetos

10 dicas para manter a Especificidade CSS baixa

Recentemente, em uma live que fizemos sobre Ferramentas de Especificidade CSS, foi perguntado: quanto menor a especificidade geral no CSS, melhor? Resumindo a resposta, foi dito que não há regras fixas para isso, mas manter a especificidade CSS baixa em todos os seletores é uma meta válida.

Em geral, baixa especificidade geral pode ser considerado como um sinal de que as coisas estão em relativa harmonia. Você não está lutando contra si mesmo e tem muito espaço para substituir estilos quando precisar.

Então, sendo uma meta válida a se ter em um projeto, como manter essa especificidade CSS baixa ao longo do tempo?

Atenha-se à classe que você precisa

Talvez você esteja escrevendo um seletor de alta especificidade (ou, mesmo, superqualificado) porque está substituindo um seletor já existente. Talvez o elemento que você esteja tentando selecionar está incluído em várias páginas, impondo que você o selecione a partir de uma classe de especificidade mais alta:

.section-header {
/* estilos */
}
body.about-page .section-header {
/* sobrescrita com especificidade mais alta */
}

A depender do projeto em que esse tipo de situação aconteça, essa solução pode (e deve) ser usada. Entretanto, ela pode não ser a melhor possível.

Caso você tenha o controle sobre as classes usadas nos elementos (ou possa solicitar a outro membro da equipe), uma solução que ajuda a manter a especificidade CSS baixa é usar um nome de classe novo:

.section-header {
/* estilos */
}
.about-section-header {
/* sobrescrita com a mesma especificidade */
/* possivelmente, estendendo a classe-padrão */
}

Considere a ordem de escrita do código

Além de uma classe que estende outra, como mostrado no exemplo acima, outra possibilidade é aplicar um nome de classe adicional para lidar com uma substituição de estilos.

<header class="section-header section-header-about">
</header>

Neste caso, os estilos de .section-header-about podem estar, na verdade, sobrescrevendo o da outra classe. Isso pode acontecer devido à ordem da regra na folha de estilos. Ambos os seletores têm exatamente a mesma especificidade, portanto, pelos efeito da Cascata CSS, neste conflito de seletores, vence o que for declarado por último.

Caso seja um projeto em algum caso específico, para consertar isso deve-se apenas garantir que, onde quer que você escreva sua classe de substituição, ela venha depois na ordem do código.

Usar metodologias e arquiteturas CSS geralmente ajuda a resolver esse problema meio que automaticamente, pois boas convenções de projeto são pensadas para evitar esse tipo de problema corriqueiro.

Reduza a especificidade do que se está substituindo

Você sabe o que dizem sobre deixar as coisas melhores do que você as encontrou: você deveria fazer isso. :)

Se houver um ID em um elemento e for assim que ele está sendo estilizado (usado como seletor), você pode removê-lo? Se você considerou fazer isso, eu gosto da maneira que você pensa, mas, definitivamente, faça uma pesquisa em todo o projeto por esse ID antes de fazê-lo.

E não limite essa pesquisa a apenas o código CSS. Esse ID pode estar sendo usado como um hook para algum JavaScript, por exemplo. Nesse caso, você não deve removê-lo e adicionar uma classe ou usar uma classe já existente de CSS para fazer o que deve ser feito.

Lembrando que usar Namespaces CSS (neste caso, o de JavaScript) já elimina esse problema de IDs usados indevidamente como hooks JS automaticamente.

Não tenha medo de usar classes CSS

Imagine um seletor como:

.module > h2 {
}

Isso vai funcionar bem até o dia em que você quiser um estilo especial para esse h2 — fora outras desvantagens, algumas vistas em nossa live sobre OOCSS.

Você também poderia optar por algo como:

<div class="module">
<h2 class="unique">
Header Especial
</h2>
</div>

Comparativamente:

.module > h2 {
/* estilos */
}
.unique {
/* vai perder no conflito de especificidade */
}
.module .unique {
/* vai funcionar, mas com especificidade diferente */
}

É por isso que as boas metodologias CSS (como BEM) recomendam um planejamento de classes mais plano:

<div class="module">
<h2 class="module-header"></h2>
<div class="module-content"></div>
</div>

Use a Cascata

À medida que um projeto evolui, torna-se cada vez mais perigoso alterar seletores de baixa especificidade, já que eles podem afetar mais coisas e desencadear consequências indesejadas.