Flexbox: centrare orizzontalmente e verticalmente


672

Come centrare div orizzontalmente e verticalmente all'interno del contenitore usando flexbox. Nell'esempio seguente, desidero ogni numero uno sotto l'altro (in righe), che sono centrati orizzontalmente.

.flex-container {
  padding: 0;
  margin: 0;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: center;
}
row {
  width: 100%;
}
.flex-item {
  background: tomato;
  padding: 5px;
  width: 200px;
  height: 150px;
  margin: 10px;
  line-height: 150px;
  color: white;
  font-weight: bold;
  font-size: 3em;
  text-align: center;
}
<div class="flex-container">
  <div class="row">
    <span class="flex-item">1</span>
  </div>
  <div class="row">
    <span class="flex-item">2</span>
  </div>
  <div class="row">
    <span class="flex-item">3</span>
  </div>
  <div class="row">
    <span class="flex-item">4</span>
  </div>
</div>

http://codepen.io/anon/pen/zLxBo



Nel tuo CSS non hai row{alcun effetto sulle righe. Se lo cambi al .row{risultato sarebbe totalmente diverso.
Hamid Mayeli,

Risposte:


753

Penso che tu voglia qualcosa di simile al seguente.

html, body {
    height: 100%;
}
body {
    margin: 0;
}
.flex-container {
    height: 100%;
    padding: 0;
    margin: 0;
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    align-items: center;
    justify-content: center;
}
.row {
    width: auto;
    border: 1px solid blue;
}
.flex-item {
    background-color: tomato;
    padding: 5px;
    width: 20px;
    height: 20px;
    margin: 10px;
    line-height: 20px;
    color: white;
    font-weight: bold;
    font-size: 2em;
    text-align: center;
}
<div class="flex-container">
    <div class="row"> 
        <div class="flex-item">1</div>
        <div class="flex-item">2</div>
        <div class="flex-item">3</div>
        <div class="flex-item">4</div>
    </div>
</div>

Guarda la demo su: http://jsfiddle.net/audetwebdesign/tFscL/

Gli .flex-itemelementi devono essere a livello di blocco ( divanziché span) se si desidera che l'altezza e l'imbottitura superiore / inferiore funzionino correttamente.

Inoltre, su .row, imposta la larghezza su autoinvece di 100%.

Le tue .flex-containerproprietà vanno bene.

Se si desidera .rowcentrare verticalmente nella porta della vista, assegnare l'altezza del 100% a htmle body, e anche azzerare i bodymargini.

Si noti che .flex-containerper vedere l'effetto dell'allineamento verticale è necessaria un'altezza, altrimenti il ​​contenitore calcola l'altezza minima necessaria per racchiudere il contenuto, che in questo esempio è inferiore all'altezza della porta di visualizzazione.

Nota in calce:
Il flex-flow, flex-direction, flex-wrapproprietà avrebbe potuto fare questo disegno più facile da implementare. Penso che il .rowcontenitore non sia necessario a meno che tu non voglia aggiungere un po 'di stile attorno agli elementi (immagine di sfondo, bordi e così via).

Una risorsa utile è: http://demo.agektmr.com/flexbox/


5
Gli articoli Flex non devono necessariamente essere a livello di blocco a meno che il contenuto in essi contenuto non lo richieda. Inoltre, hai aggiunto il prefisso a tutte le proprietà di visualizzazione, ma non hai aggiunto il prefisso a nessuna delle altre proprietà Flexbox (che hanno nomi diversi nelle altre bozze).
cimmanon,

1
@cimmanon Sono d'accordo con te sul livello di blocco e ho modificato il mio post di conseguenza. Il livello di blocco non è necessario per l'allineamento, ma può essere necessario se l'utente desidera specificare l'altezza e così via. Mi sono preso la libertà riguardo ai prefissi del browser, ho appena assunto un browser perfetto per il gusto di arrivare a una demo funzionante. Grazie ancora per il tuo commento, apprezzo il feedback.
Marc Audet,

1
Se trabocca, ritaglia la parte superiore. i.imgur.com/3dgFfQK.png Un modo per evitarlo?
Brian Gates,

1
@BrianGates Se l'altezza della finestra è troppo corta, come si desidera visualizzare i 4 elementi, 2x2, 1x4?
Marc Audet,


253

Come centrare gli elementi verticalmente e orizzontalmente in Flexbox

Di seguito sono riportate due soluzioni di centraggio generali.

Uno per gli oggetti flessibili allineati verticalmente ( flex-direction: column) e l'altro per gli oggetti flessibili allineati orizzontalmente ( flex-direction: row).

In entrambi i casi l'altezza dei div centrati può essere variabile, indefinita, sconosciuta, qualunque cosa. L'altezza dei div centrati non ha importanza.

Ecco l'HTML per entrambi:

<div id="container"><!-- flex container -->

    <div class="box" id="bluebox"><!-- flex item -->
        <p>DIV #1</p>
    </div>

    <div class="box" id="redbox"><!-- flex item -->
        <p>DIV #2</p>
    </div>

</div>

CSS (esclusi gli stili decorativi)

Quando gli oggetti flessibili sono impilati verticalmente:

#container {
    display: flex;           /* establish flex container */
    flex-direction: column;  /* make main axis vertical */
    justify-content: center; /* center items vertically, in this case */
    align-items: center;     /* center items horizontally, in this case */
    height: 300px;
}

.box {
    width: 300px;
    margin: 5px;
    text-align: center;     /* will center text in <p>, which is not a flex item */
}

inserisci qui la descrizione dell'immagine

DEMO


Quando gli oggetti flessibili sono impilati in orizzontale:

Modifica la flex-directionregola dal codice sopra.

#container {
    display: flex;
    flex-direction: row;     /* make main axis horizontal (default setting) */
    justify-content: center; /* center items horizontally, in this case */
    align-items: center;     /* center items vertically, in this case */
    height: 300px;
}

