DEV Community

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

Posted on

7 3 4 4 3

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:

Sentry blog image

How to reduce TTFB

In the past few years in the web dev world, we’ve seen a significant push towards rendering our websites on the server. Doing so is better for SEO and performs better on low-powered devices, but one thing we had to sacrifice is TTFB.

In this article, we’ll see how we can identify what makes our TTFB high so we can fix it.

Read more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs