flex-grow y flex-shrink

  1. flex-grow: dice cuántas partes del sobrante le tocan, y el tamaño de cada parte depende de lo que hayan pedido las demás. Es el equivalente a fr de Grid. Con flex-grow: 1 en todas, el espacio libre se reparte a partes iguales.
  2. flex-shrink: dice con qué disposición cede esta caja cuando falta sitio. Su valor por defecto es 1, así que todas ceden aunque no se escriba nada. El recorte se reparte en proporción al tamaño de cada caja: la más grande cede más, aunque todas tengan el mismo valor.

En los dos casos el número no es una cantidad en píxeles: es un peso dentro de un reparto.

Ejemplo 1 — flex-grow: sobra espacio

Tres cajas de 200, 400 y 100 px suman 700. En una ventana de 900 px sobran 200 px, y eso es lo que se reparte.

Caso A — las tres con flex-grow: 1
Suma de pesos: 1+1+1 = 3. Cada parte: 200 ÷ 3 = 66,7 px.

Tamaño de partidaRecibeTamaño final
200 px66,7266,7 px
400 px66,7466,7 px
100 px66,7166,7 px

Reciben lo mismo, pero no acaban iguales: cada una parte de su propio tamaño.

Caso B — pesos 1, 1 y 2
Suma de pesos: 1+1+2 = 4. Cada parte: 200 ÷ 4 = 50 px.

Tamaño de partidaflex-grow RecibeTamaño final
200 px150250 px
400 px150450 px
100 px2100200 px

Caso C — solo crece la pequeña (pesos 0, 0 y 1)
Se lleva los 200 px enteros.

Tamaño de partidaflex-grow RecibeTamaño final
200 px0—200 px
400 px0—400 px
100 px1200300 px

Ejemplo 2 — flex-shrink: falta espacio

Las mismas tres cajas de 200, 400 y 100 px, que suman 700. En una ventana de 600 px faltan 100 px, y eso es lo que hay que recortar.

Caso A — las tres con flex-shrink: 1
Cada una cede en proporción a su tamaño, sobre un total de 700.

Tamaño de partidaCálculoCedeTamaño final
200 px100 × 200/70028,6 171,4 px
400 px100 × 400/70057,1 342,9 px
100 px100 × 100/70014,3 85,7 px

La de 400 cede el doble que la de 200 con el mismo valor. Nadie lo ha pedido: sale del propio cálculo, y es lo sensato, porque quitar 100 px a una caja grande se nota menos que quitárselos a una pequeña.

Caso B — la primera con flex-shrink: 0
Esa caja no cede. Los 100 px los reparten las otras dos, en proporción a 400 y 100.

Tamaño de partidaflex-shrink CedeTamaño final
200 px0—200 px
400 px180320 px
100 px12080 px

Caso C — la pequeña con flex-shrink: 2
Ahora pesa 100 × 2 = 200 en el reparto, igual que la primera.

Tamaño de partidaflex-shrink PesoCedeTamaño final
200 px120025 175 px
400 px140050 350 px
100 px220025 75 px

Es el caso que más se nota: la caja pequeña pierde la cuarta parte de su tamaño.