← Back to course

Layout con Flexbox

Layout con Flexbox

Bentornato.

Nella lezione precedente hai imparato il box model.

Content.

Padding.

Border.

Margin.

La grande famiglia delle scatole.

Ora impariamo a posizionare quelle scatole bene nella pagina.

Qui entra Flexbox.

Flexbox è uno degli strumenti di layout più utili in CSS.

Ti aiuta ad allineare elementi in righe o colonne.

Ti aiuta a centrare cose.

Ti aiuta a creare navbar, card, pulsanti, sezioni e layout senza perdere completamente la testa.

Solo parzialmente.

Questo è ancora CSS.

Cosa Imparerai

In questa lezione imparerai:

Cos’è Flexbox?

Flexbox significa Flexible Box Layout.

È un sistema di layout CSS progettato per organizzare elementi in una direzione.

Quella direzione può essere:

Una row va da sinistra a destra.

Una column va dall’alto verso il basso.

Flexbox è perfetto quando vuoi allineare elementi in modo ordinato.

Per esempio:

Prima di Flexbox, centrare cose in CSS sembrava provare a convincere un gatto a seguire istruzioni.

Possibile?

Forse.

Piacevole?

No.

Crea il Progetto

Crea una cartella per questa lezione:

mkdir css-lesson5
cd css-lesson5
touch index.html
touch style.css

Dovresti avere:

css-lesson5/
  index.html
  style.css

Apri la cartella nel tuo editor.

Costruiremo una piccola landing page con navigazione e card.

È un buon esercizio per Flexbox.

Semplice.

Pratico.

Non un labirinto CSS misterioso.

Almeno non oggi.

Scrivi l’HTML

Apri index.html e aggiungi questo:

<!DOCTYPE html>
<html lang="it">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Layout con Flexbox</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <header class="site-header">
    <nav class="navbar">
      <h1 class="logo">FlexSite</h1>

      <div class="nav-links">
        <a href="#">Home</a>
        <a href="#">Corsi</a>
        <a href="#">Progetti</a>
        <a href="#">Contatto</a>
      </div>
    </nav>

    <section class="hero">
      <div class="hero-text">
        <h2>Impara Flexbox Senza Panico</h2>
        <p>Flexbox ti aiuta ad allineare e organizzare elementi con meno caos e meno sospiri drammatici.</p>
        <a href="#" class="button">Inizia a Imparare</a>
      </div>

      <div class="hero-box">
        <p>display: flex;</p>
      </div>
    </section>
  </header>

  <main class="page">
    <section class="cards">
      <article class="card">
        <h2>Allinea</h2>
        <p>Posiziona gli elementi esattamente dove vuoi.</p>
      </article>

      <article class="card">
        <h2>Distribuisci</h2>
        <p>Controlla lo spazio tra gli elementi.</p>
      </article>

      <article class="card">
        <h2>Organizza</h2>
        <p>Crea righe e colonne pulite.</p>
      </article>
    </section>
  </main>

  <footer class="site-footer">
    <p>Creato mentre imparo CSS Flexbox.</p>
  </footer>
</body>
</html>

Questa pagina ha:

Perfetta per praticare Flexbox.

Ora dobbiamo far comportare il layout.

Educatamente, se possibile.

Inizia con gli Stili Base

Apri style.css e aggiungi:

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  font-family: Arial, sans-serif;
  background-color: #f3f4f6;
  color: #111827;
}

a {
  color: inherit;
  text-decoration: none;
}

Questo ci dà:

Buona base.

Una cattiva base rende il layout doloroso.

Come costruire un sito su spaghetti bagnati.

Crea un Flex Container

Per usare Flexbox, aggiungi:

display: flex;

a un container.

Esempio:

.navbar {
  display: flex;
}

Il container diventa un flex container.

I figli diretti dentro diventano flex items.

In questo caso:

<nav class="navbar">
  <h1 class="logo">FlexSite</h1>
  <div class="nav-links">...</div>
</nav>

.navbar è il flex container.

.logo e .nav-links sono flex items.

Aggiungi questo:

.navbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  max-width: 1100px;
  margin: 0 auto;
  padding: 24px;
}

Ora logo e link stanno sulla stessa riga.

Il logo va a sinistra.

I link vanno a destra.

Flexbox sta già facendo un lavoro utile.

Sospettosamente utile.

Ma accettiamo.

Flex Direction

La proprietà flex-direction controlla la direzione principale.

Valore predefinito:

flex-direction: row;

Questo significa che gli elementi vanno da sinistra a destra.

Puoi anche usare:

flex-direction: column;

Questo significa che gli elementi vanno dall’alto verso il basso.

Esempio:

.hero {
  display: flex;
  flex-direction: row;
}

Questo posiziona i figli della hero uno accanto all’altro.

