Flexbox Challenge & Limitation
La sfida è centrare un gruppo di elementi flessibili e allinearli a sinistra sulla fasciatura. Ma a meno che non ci sia un numero fisso di scatole per riga e ogni scatola abbia una larghezza fissa, questo non è attualmente possibile con flexbox.
Utilizzando il codice pubblicato nella domanda, potremmo creare un nuovo contenitore flessibile che avvolge l'attuale contenitore flessibile ( ul
), che ci consentirebbe di centrare il ul
con justify-content: center
.
Quindi gli elementi flessibili di ul
potrebbero essere allineati a sinistra con justify-content: flex-start
.
#container {
display: flex;
justify-content: center;
}
ul {
display: flex;
justify-content: flex-start;
}
Questo crea un gruppo centrato di elementi flessibili allineati a sinistra.
Il problema con questo metodo è che a determinate dimensioni dello schermo ci sarà uno spazio sulla destra del ul
, che non apparirà più centrato.
Ciò accade perché nel layout flessibile (e, in realtà, CSS in generale) il contenitore:
- non sa quando un elemento va a capo;
- non sa che uno spazio precedentemente occupato è ora vuoto, e
- non ricalcola la sua larghezza per restringere il layout più stretto.
La lunghezza massima dello spazio bianco a destra è la lunghezza dell'elemento flessibile che il contenitore si aspettava fosse lì.
Nella demo seguente, ridimensionando la finestra orizzontalmente, puoi vedere gli spazi bianchi andare e venire.
DEMO
Un approccio più pratico
Il layout desiderato può essere ottenuto senza l'utilizzo di flexbox inline-block
e media query .
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; } }
Il codice precedente esegue il rendering di un contenitore centrato orizzontalmente con elementi figlio allineati a sinistra come questo:
DEMO
Altre opzioni