Comment centrer les éléments verticalement et horizontalement dans Flexbox
Voici deux solutions générales de centrage.
Un pour les éléments flexibles alignés verticalement ( flex-direction: column
) et l'autre pour les éléments flexibles alignés horizontalement ( flex-direction: row
).
Dans les deux cas, la hauteur des divisions centrées peut être variable, indéfinie, inconnue, peu importe. La hauteur des divisions centrées n'a pas d'importance.
Voici le HTML pour les deux:
<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 (à l'exclusion des styles décoratifs)
Lorsque les éléments flexibles sont empilés verticalement:
#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 */
}
DEMO
Lorsque les éléments flexibles sont empilés horizontalement:
Ajustez la flex-direction
règle à partir du code ci-dessus.
#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;
}
DEMO
Centrer le contenu des éléments flexibles
La portée d'un contexte de mise en forme flexible est limitée à une relation parent-enfant. Les descendants d'un conteneur flex au-delà des enfants ne participent pas à la disposition flex et ignoreront les propriétés flex. Essentiellement, les propriétés flex ne sont pas héritables au-delà des enfants.
Par conséquent, vous devrez toujours appliquer display: flex
ou display: inline-flex
à un élément parent afin d'appliquer des propriétés flex à l'enfant.
Pour centrer verticalement et / ou horizontalement du texte ou un autre contenu contenu dans un élément flexible, faites de l'élément un conteneur flexible (imbriqué) et répétez les règles de centrage.
.box {
display: flex;
justify-content: center;
align-items: center; /* for single line flex container */
align-content: center; /* for multi-line flex container */
}
Plus de détails ici: Comment aligner verticalement du texte à l'intérieur d'une flexbox?
Vous pouvez également appliquer margin: auto
à l'élément de contenu de l'élément flexible.
p { margin: auto; }
En savoir plus sur les auto
marges flexibles ici: Méthodes pour aligner les éléments flexibles (voir l'encadré # 56).
Centrage de plusieurs lignes d'éléments flexibles
Lorsqu'un conteneur flexible a plusieurs lignes (en raison de l'habillage), la align-content
propriété sera nécessaire pour l'alignement transversal.
De la spécification:
8.4. Packing Flex Lines: la align-content
propriété
La align-content
propriété aligne les lignes d'un conteneur flexible dans le conteneur flexible lorsqu'il y a de l'espace supplémentaire dans l'axe transversal, de la même manière que pour justify-content
aligner des éléments individuels sur l'axe principal.
Remarque, cette propriété n'a aucun effet sur un conteneur flexible à une seule ligne.
Plus de détails ici: Comment fonctionne le flex-wrap avec align-self, align-items et align-content?
Prise en charge du navigateur
Flexbox est pris en charge par tous les principaux navigateurs, à l' exception d'IE <10 . Certaines versions de navigateur récentes, telles que Safari 8 et IE10, nécessitent des préfixes de fournisseur . Pour ajouter rapidement des préfixes, utilisez le préfixe automatique . Plus de détails dans cette réponse .
Solution de centrage pour les anciens navigateurs
Pour une solution de centrage alternative utilisant la table CSS et les propriétés de positionnement, voir cette réponse: https://stackoverflow.com/a/31977476/3597276