Aggiungi questo:

.hero {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 32px;
  max-width: 1100px;
  margin: 0 auto;
  padding: 64px 24px;
}

Ora il testo hero e la hero box stanno uno accanto all’altro.

Molto meglio di due blocchi tristi impilati senza piano.

justify-content

justify-content controlla l’allineamento sull’asse principale.

Se flex-direction è row, l’asse principale è orizzontale.

Valori comuni:

justify-content: flex-start;
justify-content: center;
justify-content: flex-end;
justify-content: space-between;
justify-content: space-around;
justify-content: space-evenly;

Nella navbar abbiamo usato:

justify-content: space-between;

Questo spinge gli elementi lontano tra loro.

Logo a sinistra.

Link a destra.

Come una buona navigation bar che conosce il suo lavoro.

Nella hero abbiamo usato anche:

justify-content: space-between;

Questo crea spazio tra testo e box.

Flexbox sta praticamente organizzando i mobili.

Finalmente qualcuno in CSS si comporta da adulto.

align-items

align-items controlla l’allineamento sull’asse secondario.

Se flex-direction è row, l’asse secondario è verticale.

Valori comuni:

align-items: flex-start;
align-items: center;
align-items: flex-end;
align-items: stretch;

Abbiamo usato:

align-items: center;

Questo centra gli elementi verticalmente.

Molto utile.

Molto comune.

Molto soddisfacente.

Centrare cose un tempo era una storia horror di CSS.

Flexbox l’ha resa molto meno drammatica.

Non completamente senza drammi.

Ma meno drammatica.

gap

La proprietà gap crea spazio tra flex items.

Esempio:

.nav-links {
  display: flex;
  gap: 20px;
}

Aggiungi questo:

.nav-links {
  display: flex;
  gap: 20px;
  font-weight: 700;
}

Ora i link di navigazione hanno spazio pulito.

Non serve aggiungere margin a ogni link.

Niente piccole battaglie di spacing.

Niente problema “perché l’ultimo elemento è strano?”.

gap è bellissimo.

CSS a volte ci fa regali.

Rari, ma reali.

Stilizza Header e Hero

Aggiungi questi stili:

.site-header {
  background-color: #111827;
  color: white;
}

.logo {
  margin: 0;
  font-size: 24px;
}

.hero-text {
  max-width: 560px;
}

.hero-text h2 {
  font-size: 48px;
  margin: 0 0 16px;
}

.hero-text p {
  color: #d1d5db;
  font-size: 20px;
  line-height: 1.7;
}

.button {
  display: inline-block;
  background-color: #2563eb;
  color: white;
  padding: 14px 20px;
  border-radius: 999px;
  font-weight: 700;
  margin-top: 16px;
}

Ora la hero sembra più una vera sezione.

Il pulsante è arrotondato.

Il testo è leggibile.

Il layout è strutturato.

Nessuno sta piangendo.

Ottimo progresso.

Centrare con Flexbox

Flexbox è famoso per centrare.

Per centrare qualcosa orizzontalmente e verticalmente:

.hero-box {
  display: flex;
  align-items: center;
  justify-content: center;
}

Aggiungi questo:

.hero-box {
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 260px;
  min-height: 180px;
  background-color: #1f2937;
  border: 2px solid #374151;
  border-radius: 24px;
  font-size: 22px;
  font-weight: 700;
}

Ora il testo dentro .hero-box è perfettamente centrato.

Questo è uno dei pattern Flexbox più utili.

Un piccolo miracolo.

Nessun rituale antico richiesto.

Nessuna candela CSS.

Nessuna tastiera sacrificata.

Card con Flexbox

Ora stilizziamo la sezione delle card.

Aggiungi:

.page {
  max-width: 1100px;
  margin: 40px auto;
  padding: 0 24px;
}

.cards {
  display: flex;
  gap: 24px;
}

.card {
  flex: 1;
  background-color: white;
  padding: 28px;
  border-radius: 18px;
  border: 2px solid #e5e7eb;
}

.card h2 {
  margin-top: 0;
}

.card p {
  color: #4b5563;
  font-size: 18px;
  line-height: 1.6;
}

Parte importante:

.card {
  flex: 1;
}

Questo dice a ogni card di prendere lo stesso spazio disponibile.

Tre card.

Stessa larghezza.

Layout pulito.

Nessun calcolo manuale.

CSS fa la matematica.

Cerca di non sembrare troppo sorpreso.

La Proprietà flex

La proprietà flex controlla come i flex items crescono o si riducono.

Questo:

flex: 1;

significa:

Lascia che questo elemento cresca e condivida lo spazio disponibile in modo uguale.

Se tutte le card hanno flex: 1, diventano della stessa larghezza.

Esempio:

.card {
  flex: 1;
}

È molto utile per card, colonne e sezioni.

