Défi et limitation de la Flexbox
Le défi consiste à centrer un groupe d'éléments flexibles et à les aligner à gauche sur l'enveloppe. Mais à moins qu'il n'y ait un nombre fixe de boîtes par ligne et que chaque boîte soit de largeur fixe, ce n'est actuellement pas possible avec flexbox.
En utilisant le code publié dans la question, nous pourrions créer un nouveau conteneur flex qui encapsule le conteneur flex actuel ( ul
), ce qui nous permettrait de centrer le ul
avec justify-content: center
.
Ensuite, les éléments flexibles du ul
peuvent être alignés à gauche avec justify-content: flex-start
.
#container {
display: flex;
justify-content: center;
}
ul {
display: flex;
justify-content: flex-start;
}
Cela crée un groupe centré d'éléments flexibles alignés à gauche.
Le problème avec cette méthode est qu'à certaines tailles d'écran, il y aura un espace sur la droite du ul
, ce qui le fera ne plus apparaître centré.
Cela se produit parce que dans la mise en page flex (et, en fait, CSS en général), le conteneur:
- ne sait pas quand un élément s'enroule;
- ne sait pas qu'un espace précédemment occupé est maintenant vide, et
- ne recalcule pas sa largeur pour réduire la mise en page la plus étroite.
La longueur maximale de l'espace blanc sur la droite est la longueur de l'élément flexible que le conteneur s'attendait à y trouver.
Dans la démo suivante, en redimensionnant la fenêtre horizontalement, vous pouvez voir les espaces aller et venir.
DEMO
Une approche plus pratique
La mise en page souhaitée peut être obtenue sans flexbox inline-block
ni requêtes multimédias .
HTML
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
</ul>
CSS
ul {
margin: 0 auto;
width: 1200px;
padding-left: 0;
font-size: 0;
}
li {
display: inline-block;
font-size: 18px;
list-style-type: none;
width: 150px;
height: 50px;
line-height: 50px;
margin: 15px 25px;
box-sizing: border-box;
text-align: center;
}
@media screen and (max-width: 430px) { ul { width: 200px; } }
@media screen and (min-width: 431px) and (max-width: 630px) { ul { width: 400px; } }
@media screen and (min-width: 631px) and (max-width: 830px) { ul { width:600px; } }
@media screen and (min-width: 831px) and (max-width: 1030px) { ul { width: 800px; } }
@media screen and (min-width: 1031px) and (max-width: 1230px) { ul { width: 1000px; } }
Le code ci-dessus rend un conteneur centré horizontalement avec des éléments enfants alignés à gauche comme ceci:
DEMO
Autres options