La risposta breve
Per centrare un div sia in orizzontale sia in verticale dentro il suo genitore, trasforma il genitore in una griglia e centrane il contenuto:
.parent {
display: grid;
place-items: center;
min-height: 200px; /* the parent needs room to center in */
}
Funziona con un figlio di qualsiasi dimensione e non richiede nulla sul figlio. Qui sotto trovi sei metodi a confronto. Ogni box si misura dopo il rendering e stampa quanto dista il suo centro dal centro del genitore:
Tutti e sei riportano 0px su entrambi gli assi (il bordo di 1px del contenitore è uguale su ogni lato, quindi non sposta il centro). Cambia la larghezza o il testo di un box ed eseguilo di nuovo: i metodi che non dipendono da una dimensione fissa restano a 0.
Quale metodo usare
| Metodo | Centra | Serve una dimensione fissa al figlio? | Ideale per |
|---|---|---|---|
Grid place-items: center | Entrambi gli assi | No | La scelta predefinita: un figlio in un box |
Flexbox justify-content + align-items | Entrambi gli assi | No | Una riga o colonna di elementi, centrati come gruppo |
margin: auto in un genitore flex o grid | Entrambi gli assi | No | Centrare un elemento mentre i suoi fratelli sono disposti in altro modo |
margin: 0 auto | Solo in orizzontale | Un width o max-width | Contenitori di pagina, articoli, moduli nel flusso normale |
Absolute + translate(-50%, -50%) | Entrambi gli assi | No | Overlay, badge e modali sopra altri contenuti |
Absolute + inset: 0; margin: auto | Entrambi gli assi | Sì, larghezza e altezza | Finestre di dialogo a dimensione fissa |
align-content: center su un blocco | In verticale | No | Centraggio verticale senza cambiare il display del genitore |
Metodo 1: flexbox
Flexbox centra lungo due assi con due proprietà. justify-content gestisce l'asse principale (orizzontale in una riga), e align-items l'asse trasversale:
Con più figli, flexbox li centra come gruppo, mantenendoli in riga. È qui che batte grid, che impilerebbe i tre elementi in un'unica colonna centrata. La pagina su justify-content spiega tutti i valori di allineamento.
Metodo 2: grid
place-items: center è la forma abbreviata di align-items: center più justify-items: center. Su un contenitore grid con un solo figlio, centra quel figlio in entrambe le direzioni:
min-height invece di height permette al genitore di crescere se la scheda diventa più alta di 180px, invece di far uscire la scheda.
Metodo 3: margin: 0 auto (orizzontale)
Un elemento di blocco con una larghezza minore del suo contenitore si può centrare in orizzontale con margini laterali automatici. Il browser divide lo spazio libero in parti uguali tra i due lati:
Il secondo box occupa tutta la larghezza, quindi non c'è spazio libero e non si sposta nulla. È il motivo più comune per cui margin: 0 auto "non funziona". Inoltre nel flusso normale centra solo in orizzontale; lì i margini verticali auto diventano 0. Dentro un genitore flex o grid, invece, margin: auto centra in entrambe le direzioni, ed è il terzo box del confronto qui sopra.
Metodo 4: posizione assoluta e transform
Quando l'elemento deve stare sopra altri contenuti (un badge su una foto, una modale sopra la pagina), posizionalo in modo assoluto al 50% e riportalo indietro di metà della sua dimensione:
top: 50%; left: 50% mette l'angolo in alto a sinistra dell'elemento al centro. Le percentuali in translate() si riferiscono alla dimensione dell'elemento stesso, quindi -50% lo riporta indietro di metà della sua larghezza e altezza, qualunque esse siano. Il genitore deve essere posizionato (position: relative), altrimenti l'elemento si centra rispetto alla pagina. Il posizionamento è spiegato nella pagina su position.
Una variante per elementi di dimensione nota: position: absolute; inset: 0; margin: auto; più un width e un height. I margini automatici si dividono lo spazio su tutti e quattro i lati.
Metodo 5: align-content su un blocco normale
align-content: center ora funziona anche sui normali contenitori di blocco, non solo su quelli flex e grid. Centra il contenuto in verticale senza cambiare il modo in cui sono disposti i figli:
.parent {
min-height: 200px;
align-content: center; /* vertical centering, still display: block */
}
.child {
max-width: 300px;
margin-inline: auto; /* horizontal centering */
}
È supportato nelle versioni attuali di Chrome, Firefox e Safari. I browser più vecchi lo ignorano, quindi usa grid se devi supportarli.
Centrare in tutto lo schermo
Per centrare una finestra di dialogo nel viewport indipendentemente dallo scorrimento, combina uno strato fisso a schermo intero con grid:
.overlay {
position: fixed;
inset: 0; /* covers the viewport */
display: grid;
place-items: center;
background: rgb(0 0 0 / 50%);
}
Per centrare in verticale il contenuto di un'intera pagina, usa min-height: 100dvh sul genitore invece di 100vh: sui telefoni, 100vh include l'area dietro le barre del browser, quindi il "centro" finisce troppo in basso.
Centrare il testo è un altro compito
Tutto ciò che hai visto sopra centra un box. Per centrare il testo dentro un box, usa text-align: center sul box, come mostra la pagina su come centrare il testo in HTML. Spesso servono entrambi: grid per centrare la scheda e text-align per centrare le righe al suo interno.
Errori comuni
- Un genitore senza altezza. Il centraggio verticale richiede spazio libero; un genitore che si restringe al contenuto non ne ha.
margin: 0 autosu un blocco a tutta larghezza. Prima dagli unwidtho unmax-width.margin: autoper centrare in verticale nel flusso normale. Lì i margini verticali automatici valgono 0; usa flex o grid.- Centraggio assoluto senza un genitore posizionato. L'elemento si centra nella pagina, non nel box.
align-items: centersul figlio. Le proprietà di allineamento vanno sul genitore (il contenitore flex o grid), trannemargin: autoealign-self.text-align: centerper centrare un blocco. Centra il contenuto inline (testo, immagini, figli inline-block), non un figlio di blocco.
Domande frequenti
Come centro un div in orizzontale e in verticale?
Trasforma il genitore in una griglia e centrane il contenuto: .parent { display: grid; place-items: center; }. La versione con flexbox è display: flex; justify-content: center; align-items: center;. In entrambi i casi il genitore deve avere un'altezza maggiore del div.
Come centro un div solo in orizzontale?
Dagli una larghezza e margini laterali automatici: .box { width: 300px; margin: 0 auto; } (oppure max-width per un blocco responsive). margin-inline: auto è la stessa cosa con le proprietà logiche.
Perché margin: 0 auto non centra il mio div?
Il div non ha una larghezza minore del suo contenitore, quindi non c'è spazio libero da dividere (per impostazione predefinita un blocco occupa tutta la larghezza). Imposta width o max-width. Inoltre non ha effetto sugli elementi inline e nel flusso normale non centra mai in verticale.
Perché il mio div non si centra in verticale?
Il genitore è alto solo quanto il suo contenuto, quindi non c'è spazio in più in cui centrare. Dai un'altezza al genitore (o un min-height), poi usa il centraggio con grid o flexbox.
Qual è il modo più semplice per centrare un div?
display: grid; place-items: center; sul genitore: due dichiarazioni, entrambi gli assi, un figlio di qualsiasi dimensione. Usa flexbox quando il genitore dispone anche altri elementi in riga.
Come centro il testo dentro un div?
Usa text-align: center sul div per il testo e il contenuto inline. Centrare il div e centrare il testo al suo interno sono due compiti separati.