Comment centrer horizontalement et verticalement le conteneur à l’aide de la flexbox. Dans l'exemple ci-dessous, je veux que chaque nombre se trouve l'un en dessous de l'autre (en lignes), qui sont centrés horizontalement.
.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>
Je pense que vous voulez quelque chose comme ce qui suit.
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>
Voir la démo à: http://jsfiddle.net/audetwebdesign/tFscL/
Vos éléments .flex-item
doivent être au niveau du bloc (div
au lieu de span
) si vous voulez que la hauteur et les marges de remplissage supérieure/inférieure fonctionnent correctement.
De même, sur .row
, définissez la largeur sur auto
au lieu de 100%
.
Vos propriétés .flex-container
vont bien.
Si vous souhaitez que le .row
soit centré verticalement dans le port de visualisation, affectez une hauteur de 100% à html
et body
, et mettez également à zéro les marges body
.
Notez que .flex-container
a besoin d'une hauteur pour voir l'effet d'alignement vertical. Sinon, le conteneur calcule la hauteur minimale nécessaire pour inclure le contenu, qui est inférieure à la hauteur du port de vue dans cet exemple.
Note de bas de page:
Les propriétés flex-flow
, flex-direction
, flex-wrap
auraient pu faciliter la mise en œuvre de cette conception. Je pense que le conteneur .row
n'est pas nécessaire, sauf si vous souhaitez ajouter du style autour des éléments (image d'arrière-plan, bordures, etc.).
Une ressource utile est: http://demo.agektmr.com/flexbox/
Vous trouverez ci-dessous deux solutions de centrage générales.
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 divs centrés peut être variable, indéfinie, inconnue, peu importe. La hauteur des divs centrés n'a pas d'importance.
Voici le code 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 */
}
Lorsque les éléments flexibles sont empilés horizontalement:
Ajustez la règle flex-direction
à 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;
}
La portée d'un contexte de formatage 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 ignorent 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 les propriétés flex à l'enfant.
Afin de centrer verticalement et/ou horizontalement le texte ou tout autre contenu contenu dans un élément flexible, faites-en 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 dans une flexbox?
Vous pouvez également appliquer margin: auto
à l'élément de contenu de l'élément flex.
p { margin: auto; }
En savoir plus sur les marges de flexion auto
ici: méthodes d’alignement des éléments flexibles (voir encadré n ° 56).
Lorsqu'un conteneur Flex comporte plusieurs lignes (en raison du retour à la ligne), la propriété align-content
sera nécessaire pour l'alignement transversal.
À partir de la spécification:
8.4. Lignes d’emballage flexibles: la propriété
align-content
La propriété
align-content
aligne les lignes d’un conteneur Flex dans le conteneur Flex lorsque l’axe transversal contient davantage d’espace, de la même manière quejustify-content
aligne les éléments individuels dans l’axe principal. Notez que cette propriété n'a aucun effet sur un conteneur flex sur une seule ligne.
Plus de détails ici: Comment fonctionne le flex-wrap avec align-self, align-items et align-content?
Flexbox est supporté par tous les principaux navigateurs, sauf IE <1 . Certaines versions de navigateur récentes, telles que Safari 8 et IE10, nécessitent préfixes du fournisseur . Pour ajouter rapidement des préfixes, utilisez Autoprefixer . Plus de détails dans cette réponse .
Pour une solution de centrage alternative utilisant la table CSS et les propriétés de positionnement, voir la réponse suivante: https://stackoverflow.com/a/31977476/3597276
Ajouter
.container {
display: flex;
justify-content: center;
align-items: center;
}
à l'élément conteneur de tout ce que vous voulez centrer. Documentation: justifier-conten et aligner-éléments .
display: flex;
align-items: center;
justify-content: center;
N'oubliez pas d'utiliser les attributs spécifiques importants des navigateurs:
align-items: centre; ->
-webkit-box-align: center;
-moz-box-align: center;
-ms-flex-align: center;
-webkit-align-items: center;
align-items: center;
justifier-contenu: centre; ->
-webkit-box-pack: center;
-moz-box-pack: center;
-ms-flex-pack: center;
-webkit-justify-content: center;
justify-content: center;
Vous pouvez lire ces deux liens pour une meilleure compréhension flex: http://css-tricks.com/almanac/properties/j/justify-content/ et http://ptb2.me/flexbox /
Bonne chance.
1 - Définissez CSS sur le div parent à display: flex;
2 - Définissez CSS sur le div parent à flex-direction: column;
Notez que tout le contenu de cette ligne divisionnera tout le contenu. Ceci fonctionnera mieux si la div mère ne contient que l’enfant et rien d’autre.
3 - Définissez CSS sur le div parent à justify-content: center;
Voici un exemple de ce à quoi le CSS ressemblera:
.parentDivClass {
display: flex;
flex-direction: column;
justify-content: center;
}
diplay: flex;
pour son conteneur et margin:auto;
pour son article fonctionne parfaitement.
NOTE: Vous devez configurer les paramètres width
et height
pour voir l'effet.
#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>
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>
margin: auto
fonctionne parfaitement avec flexbox. Il centralise verticalement et horizontalement.
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>