Wyzwanie i ograniczenia dotyczące Flexbox
Wyzwaniem jest wyśrodkowanie grupy elementów elastycznych i wyrównanie ich w lewo na zawijaniu. Ale jeśli nie ma stałej liczby pudełek w rzędzie, a każde pudełko ma stałą szerokość, nie jest to obecnie możliwe w przypadku Flexbox.
Korzystając z kodu zamieszczonego w pytaniu, moglibyśmy utworzyć nowy kontener flex, który otacza obecny kontener flex ( ul
), co pozwoliłoby nam wyśrodkować ul
z justify-content: center
.
Następnie elementy flex ul
można wyrównać do lewej z justify-content: flex-start
.
#container {
display: flex;
justify-content: center;
}
ul {
display: flex;
justify-content: flex-start;
}
Tworzy to wyśrodkowaną grupę elementów elastycznych wyrównanych do lewej.
Problem z tą metodą polega na tym, że przy pewnych rozmiarach ekranu będzie luka po prawej stronie ul
, przez co nie będzie już wyglądać na wyśrodkowaną.
Dzieje się tak, ponieważ w układzie flex (a właściwie ogólnie w CSS) kontener:
- nie wie, kiedy element się zawija;
- nie wie, że zajmowane wcześniej miejsce jest teraz puste, i
- nie oblicza ponownie swojej szerokości, aby zawijać węższy układ.
Maksymalna długość odstępu po prawej stronie to długość elementu elastycznego, którego oczekiwał kontener.
W poniższym demo, zmieniając rozmiar okna w poziomie, możesz zobaczyć pojawianie się i znikanie białych znaków.
PRÓBNY
Bardziej praktyczne podejście
Żądany układ można osiągnąć bez użycia flexboxa inline-block
i zapytań o media .
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; } }
Powyższy kod renderuje kontener wyśrodkowany w poziomie z elementami potomnymi wyrównanymi do lewej, takimi jak ten:
PRÓBNY
Inne opcje