Vai al contenuto principale
Categorie articolo: Code

BEM + SCSS: un piccolo tutorial per dev furbi

22 Ottobre 2025 - 5 minuti di lettura

Ammettiamolo: la gestione del CSS non è tra le attività preferite della maggior parte degli sviluppatori.

Esiste però un approccio che rende il lavoro più semplice, ordinato e scalabile: BEM.

BEM introduce una struttura chiara e modulare, che mantiene il codice CSS leggibile anche nei progetti più complessi. Con questo metodo diventa facile capire dove e come vengono applicati gli stili, evitando sovrascritture indesiderate. E se lo combini con SCSS, puoi costruire una base di stile solida e scalabile, paragonabile a una API ben progettata.

In questo articolo entro un po’ più nel dettaglio di BEM e come poterlo usare in combo con SCSS, proponendoti due esempi per i linguaggi React e Angular.

BEM in due parole (anzi tre)

BEM sta per Block, Element, Modifier e sostanzialmente è un sistema di naming per il codice HTML e CSS che aiuta a:

  • mantenere il codice leggibile;
  • organizzare meglio i componenti;
  • evitare conflitti di stile;
  • scrivere SCSS scalabile e riutilizzabile.

Vediamo meglio il significato di ognuno dei tre pillar Block, Element e Modifier.

Con Block si intende un componente autonomo e riutilizzabile, per esempio

<div class="card">...</div>

Element è una parte del blocco, che “non ha vita propria”. Esempio:

<div class="card__title">Titolo</div>

Ultimo, ma non meno importante, abbiamo Modifier che rappresenta una variazione del blocco o dell’elemento:

<div class="card card--featured">...</div>

BEM + SCSS: un esempio

Per te, un esempio di codice HTML e CSS scritto applicando l’approccio BEM.

<div class="card card--highlighted">
    <h2 class="card__title">Titolo</h2>
    <p class="card__text">Testo</p>
    <a class="card__button card__button--primary">Scopri</a>
</div>

Questo invece, un blocco scritto utilizzando il formato SCSS.

.card {
  &--highlighted { ... }

  &__title { ... }
  &__text { ... }

  &__button {
    &--primary { ... }
    &--secondary { ... }
  }
}

Come ho scritto a inizio articolo, il codice risulta più ordinato, leggibile e modulare.

Ma quindi, perché adottare l’approccio con BEM?

BEM può davvero fare la differenza nei progetti di media e grande dimensione:

  • il CSS resta modulare, evitando conflitti tra componenti;
  • i nomi delle classi sono semantici e chiari — non più .big-blue-button-v2-ne;
  • è facile riutilizzare componenti da un progetto all’altro, senza complicazioni;
  • funziona perfettamente sia in team piccoli che in gruppi più numerosi;
  • risulta più semplice e coerente rispetto ad altri approcci come SMACSS o OOCSS.

Per convincerti ulteriormente su BEM e SCSS, eccoti due esempi per React e Angular.

L’approccio BEM applicato in React e Angular

Il seguente codice definisce un componente React applicando la metodologia BEM.

export default function Card({ title, isFeatured }) {
 return (
    <div className={`card ${isFeatured ? 'card--featured' : ''}`}>
      <h2 className="card__title">{title}</h2>
      <p className="card__description">Testo descrittivo</p>
      <button className="card__button card__button--primary">
        Vai
      </button>
    </div>
  );
}

In Angular invece, BEM è applicato come nell’esempio seguente che definisce il componente card.component.html.

<div class="card" [ngClass]="{ 'card--featured': isFeatured }">
  <h2 class="card__title">{{ title }}</h2>
  <p class="card__text">Descrizione</p>
  <button class="card__button card__button--secondary">Aziona</button>
</div>

Alcuni errori classici da evitare con BEM

Errore Corretto Spiegazione
`.menu__list__item` `.menu__item` Evita elementi annidati (`__list__item`): con BEM esiste un solo livello di `__element`.
`.item` senza `.menu` `.menu__item` L’element deve sempre appartenere a un block, non può esistere da solo.
`.menu--active` su `.menu__item` `.menu__item--active` I modifier si applicano all’element o al block giusto, non vanno “spostati”.
`.menu__item` fuori da `.menu` Solo dentro `.menu` Gli element devono sempre essere contenuti nei rispettivi block.
`.block--modifier` usato da solo Sempre insieme a `.block` Il modifier non sostituisce il block: lo estende o ne modifica lo stato.

 

Adottando l’approccio BEM nei file del progetto avrai sicuramente un naming più chiaro oltre che:

  • una gerarchia visiva solamente leggendo i nomi;
  • sapere dove “vive” ogni classe;
  • poter riutilizzare con facilità i componenti.

Next step con BEM

Puoi combinare la metodologia BEM con diverse direttive di SCSS per migliorare la modularità e la manutenzione del codice:

  • @mixin per generare modificatori in modo dinamico;
  • @extend %placeholders per riutilizzare gli stili di base;
  • @use / @forward per organizzare una struttura SCSS più modulare e scalabile.

Qualche tip prima di salutarti

  • Evita di riflettere la struttura del DOM nei nomi delle classi. Anche se elem3 si trova all’interno di elem2, che a sua volta è contenuto in elem1, utilizza comunque la sintassi block__elem3. Meno dipendenze significa meno complessità e maggiore manutenibilità.
  • Se devi modificare il layout in base alla dimensione dello schermo, utilizza i modifier con JavaScript o le media queries, ma evita nomi come sidebar-left: il layout potrebbe cambiare, e quel “left” potrebbe facilmente finire a destra.
  • Non combinare tag e classi nei selettori CSS (ad esempio button.button--red), poiché questo aumenta la specificità e rende più difficile applicare gli override in modo efficace.

Conclusione

BEM è il Marie Kondō del CSS: porta ordine, chiarezza e coerenza nel tuo codice. Non è una regola assoluta, ma una metodologia intelligente per strutturare in modo pulito e scalabile i tuoi stylesheet.
In combinazione con SCSS, diventa uno strumento ancora più potente per migliorare la manutenzione e la leggibilità del codice.

Articolo scritto da