CSS 08: Flexbox Masterclass

La guía definitiva para dominar el Flexible Box Layout Module.

1. Introducción a Flexbox

Flexbox (Flexible Box Layout) es un modelo de diseño unidimensional pensado para distribuir espacio entre ítems en una interfaz y alinear capacidades poderosas.

Conceptos Clave

  • Eje Principal (Main Axis): La dirección primaria donde se colocan los ítems (por defecto, horizontal).
  • Eje Cruzado (Cross Axis): La dirección perpendicular al eje principal (por defecto, vertical).
  • Contenedor Flex: El padre con display: flex.
  • Ítems Flex: Los hijos directos del contenedor.

2. El Contenedor (Padre)

Estas propiedades se aplican al elemento que envuelve a los ítems.

display

Activa el contexto Flexbox.

.container {

    display: flex; /* Se comporta como un bloque */

    /* o */

    display: inline-flex; /* Se comporta como un elemento en línea */

}

flex-direction

Establece el eje principal. Define la dirección en la que se colocan los ítems.

row (Por defecto)

De izquierda a derecha (en idiomas LTR).

1
2
3

row-reverse

De derecha a izquierda.

1
2
3

column

De arriba a abajo.

1
2
3

column-reverse

De abajo a arriba.

1
2
3

flex-wrap

Por defecto, los ítems intentan encajar en una sola línea. Esta propiedad permite que "envuelvan" (salten) a la siguiente línea si no caben.

nowrap (Por defecto)

Intenta encajar todo en una línea.

¿Desborda o encoge?

Mucha gente piensa que nowrap causa desbordamiento. En realidad, por defecto causa encogimiento porque flex-shrink es 1. Solo desborda si impedimos que encoja.

1. Lo que ocurre realmente (Shrink: 1): Todo encaja.

2 ítems de 150px en contenedor de 250px. Ambos encogen a 125px.

1
2

2. Si forzamos NO encoger (Shrink: 0): Desbordamiento Real.

El contenedor acaba en la línea negra. El Item 2 se sale.

1
2 (Sale)

wrap

Los ítems saltan a la siguiente línea si es necesario.

100px
100px
100px
Wrap!

justify-content

Define la alineación a lo largo del Eje Principal. Ayuda a distribuir el espacio libre sobrante.

flex-start / flex-end / center

Start
Start
Center
Center
End
End

space-between

El primero al inicio, el último al final. Espacio igual entre ellos.

1
2
3

space-around

Espacio igual a cada lado del ítem. Nota: El espacio entre ítems es doble que el de los bordes.

1
2
3

space-evenly

Distribuye el espacio de manera totalmente uniforme, incluyendo los bordes.

1
2
3

align-items

Define el comportamiento por defecto de cómo se distribuyen los ítems a lo largo del Eje Cruzado (perpendicular).

Stretch (Defecto)
Estira
Todo
Flex-Start
Arriba
Center
Centro
Baseline
Texto
Alineado

align-content

Controla el espacio entre las filas (líneas).

Imagina que agitas una caja con varias filas de bloques. align-content decide si esas filas se pegan todas arriba, si se centran como un bloque único, o si se separan entre ellas.

🔑 Diferencia Clave:
  • align-items: Mueve los ítems DENTRO de su línea.
  • align-content: Mueve las LÍNEAS enteras dentro del contenedor.

Solo funciona con multimilínea (`flex-wrap: wrap`) y cuando sobra altura.

flex-start

Las filas se pegan arriba (pack). Sobra mucho espacio abajo.

1
2
3
4

center

Las filas se pegan en el centro. Sobra espacio arriba y abajo.

1
2
3
4

space-between

Fila 1 al techo, Fila 2 al suelo. El espacio sobra en medio.

1
2
3
4

stretch (Defecto)

Las filas crecen para ocupar todo el espacio disponible.

1
2
3
4

gap MODERNO

¡La propiedad que todos esperábamos! Crea un espacio físico entre filas y columnas, sin usar márgenes.

.container {

    display: flex;

    gap: 20px; /* Aplica a filas y columnas */

    /* gap: 10px 20px; /* fila | columna */

}
Item 1
Item 2
Item 3
Item 4

