Desafio e limitação do Flexbox
O desafio é centralizar um grupo de itens flexíveis e alinhá-los à esquerda na embalagem. Mas, a menos que haja um número fixo de caixas por linha e cada caixa tenha largura fixa, isso não é possível com o flexbox.
Usando o código postado na pergunta, poderíamos criar um novo flex container que envolvesse o flex container atual ( ul
), o que nos permitiria centralizar ul
com justify-content: center
.
Em seguida, os itens flexíveis do ul
podem ser alinhados à esquerda com justify-content: flex-start
.
#container {
display: flex;
justify-content: center;
}
ul {
display: flex;
justify-content: flex-start;
}
Isso cria um grupo centralizado de flex items alinhados à esquerda.
O problema com esse método é que em certos tamanhos de tela haverá uma lacuna à direita do ul
, fazendo com que ele não pareça mais centralizado.
Isso acontece porque no layout flexível (e, na verdade, CSS em geral) o contêiner:
- não sabe quando um elemento é encerrado;
- não sabe que um espaço anteriormente ocupado agora está vazio, e
- não recalcula sua largura para reduzir o layout mais estreito.
O comprimento máximo do espaço em branco à direita é o comprimento do flex item que o contêiner esperava estar lá.
Na demonstração a seguir, redimensionando a janela horizontalmente, você pode ver o espaço em branco ir e vir.
DEMO
Uma abordagem mais prática
O layout desejado pode ser alcançado sem flexbox usando inline-block
e consultas de mídia .
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; } }
O código acima renderiza um contêiner centralizado horizontalmente com elementos filho alinhados à esquerda como este:
DEMO
Outras opções