DEV Community

Cover image for BEM com nesting nativo V2 - ainda mais poderoso 🔥
Camilo Micheletto
Camilo Micheletto

Posted on

BEM com nesting nativo V2 - ainda mais poderoso 🔥

Recentemente o WhatIsLove Dev escreveu um artigo muito massa explicando como escrever modificadores BEM de forma muito parecida com a que fazemos no Sass usando apenas CSS pur. Abaixo, exemplo extraído do seu próprio site.

.tag-list__tag {
  --background-color: var(--color-red-200);

  padding-block: 2px;
  padding-inline: 6px;
  background-color: hsl(var(--background-color) / 30%);

  &[class*='--html'] {
    --background-color: var(--color-green-100);
  }

  &[class*='--github'] {
    --background-color: var(--color-gray-100);
  }

  &[class*='--ts'] {
    --background-color: var(--color-blue-200);
  }
}

Enter fullscreen mode Exit fullscreen mode

Pra aplicar o modificador basta declarar a classe base e a classe modificadora no mesmo elemento, típico:

<aside class="aside box">
  <span class="aside__border aside__border--top">
    <!-- omitido -->
  </span>
</aside>

Enter fullscreen mode Exit fullscreen mode

Ai eu pensei:

Pô, massa, mas seria ainda mais legal se eu escrevesse só a classe modificada né? Afinal o prefixo da classe modifier é a classe base (block).

Pois bem.


Sufixo e prefixo

A ideia é simples: o sufixo vai se referir sempre à classe base, o prefixo aos seus modificadores. O attribute selector dá suporte à busca no início e no fim da string, logo basta fazer nesting do sufixo dentro do prefixo.

Dado uma classe .card que possuí os modificadores .card--brand e .card--grey.

:where([class^="card"]) {
  &[class*="--grey"] {}
  &[class*="--brand"] {}
}
Enter fullscreen mode Exit fullscreen mode
  • :where([class^="card"]) - Captura o prefixo (block) do elemento
  • &[class*="--grey"] - Captura o sufixo (element / modifier) do elemento

meme do xablau

XABLAU

Pontos negativos da técnica

  • O seletor de atributo é um seletor caro pra performance pois além de realizar a busca na árvore de elementos ele ainda faz uma comparação de substring
  • Além da colisão de nomes de classe, teremos colisão de sufixos também, ou seja, o dobro de cuidado na nomenclatura.

Enfim, codepen pra vocês brincarem:

Top comments (0)