Wrap: Flexbox multilinea

El modelo flexbox distribuye sus items o bloques hijo a lo largo de un eje: o en horizontal (row) o en vertical (columns). Es una layout unidireccional, no obstante puede que el ancho de la pantalla no admita una fila completa. Para gestionar esta situación el modelo posee la propiedad flex-wrap con la que podemos controlar lo que el navegador debe hacer en tal situación

Por ejemplo

<head>

<style>

#contenedor {

display:flex;

flex-wrap:nowrap;

width:260px;

height:150px;

border:1px solid black;

}

#contenedor div{

width:50px;

height: 50px;

border: 1px solid red;

}

</style>

</head>

<body>

<div id="contenedor">

<div>item A</div>

<div>item B</div>

<div>item C</div>

<div>item D</div>

<div>item E</div>

<div>item F</div>

</div>

</body>

Prueba este ejemplo en el sandbox y cambia la propiedad flex-wrap de nowrap a wrap para comprobar su funcionamiento

Como está escrito verás que los hijos se estrechan al máximo para poder mostrar el contenido y caber dentro de su contenedor, y en caso de que no sea suficiente pueden sobresalir del contenedor (este sobrante se puede controlar con la propiedad overflow)

Pero si modificas el valor de flex-wrap y lo pones en wrap verás que la fila se rompe en dos: cuando no haya espacio para un item lo pasa a la segunda linea. Si en lugar de wrap pones wrap-reverse ocurre lo mismo pero empezando por la parte final del contenedor (cross-end), es decir, el borde inferior por defecto.

Comprúebalo en el ejemplo.

<head>

<style>

.contenedor {

display:flex;

flex-wrap:wrap-reverse;

width:260px;

height:150px;

border:1px solid black;

}

.contenedor div{

width:50px;

height: 50px;

border: 1px solid red;

}

</style>

</head>

<body>

<div class="contenedor">

<div>item A</div>

<div>item B</div>

<div>item C</div>

<div>item D</div>

<div>item E</div>

<div>item F</div>

</div>

</body>

Verás que parte de la fila se coloca en la parte inferior de la caja comenzando con el prmer hijo, llega al borde y pone el siguiente hijo en una fila superior.

Las propiedades flex-wrap y flex-directoin pueden abreviarse en una sola regla flex-flow. Se le asignan los dos valores separados por un espacio o uno solo usandose para el otro el valor por defecto

.caja{

display:flex;

flex-direction:column;

flex-wrap:wrap;

}

.caja{

display:flex;

flex-flow: column wrap;

}

Ambas declaraciones CSS son equivalentes, y la forma abreviada ahorra espacio y escribir, pero no tiene más ventajas que esas.

La propiedad justify-content permite completar las alineaciones de los items hijos. Con esta propiedad se alinea en el eje principal y además se reparte el espacio vacio entre los hijos

Alineación multilinea

En el caso de que el modelo flex presente multiples lineas con los hijos, estas filas pueden también espaciarse o alinearse a lo largo del eje transversal. La propieda que controla esta alineación es align-content. Los valores que puede tomar con

flex-start
flex align-content start
alinea la primera linea con cross-start y las restantes quedan pegadas a la fila anterior. Si flex-direction es row las lineas se alinean al borde superior.
flex-end
flex align-content start
la última linea se pega al borde  cross-end y las restantes quedan pegadas a la fila anterior. Si flex-direction es row las lineas se alinean al borde inferior.
center
flex align-content start
los lineas con los items hijos quedan centradas en el contenedor. Si flexdirection es row, se centran en vertical
space-around
flex align-content start
Reparte el espacio sobrante del contendor entre todas las filas y rodea cada un espacio de anchura similar. La distancia entre las filas será doble que la distancia a los límites.
space-between
flex align-content start
coloca todo el espacio libre entre las filas, pero mantiene la primera y última pegadas a los bordes paralelos al eje principal.
Stretch
flex align-content start
Agranda los bloques hijos para que se ocupe todo el espacio disponible a lo largo del el eje transversal. En este caso se agrandan verticalment.

En estos ejemplos usamos la fila (eje horizontal) como eje principal, por lo tanto los limites start y end se refieren a bordes superior e inferior. Si se usa wrap-reverse en lugar de wrap se cambia el sentido de los ejes: start sería inferior y end superior.

Las propìedad justify-content funciona igual en ambos ejes: repartiendo el espacio vacio entre los items hijos, y da un control muy detallado de sus posiciones dentro del bloque flexbox.