Menu

CSS margin: shorthand, margin auto e collasso dei margini

Il margin è lo spazio trasparente fuori dal bordo di un elemento che allontana gli altri elementi. Impara la forma abbreviata di margin, come centrare con margin: 0 auto, i margini negativi, margin auto in flexbox e perché i margini verticali collassano.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Cos'è il margin

Il margin è lo spazio fuori dal bordo di un elemento. È sempre trasparente e il suo compito è allontanare gli altri elementi. Nell'esempio, il contenitore grigio si vede attraverso il margin intorno al riquadro blu:

La fascia grigia non fa parte del riquadro: lo sfondo del riquadro si ferma al suo bordo. Per uno spazio che prende lo sfondo dell'elemento, usa il padding.

La forma abbreviata di margin

margin accetta da uno a quattro valori, nello stesso ordine in senso orario del padding:

DichiarazioneSopraDestraSottoSinistra
margin: 10px;10101010
margin: 10px 20px;10201020
margin: 10px 20px 30px;10203020
margin: 10px 20px 30px 40px;10203040

Ogni lato ha anche la sua proprietà (margin-top, margin-right, margin-bottom, margin-left) e le versioni logiche che seguono la direzione del testo (margin-inline-start, margin-inline-end, margin-block, margin-inline).

A differenza del padding, il margin accetta auto e valori negativi:

ValoreEsempioNote
Lunghezza16px, 1.5remIl più comune
Percentuale5%Della larghezza del blocco contenitore, per tutti e quattro i lati
automargin: 0 autoIl browser riempie lo spazio rimasto
Negativomargin-top: -10pxAvvicina l'elemento o il suo vicino, può sovrapporsi

Centrare con margin: 0 auto

margin: 0 auto è il modo classico per centrare un blocco in orizzontale. auto su entrambi i lati dice al browser di dividere in parti uguali lo spazio rimasto. Serve una larghezza minore del contenitore, altrimenti non resta niente da dividere:

Nel flusso normale i margini auto non centrano in verticale (i margini auto verticali diventano 0) e non fanno niente sugli elementi inline. Per una panoramica completa su come centrare, vedi come centrare un div.

Il collasso dei margini

Quando due margini verticali si toccano, non si sommano. Il browser tiene solo il più grande. Qui il primo riquadro ha margin-bottom: 30px e il secondo margin-top: 20px, e lo spazio tra loro è 30px, non 50px:

Il collasso è voluto: permette a paragrafi e titoli di portarsi dietro la propria spaziatura senza raddoppiarla dove si incontrano. Coglie di sorpresa in un secondo caso, quando il margine superiore di un figlio esce dal genitore:

Nel primo genitore, il margine di 30px del figlio è collassato attraverso il bordo superiore del genitore, quindi spinge in basso l'intero genitore invece di creare spazio grigio al suo interno. Una qualsiasi di queste soluzioni lo impedisce:

  • display: flow-root sul genitore (a differenza di overflow: hidden, non taglia niente).
  • Padding o un bordo sul lato superiore del genitore.
  • Un genitore flex o grid: i margini degli elementi flex e grid non collassano mai.

I margini orizzontali non collassano mai, e nemmeno quelli degli elementi flottanti o posizionati in modo assoluto.

Margini negativi

Un margine negativo tira nella direzione opposta. Sul lato superiore o iniziale sposta l'elemento stesso; sul lato inferiore o finale avvicina l'elemento successivo. I riquadri possono sovrapporsi:

margin auto in flexbox

Dentro un contenitore flex, un margine auto prende tutto lo spazio libero dal suo lato. È il modo più semplice per spingere un elemento all'estremità opposta di una riga, e in flexbox auto funziona anche in verticale:

margin-inline-start: auto mette lo spazio libero prima di "Log in", alla fine della riga, sia nelle pagine da sinistra a destra sia in quelle da destra a sinistra.

Errori comuni

  • margin: 0 auto su un elemento senza larghezza. Un blocco riempie già il suo contenitore; imposta un width o un max-width.
  • margin: auto su un elemento inline. I margini auto su span, a o un img lasciato inline valgono 0. Rendilo display: block.
  • Sommare due margini verticali e aspettarsi il totale. Collassano al più grande; usa gap in flex o grid, oppure usa sempre una sola direzione di margine.
  • Il margine di un figlio che spinge il genitore. È il collasso tra genitore e figlio; aggiungi display: flow-root al genitore.
  • Usare il margin per uno spazio che dovrebbe avere uno sfondo. Il margin è trasparente; usa il padding.

Domande frequenti

Cos'è il margin in CSS?

Il margin è lo spazio fuori dal bordo di un elemento. È trasparente e allontana gli elementi vicini. Si imposta con margin o con le proprietà dei singoli lati margin-top, margin-right, margin-bottom e margin-left.

Cosa fa margin: 0 auto?

Imposta a 0 i margini superiore e inferiore e divide in parti uguali lo spazio orizzontale rimasto tra il margine sinistro e quello destro, e così centra in orizzontale un elemento di blocco. L'elemento deve avere una larghezza minore del suo contenitore, per esempio max-width: 600px.

Perché margin auto non centra il mio elemento?

Di solito perché l'elemento non ha una larghezza (un blocco riempie il contenitore, quindi non c'è niente da dividere), oppure perché è inline (span, a, img per impostazione predefinita), dove i margini auto valgono 0. Dagli una larghezza e display: block, oppure centralo dal genitore con flexbox o grid.

Cos'è il collasso dei margini?

Quando due margini verticali si toccano, per esempio il margine inferiore di un paragrafo e quello superiore del successivo, il browser usa solo il più grande invece di sommarli. Succede solo ai margini verticali dei blocchi nel flusso normale, non nei layout flex o grid.

Il margin può essere negativo?

Sì. Un margine negativo tira l'elemento verso quel lato, oppure tira l'elemento successivo sopra di lui, quindi i riquadri possono sovrapporsi. È utile per piccole correzioni di allineamento e per far uscire un elemento dal padding del suo contenitore.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA