CSS Grid vs Flexbox: quale scegliere e quando usarli

CSS Grid vs Flexbox: quale scegliere e quando usarli

Loading

Quando si deve creare un layout moderno, la scelta tra CSS Grid e Flexbox è una delle domande più frequenti. Entrambi sono potenti, ma servono scopi diversi. In questo articolo vediamo differenze, esempi pratici e quando usare l’uno o l’altro.

Tabella confronto rapido

CaratteristicaFlexboxCSS Grid
Direzione1D (riga o colonna)2D (griglia completa)
AllineamentoFacile (spazio, centro)Più complesso
ResponsiveBuonoOttimo
Esempio idealeNav, card orizzontaliLayout pagina completa
Browser support97%+96%+

Cos’è Flexbox

Flexbox è progettato per distribuire spazio lungo un asse (orizzontale o verticale). È perfetto per:

.nav {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

Risultato: Menu nav con elementi distribuiti uniformemente.

Cos’è CSS Grid

CSS Grid crea layout bidimensionali (righe + colonne). Controlli posizione esatta di ogni elemento.

.grid-container {
  display: grid;
  grid-template-columns: 1fr 2fr 1fr;
  grid-template-rows: auto 1fr auto;
  gap: 20px;
}

Risultato: Layout 3 colonne con righe definite.

Quando usare Flexbox (4 casi)

1. Navigazione orizzontale

.navbar {
  display: flex;
  justify-content: space-around;
  padding: 1rem;
}

2. Card in fila

css.cards {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
}

3. Centratura semplice

.centrato { 
   display: flex;
   justify-content: center;
   align-items: center;
   height: 100vh;
}

4. Sidebar + contenuto

.layout {
  display: flex;
  min-height: 100vh;
}
.sidebar { flex: 0 0 250px; }
.main { flex: 1; }

Quando usare CSS Grid (4 casi)

1. Layout pagina completa

.page {
  display: grid;
  grid-template-areas: 
    "header header"
    "sidebar main"
    "footer footer";
  grid-template-columns: 250px 1fr;
  grid-template-rows: auto 1fr auto;
  min-height: 100vh;
}
.header { grid-area: header; }

2. Galleria immagini responsive

.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 1rem;
}

3. Dashboard con KPI

dashboard {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(3, auto);
  gap: 20px;
}

4. Hero section complessa

hero {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: auto 1fr auto;
  grid-template-areas: 
    "testo img"
    "testo img"
    "cta cta";
}

Esempi pratici da copiare

Flexbox: Nav responsive

<nav class="navbar">
  <div class="logo">LOGO</div>
  <ul class="menu">
    <li>Home</li>
    <li>Chi siamo</li>
    <li>Contatti</li>
  </ul>
</nav>

<style>
.navbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1rem 2rem;
  background: #333;
  color: white;
}
.menu { 
  display: flex; 
  list-style: none; 
  gap: 2rem; 
}
</style>

Grid: Layout blog post

<article class="post">
  <header class="post-header">Header</header>
  <aside class="post-sidebar">Sidebar</aside>
  <main class="post-content">Contenuto</main>
  <footer class="post-footer">Footer</footer>
</article>

<style>
.post {
  display: grid;
  grid-template-columns: 250px 1fr;
  grid-template-rows: auto 1fr auto;
  grid-template-areas: 
    "header header"
    "sidebar content"
    "footer footer";
  min-height: 100vh;
  gap: 2rem;
  padding: 2rem;
}
</style>

Browser support 2026

BrowserFlexboxGrid
Chrome 99%✅ dal 2013✅ dal 2017
Firefox 99%✅ dal 2012✅ dal 2017
Safari 98%✅ dal 2013✅ dal 2017
Edge 99%✅ dal 2015✅ dal 2017

Sicuri ovunque dal 2020+.

Performance

  • Flexbox: Leggermente più veloce per layout semplici
  • Grid: Più potente, overhead minimo
  • Differenza pratica: Irrilevante per siti normali

Regola pratica: quale scegliere

  1. Nav, pulsanti, card orizzontali → FLEXBOX
  2. Layout pagina, gallerie, dashboard → GRID
  3. Layout complessi → GRID
  4. Allineamento semplice → FLEXBOX
  5. Non sai quale? → Prova entrambi!

Errori comuni

❌ Flexbox per layout 2D

/* SBAGLIATO: Flexbox per griglia */
.container {
  display: flex;
  flex-wrap: wrap; /* Complicato */
}

❌ Grid per allineamento 1D

/* SBAGLIATO: Grid per nav semplice */
.nav {
  display: grid; /* Troppo complesso */
  grid-template-columns: repeat(5, 1fr);
}

Conclusione

Flexbox = allineamento 1D, nav, card semplici.
Grid = layout 2D, pagine complete, gallerie.

Regola d’oro: Se devi controllare solo righe OPPURE solo colonne → Flexbox. Se devi controllare righe E colonne → Grid.

Se vuoi approfondire come creare griglie davvero flessibili, leggi anche l’articolo su CSS Grid responsive con minmax(), auto-fit e auto-fill.