Desafío y limitación de Flexbox
El desafío es centrar un grupo de elementos flexibles y alinearlos a la izquierda en la envoltura. Pero a menos que haya un número fijo de cajas por fila, y cada caja tenga un ancho fijo, esto no es posible actualmente con flexbox.
Usando el código publicado en la pregunta, podríamos crear un nuevo contenedor flexible que envuelva el contenedor flexible actual ( ul
), lo que nos permitiría centrar ul
con justify-content: center
.
Luego, los elementos flexibles del ul
podría alinearse a la izquierda con justify-content: flex-start
.
#container {
display: flex;
justify-content: center;
}
ul {
display: flex;
justify-content: flex-start;
}
Esto crea un grupo centrado de elementos flexibles alineados a la izquierda.
El problema con este método es que en ciertos tamaños de pantalla habrá un espacio a la derecha del ul
, por lo que ya no aparecerá centrado.
Esto sucede porque en el diseño flexible (y, de hecho, CSS en general) el contenedor:
- no sabe cuándo se envuelve un elemento;
- no sabe que un espacio previamente ocupado ahora está vacío, y
- no recalcula su ancho para encoger el diseño más estrecho.
La longitud máxima del espacio en blanco de la derecha es la longitud del elemento flexible que el contenedor esperaba que estuviera allí.
En la siguiente demostración, al cambiar el tamaño de la ventana horizontalmente, puede ver que los espacios en blanco van y vienen.
MANIFESTACIÓN
Un enfoque más práctico
El diseño deseado se puede lograr sin el uso de flexbox inline-block
y las consultas de medios .
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; } }
El código anterior representa un contenedor centrado horizontalmente con elementos secundarios alineados a la izquierda como este:
MANIFESTACIÓN
Otras opciones