3. Los Ítems (Hijos)

Propiedades para controlar elementos individuales.

flex-grow

Define la capacidad de un ítem para crecer si hay espacio sobrante.

📈 La Fórmula del Crecimiento

Fórmula: (Grow del ítem / Suma total de Grows) * Espacio Sobrante = Crecimiento

Ejemplo: Contenedor 500px, 4 ítems de 100px. Sobran 100px.

  • Si todos tienen flex-grow: 1: 100px / 4 = 25px para cada uno.
  • Si uno tiene flex-grow: 2 y el resto 1:
    • Suma de grows: 1 + 1 + 1 + 2 = 5 partes.
    • Valor de cada parte: 100px / 5 = 20px.
    • Ítem grow 2 recibe: 2 * 20px = 40px.
Grow: 1
Grow: 2 (Crece más)
Grow: 1

flex-shrink

Define la capacidad de encogerse si falta espacio (overflow). 1 por defecto. Ponlo a 0 para evitar que un elemento se aplaste.

📉 La Fórmula del Encogimiento (Importante)

A diferencia de grow, flex-shrink tiene en cuenta el tamaño del elemento. Un elemento más grande encogerá más píxeles para mantener la proporción.

Fórmula: (Shrink del ítem * Ancho Base / Suma Ponderada Total) * Espacio Negativo = Encogimiento

Ejemplo Práctico:

Contenedor de 500px con 4 ítems de 200px (Total 800px). Faltan 300px (Espacio Negativo).

Ítem 4 tiene shrink: 3, el resto shrink: 1.

  1. Calcular Suma Ponderada Total: (Ancho * Shrink) de todos.
    (200*1) + (200*1) + (200*1) + (200*3) = 600 + 600 = 1200.
  2. Calcular cuánto encoge cada uno:
    Ítems normales (shrink 1): (200 * 1 / 1200) * 300px = 50px.
    Ítem especial (shrink 3): (200 * 3 / 1200) * 300px = 150px.

Resultado: Los ítems normales miden 150px, el especial se queda en 50px.

Shrink 1
(150px)
Shrink 1
(150px)
Shrink 1
(150px)
Shrink 3
(50px)

flex-basis

Establece el tamaño inicial del ítem antes de distribuir el espacio. Es como width pero más poderoso en Flexbox.

El Shorthand flex

Se recomienda usar siempre la propiedad resumida:

flex: 1;         /* flex-grow: 1; flex-shrink: 1; flex-basis: 0% */

flex: auto;      /* flex-grow: 1; flex-shrink: 1; flex-basis: auto */

flex: initial;   /* flex-grow: 0; flex-shrink: 1; flex-basis: auto (Defecto) */

flex: none;      /* flex-grow: 0; flex-shrink: 0; flex-basis: auto */

align-self

Permite a un ítem individual romper la regla de alineación del padre.

Padre: Start
Self: Center
Self: End
Self: Stretch

order

Cambia el orden visual sin cambiar el HTML. Cuidado con la accesibilidad (el lector de pantalla sigue el DOM).

1 (Order 2)
2 (Order 3)
3 (Order 1)

4. Trucos Maestros y Patrones

El Truco de margin: auto

En Flexbox, los márgenes automáticos se "comen" todo el espacio libre disponible. Esto es increíblemente útil para separar grupos de ítems.

Logo
Login
Signup
.login-btn {

    margin-left: auto; /* Empuja todo lo anterior a la izquierda y a sí mismo a la derecha */

}

Centrado Absoluto Perfecto

.padre {

    display: flex;

    justify-content: center;

    align-items: center;

    height: 100vh;

}

Sticky Footer (Pie de página pegajoso)

Si tienes poco contenido, el footer sube. Con Flexbox, puedes forzarlo abajo.

body {

    display: flex;

    flex-direction: column;

    min-height: 100vh;

}

main {

    flex: 1; /* Ocupa todo el espacio sobrante, empujando el footer */

}
Volver a CSS

🎮 ¡Practica lo aprendido!

Hemos movido la herramienta de entrenamiento a una página dedicada para que puedas usarla con mayor comodidad a pantalla completa.

Ir a la Zona de Entrenamiento Flexbox