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:
| Dichiarazione | Sopra | Destra | Sotto | Sinistra |
|---|---|---|---|---|
margin: 10px; | 10 | 10 | 10 | 10 |
margin: 10px 20px; | 10 | 20 | 10 | 20 |
margin: 10px 20px 30px; | 10 | 20 | 30 | 20 |
margin: 10px 20px 30px 40px; | 10 | 20 | 30 | 40 |
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:
| Valore | Esempio | Note |
|---|---|---|
| Lunghezza | 16px, 1.5rem | Il più comune |
| Percentuale | 5% | Della larghezza del blocco contenitore, per tutti e quattro i lati |
auto | margin: 0 auto | Il browser riempie lo spazio rimasto |
| Negativo | margin-top: -10px | Avvicina 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-rootsul genitore (a differenza dioverflow: 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 autosu un elemento senza larghezza. Un blocco riempie già il suo contenitore; imposta unwidtho unmax-width.margin: autosu un elemento inline. I margini auto suspan,ao unimglasciato inline valgono 0. Rendilodisplay: block.- Sommare due margini verticali e aspettarsi il totale. Collassano al più grande; usa
gapin 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-rootal 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.