inserisci qui la descrizione dell'immagine

DEMO


Centrare il contenuto degli oggetti flessibili

L'ambito di un contesto di formattazione flessibile è limitato a una relazione padre-figlio. I discendenti di un contenitore flessibile oltre i bambini non partecipano al layout flessibile e ignoreranno le proprietà flessibili. In sostanza, le proprietà flessibili non sono ereditabili oltre i bambini.

Quindi, dovrai sempre applicare display: flexo display: inline-flexun elemento genitore per applicare le proprietà flex al figlio.

Per centrare verticalmente e / o orizzontalmente il testo o altro contenuto contenuto in un oggetto flessibile, rendere l'elemento un contenitore flessibile (nidificato) e ripetere le regole di centraggio.

.box {
    display: flex;
    justify-content: center;
    align-items: center;        /* for single line flex container */
    align-content: center;      /* for multi-line flex container */
}

Maggiori dettagli qui: Come allineare verticalmente il testo all'interno di un flexbox?

In alternativa, puoi applicare margin: autol'elemento di contenuto dell'elemento flessibile.

p { margin: auto; }

Scopri autoqui i margini flessibili : Metodi per l'allineamento degli articoli Flex (vedi riquadro # 56).


Centratura di più linee di oggetti flessibili

Quando un contenitore flessibile ha più linee (a causa dell'avvolgimento), la align-contentproprietà sarà necessaria per l'allineamento dell'asse trasversale.

Dalle specifiche:

8.4. Flexing Packing: la align-content proprietà

La align-contentproprietà allinea le linee di un contenitore flessibile all'interno del contenitore flessibile quando vi è spazio extra nell'asse trasversale, in modo simile a come justify-contentallinea i singoli elementi all'interno dell'asse principale. Nota, questa proprietà non ha alcun effetto su un contenitore flessibile a riga singola.

Maggiori dettagli qui: come funziona flex-wrap con align-self, align-items e align-content?


Supporto per il browser

Flexbox è supportato da tutti i principali browser, tranne IE <10 . Alcune versioni recenti del browser, come Safari 8 e IE10, richiedono prefissi fornitore . Per un modo rapido per aggiungere prefissi, utilizzare Autoprefixer . Maggiori dettagli in questa risposta .


Soluzione di centraggio per browser meno recenti

Per una soluzione di centraggio alternativa che utilizza la tabella CSS e le proprietà di posizionamento, consultare questa risposta: https://stackoverflow.com/a/31977476/3597276


possiamo farlo in orizzontale a destra, a sinistra e in verticale al centro?
Kapil,

2
@kapil, regola la proprietà justify-content su space-between o space-around ... jsfiddle.net/8o29y7pd/105
Michael Benjamin,

3
Questa risposta dovrebbe essere in cima. L'uso di Flex dovrebbe essere il modo preferito per farlo, poiché si adatta perfettamente ai dispositivi e allo schermo. È molto più semplice rispetto all'utilizzo di float e alla gestione di più div.
SeaWarrior404

Cioè 11 non funziona correttamente centro orizzontale e verticale
dareJob

1
Risposta perfetta, probabilmente la migliore su Google!
JAN

43

Inserisci

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

all'elemento contenitore di qualunque cosa tu voglia centrare. Documentazione: justify-content e align-items .


3
Grazie per la risposta concisa. Mentre tutta la verbosità sopra va bene, queste 3 righe sono esattamente ciò che sono arrivato qui cercando (beh, display: inline-flexnel mio caso, ma è stata una modifica facile.)
Jeff Ward,

27

Non dimenticare di utilizzare gli attributi specifici dei browser importanti:

align-items: center; ->

-webkit-box-align: center;
-moz-box-align: center;
-ms-flex-align: center;
-webkit-align-items: center;
align-items: center;

giustificare-contenuto: centro; ->

-webkit-box-pack: center;
-moz-box-pack: center;
-ms-flex-pack: center;
-webkit-justify-content: center;
justify-content: center;

Puoi leggere questi due link per una migliore comprensione della flessibilità: http://css-tricks.com/almanac/properties/j/justify-content/ e http://ptb2.me/flexbox/

In bocca al lupo.


1
questo è un buon punto, per oggi (per supportare solo i browser più recenti) hai solo bisogno delle ultime due righe -webkit .. per safari e l'ultima per tutte le altre
Pete Kozak,

1
+1 perché le vecchie bozze di lavoro del 2009 e marzo 2012 hanno ancora una quota significativa di utenti (combinata all'8% circa secondo caniuse.com ).
Benebun,

Flext non funziona in Safari, come hai potuto risolvere questo problema?
user3378649

Ho controllato l'ultima versione di Safari su Windows molti giorni fa e non me lo ricordo molto bene, ma controllerò e ti dirò. Per favore, dimmi quale versione di safari intendevi? e su quale sistema operativo?
Q Master

@ user3378649 L'ultima versione di Safari potrebbe supportare Flex-box, vedere questo link: caniuse.com/#search=flexbox
QMaster

15

1 - Impostare CSS su div genitore su display: flex;

2 - Imposta CSS su div genitore su flex-direction: column;
Nota che questo renderà tutto il contenuto all'interno di quel div allineato dall'alto verso il basso. Funzionerà meglio se il div genitore contiene solo il figlio e nient'altro.

3 - Impostare CSS su div genitore su justify-content: center;

Ecco un esempio di come apparirà il CSS:

.parentDivClass {
  display: flex;
  flex-direction: column;
  justify-content: center;
}



8

diplay: flex;per il suo contenitore e margin:auto;per il suo oggetto funziona perfettamente.

NOTA: è necessario impostare widthe heightper vedere l'effetto.

#container{
  width: 100%; /*width needs to be setup*/
  height: 150px; /*height needs to be setup*/
  display: flex;
}

.item{
  margin: auto; /*These will make the item in center*/
  background-color: #CCC;
}
<div id="container">
   <div class="item">CENTER</div>
</div>


3

Se devi centrare un testo in un link, questo funzionerà:

div {
  display: flex;

  width: 200px;
  height: 80px;
  background-color: yellow;
}

a {
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center; /* only important for multiple lines */

  padding: 0 20px;
  background-color: silver;
  border: 2px solid blue;
}
<div>
  <a href="#">text</a>
  <a href="#">text with two lines</a>
</div>


1
Dolce! A volte sento di essere troppo in discarica per Flexbox.) Supponiamo di aver bisogno di più pratica, alcune delle sue logiche non sono ancora chiare. Grazie Leo!
Zoltán,

