Definición de flexbox

El módulo flexbox busca proveer una forma eficiente de presentar, alinear y distribuir el espacio entre los items de un container, incluso cuando el tamaño es desconocido y/o dinámico. La idea principal es darle al container la habilidad de alterar la altura y/o ancho de sus items para llenar de la mejor manera el espacio disponible. Para definir un container como flex seteamos el atributo display con el valor flex.

    .container {
      display: flex;
    }

Atributos de dirección y alineación

flex-direction: Define el eje principal, es decir, la dirección (column: vertical o row: horizontal) en al que se presentarán los items. La dirección que no fue seleccionada pasará a ser el eje secundario. También se puede definir que los items se presenten en el orden inverso al que están en el HTML (column-reverse y row-reverse).

justify-content: Define cómo se alinean los items sobre el eje principal.

  • flex-start: Los items se presentan al comienzo del eje principal.
  • flex-end: Los items se presentan al final del eje principal.
  • center: Los items son centrados sobre el eje principal.
  • space-between: Los items son distribuidos uniformemente sobre el eje principal.
  • space-around: Los items son distribuidos uniformemente sobre el eje principal con el mismo espacio alrededor de ellos pero el espacio del primer y último item con el borde es distinto.
  • space-evenly: Los items son distribuidos uniformemente sobre el eje principal con el mismo espacio alrededor de ellos y el mismo espacio es utilizado entre el primer y último item con los bordes.

align-items: Define cómo se alinean los items sobre el eje secundario.

  • stretch: Los items se estiran para llenar el container (respetando el min-width/max-width).
  • flex-start: Los items se presentan al comienzo del eje secundario.
  • flex-end: Los items se presentan al final del eje secundario.
  • center: Los items son centrados sobre el eje secundario.
  • baseline: Los items son alineados de tal manera que sus baselines individuales queden alineadas.
    .container {
      flex-direction: row | row-reverse | column | column-reverse; /*default row*/
      justify-content: flex-start | flex-end | center | 
                       space-between | space-around | space-evenly; /*default flex-start*/
      align-items: stretch | flex-start | flex-end | center | baseline; /*default stretch*/
    }

Atributos de ajuste

flex-wrap: Define si el container intenta ajustar los items en una sola línea (no-wrap), en varias líneas yendo de arriba hacia abajo (wrap) o en el orden inverso (wrap-reverse).

flex-grow: Es una propiedad del item que define la proporción en la cual un item puede crecer en el caso que sea necesario. Por ejemplo si todos los items tienen un flex-grow de 1 el espacio será distribuido equitativamente entre los items. Si uno de los items tiene un flex-grow de 2 va a ocupar el doble de espacio que el resto de los items (o al menos va a intentar ocupar).

flex-shrink: Es una propiedad del item que define la proporción en la cual un item puede achicarse en el caso que sea necesario. Utiliza la misma lógica que el flex-grow.

flex-basis: Es una propiedad del item que define el tamaño por default antes que se distribuya el espacio disponible. Puede ser una medida (20%, 10px, 7remetc) o una keyword. La keyword por default es auto que utiliza el width y height para determinar el tamaño. Según el browser existen otras keywords soportadas.

flex: Es un atajo para definir flex-grow, flex-shrink y flex-basis juntas. El segundo y tercer parámetro son opcionales.

    .container {
      flex-wrap: nowrap | wrap | wrap-reverse; /*default no-wrap*/
    }
    .item {
      flex: 1 3 20%;
      flex-grow: 1; /*default 0*/
      flex-shrink: 3; /*default 1*/
      flex-basis: 20% | auto; /*default auto*/
    }