Ma non usare flex: 1 ovunque senza pensare.

Gli strumenti CSS sono potenti.

Un martello è utile.

Ma non ti lavi i denti con quello.

Footer

Aggiungi:

.site-footer {
  text-align: center;
  padding: 32px 24px;
  color: #6b7280;
}

Footer semplice.

Senza drammi.

A volte è il miglior tipo di footer.

CSS Completo

Il tuo style.css dovrebbe essere così:

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  font-family: Arial, sans-serif;
  background-color: #f3f4f6;
  color: #111827;
}

a {
  color: inherit;
  text-decoration: none;
}

.site-header {
  background-color: #111827;
  color: white;
}

.navbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  max-width: 1100px;
  margin: 0 auto;
  padding: 24px;
}

.logo {
  margin: 0;
  font-size: 24px;
}

.nav-links {
  display: flex;
  gap: 20px;
  font-weight: 700;
}

.hero {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 32px;
  max-width: 1100px;
  margin: 0 auto;
  padding: 64px 24px;
}

.hero-text {
  max-width: 560px;
}

.hero-text h2 {
  font-size: 48px;
  margin: 0 0 16px;
}

.hero-text p {
  color: #d1d5db;
  font-size: 20px;
  line-height: 1.7;
}

.button {
  display: inline-block;
  background-color: #2563eb;
  color: white;
  padding: 14px 20px;
  border-radius: 999px;
  font-weight: 700;
  margin-top: 16px;
}

.hero-box {
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 260px;
  min-height: 180px;
  background-color: #1f2937;
  border: 2px solid #374151;
  border-radius: 24px;
  font-size: 22px;
  font-weight: 700;
}

.page {
  max-width: 1100px;
  margin: 40px auto;
  padding: 0 24px;
}

.cards {
  display: flex;
  gap: 24px;
}

.card {
  flex: 1;
  background-color: white;
  padding: 28px;
  border-radius: 18px;
  border: 2px solid #e5e7eb;
}

.card h2 {
  margin-top: 0;
}

.card p {
  color: #4b5563;
  font-size: 18px;
  line-height: 1.6;
}

.site-footer {
  text-align: center;
  padding: 32px 24px;
  color: #6b7280;
}

Salva.

Aggiorna.

La pagina dovrebbe ora avere:

Questo è Flexbox che fa il suo lavoro.

Potente in silenzio.

Come uno sviluppatore che ha sistemato production e non si è vantato.

Creatura rara.

Errori Comuni

Aggiungere display flex all’elemento sbagliato

Flexbox lavora sui figli diretti.

Se scrivi:

.card {
  display: flex;
}

questo influenza i figli dentro .card.

Non organizza le card tra loro.

Per organizzare le card, aggiungi Flexbox al loro parent:

.cards {
  display: flex;
}

Il parent controlla i figli.

Questa frase spiega metà Flexbox.

E forse un po’ di psicologia familiare.

Dimenticare gap

Senza gap, gli elementi possono toccarsi.

Male:

.cards {
  display: flex;
}

Meglio:

.cards {
  display: flex;
  gap: 24px;
}

La spaziatura conta.

Senza spazio, il layout sembra affollato.

Come se tutti fossero arrivati alla stessa festa e fossero rimasti in cucina.

Usare Flexbox per tutto

Flexbox è ottimo per layout a una dimensione.

Righe o colonne.

Ma per layout completi a due dimensioni, CSS Grid spesso è meglio.

Flexbox non è sbagliato.

Semplicemente non è la risposta a ogni domanda.

Non usare un cacciavite per mangiare la zuppa.

Pratica

Crea una pagina con:

Usa Flexbox per:

Usa queste proprietà:

Cambia i valori e osserva cosa succede.

CSS diventa comprensibile quando sperimenti.

Non quando lo fissi come se ti dovesse dei soldi.

Mini Sfida

Crea una sezione pricing con tre piani:

Ogni piano deve essere una card.

Usa Flexbox così le card stanno in una riga.

Dai a ogni card la stessa larghezza con:

flex: 1;

Fai risaltare la card Premium.

Aggiungi un pulsante dentro ogni card.

Poi centra l’area del pulsante usando Flexbox.

Questo è Flexbox reale.

Card.

Pulsanti.

Spaziatura.

Allineamento.

Il pane quotidiano del frontend development.

A volte croccante.

Ma utile.

Riassunto

Oggi hai imparato che:

Flexbox è uno degli strumenti CSS più importanti.

Imparalo bene.

Usalo spesso.

Ma non usarlo per tutto.

Anche la pizza non va mangiata con un martello.

Prossima Lezione

Nella prossima lezione impareremo CSS Grid.

Flexbox è ottimo per una direzione.

Grid è potente per righe e colonne insieme.

Il regno dei layout si espande.