3

margin: autofunziona perfettamente con flexbox. Si centralizza verticalmente e orizzontalmente.

html, body {
  height: 100%;
  max-height: 100%;
}

.flex-container {
  display: flex;
    
  height: 100%;
  background-color: green;
}

.container {
  display: flex;
  margin: auto;
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS</title>
</head>
<body>
  <div class="flex-container">
    <div class="container">
      <div class="row">
        <span class="flex-item">1</span>
      </div>
      <div class="row">
        <span class="flex-item">2</span>
      </div>
      <div class="row">
        <span class="flex-item">3</span>
      </div>
     <div class="row">
        <span class="flex-item">4</span>
    </div>
  </div>  
</div>
</body>
</html>


1

RISULTATO: Codice

CODICE

HTML:

<div class="flex-container">
  <div class="rows">

    <div class="row">
      <span class="flex-item">1</span>
    </div>
    <div class="row">
      <span class="flex-item">2</span>
    </div>
    <div class="row">
      <span class="flex-item">3</span>
    </div>
    <div class="row">
      <span class="flex-item">4</span>
    </div>

  </div>  
</div>

CSS:

html, body {
  height: 100%;  
}

.flex-container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100%;
}

.rows {
  display: flex;
  flex-direction: column;
}

dove flex-containerdiv è usato per centrare verticalmente e orizzontalmente il tuo rowsdiv, e rowsdiv è usato per raggruppare i tuoi "oggetti" e ordinarli in una colonna.


0
    .flex-container {
  padding: 0;
  margin: 0;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: center;
}
row {
  width: 100%;
}
.flex-item {
  background: tomato;
  padding: 5px;
  width: 200px;
  height: 150px;
  margin: 10px;
  line-height: 150px;
  color: white;
  font-weight: bold;
  font-size: 3em;
  text-align: center;
}

Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
Piotr Labunski il

-7

Utilizzando CSS +

<div class="EXTENDER">
  <div class="PADDER-CENTER">
    <div contentEditable="true">Edit this text...</div>
  </div>
</div>

dai un'occhiata QUI


1
poiché questo è facilmente e ampiamente supportato dai browser moderni con puro flexbox, la soluzione della tua libreria non è sicuramente necessaria. Soprattutto da quando ha chiesto come farlo usando flex box non una libreria CSS.
bungleofsketches,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.