froggy container bootstrap html css css3 flexbox

html - container - Orientación de elementos flexibles en la última fila o en una fila específica



flexbox grid (3)

Mi problema es que quiero el flexbox con ancho de rango variable, y todo funciona bien, pero no en la última fila. Quiero la misma dimensión para todos los niños, incluso cuando la fila no está llena de niños (la última fila).

#products-list { position:relative; display: flex; flex-flow: row wrap; width:100%; } #products-list .product { min-width:150px; max-width:250px; margin:10px 10px 20px 10px; flex:1; }

Creé una situación dinámica en jsFiddle

Mis divs flexibles pueden reducirse hasta 150 px y crecer hasta 250 px, pero todos deben tener el mismo tamaño (y obviamente quiero una solución CSS, con JS sé el camino).


Como una solución rápida y sucia, se puede usar:

.my-flex-child:last-child/*.product:last-child*/ { flex-grow: 100;/*Or any number big enough*/ }


Desafortunadamente, en la iteración actual de flexbox (Nivel 1), no hay una forma limpia de resolver el problema de alineación de la última fila. Es un problema comun.

Sería útil tener una propiedad flex a lo largo de las líneas de:

  • last-row
  • last-column
  • only-child-in-a-row
  • alone-in-a-column

Este problema parece ser de alta prioridad para Flexbox Nivel 2:

Aunque este comportamiento es difícil de lograr en flexbox, es simple y fácil en CSS Grid Layout :

  • Elementos flexibles de igual ancho incluso después de envolver

En caso de que Grid no sea una opción, aquí hay una lista de preguntas similares que contienen varios hacks de flexbox:


Utilicé esta solución, incluso si no es muy elegante y no usa el poder de Flexbox.

Se puede realizar en las siguientes condiciones:

  • Todos los artículos tienen el mismo ancho.
  • Los artículos tienen un ancho fijo
  • Utiliza SCSS / SASS (aunque se puede evitar)

Si este es el caso, puede usar el siguiente fragmento:

$itemWidth: 400px; $itemMargin: 10px; html, body { margin: 0; padding: 0; } .flex-container { display: flex; flex-direction: row; flex-wrap: wrap; margin: 0 auto; border: solid 1px blue; } @for $i from 1 through 10 { @media only screen and (min-width: $i * $itemWidth + 2 * $i * $itemMargin) { .flex-container { width: $i * $itemWidth + 2 * $i * $itemMargin; } } } .item { flex: 0 0 $itemWidth; height: 100px; margin: $itemMargin; background: red; }

<div class="flex-container"> <div class="item"></div> <div class="item" style="flex: 500 0 200px"></div> <div class="item"></div> <div class="item"></div> <div class="item"></div> </div>

Here he creado un ejemplo en codepen que también implementa margen.

La segunda y la tercera condiciones se pueden evitar, respectivamente, utilizando variables css (si decidió proporcionarle soporte) y compilando el fragmento de scss anterior.

Bueno, es cierto, podríamos hacerlo también antes de flexbox, pero display: flex puede seguir siendo esencial para un diseño receptivo.