
Control de crecimiento con flex-grow y su funcionamiento
La propiedad flex-grow es una de las herramientas más útiles que nos ofrece Flexbox para controlar cómo los elementos hijos (flex items) crecen dentro de un contenedor flexible. Esta propiedad determina la capacidad de crecimiento de un elemento en relación con los demás elementos del mismo contenedor.
Cuando hay espacio disponible en el contenedor flex, flex-grow define cómo se distribuirá ese espacio extra entre los elementos. Por defecto, todos los elementos flex tienen un valor de flex-grow: 0, lo que significa que no crecerán más allá de su tamaño base.
Valores y comportamiento básico
La propiedad flex-grow acepta un valor numérico no negativo que actúa como una proporción relativa:
.item {
flex-grow: 1; /* Valor por defecto: 0 */
}
- flex-grow: 0 - El elemento no crecerá más allá de su tamaño base
- flex-grow: 1 - El elemento crecerá para ocupar el espacio disponible
- flex-grow: 2 - El elemento crecerá el doble que un elemento con valor 1
Cómo se calcula el espacio
Para entender cómo funciona flex-grow, veamos un ejemplo sencillo:
.container {
display: flex;
width: 500px;
}
.item-1 {
width: 100px;
flex-grow: 1;
}
.item-2 {
width: 100px;
flex-grow: 2;
}
.item-3 {
width: 100px;
flex-grow: 1;
}
En este ejemplo:
- El contenedor tiene 500px de ancho
- Los tres elementos tienen un ancho base de 100px cada uno
- El espacio total ocupado por los elementos es 300px
- El espacio disponible es 200px (500px - 300px)
Para distribuir este espacio disponible:
- Sumamos todos los valores de flex-grow: 1 + 2 + 1 = 4
- Cada "unidad" de flex-grow vale 200px / 4 = 50px
- El primer elemento recibe 50px extra (1 × 50px)
- El segundo elemento recibe 100px extra (2 × 50px)
- El tercer elemento recibe 50px extra (1 × 50px)
Ejemplos prácticos
Veamos algunos casos de uso comunes:
1. Distribución equitativa del espacio
.container {
display: flex;
}
.item {
flex-grow: 1; /* Todos los elementos crecen por igual */
}
Este patrón es muy útil para crear diseños de igual anchura, como menús de navegación o galerías de imágenes.
2. Elemento principal con elementos secundarios
.container {
display: flex;
}
.main-content {
flex-grow: 3; /* Ocupa la mayor parte del espacio */
}
.sidebar {
flex-grow: 1; /* Ocupa menos espacio */
}
Este patrón es perfecto para layouts con barra lateral, donde el contenido principal debe ocupar más espacio que la barra lateral.
3. Botones de acción con diferentes prioridades
.button-container {
display: flex;
gap: 10px;
}
.primary-button {
flex-grow: 2; /* Botón principal más ancho */
}
.secondary-button {
flex-grow: 1; /* Botones secundarios más estrechos */
}
Comportamiento con flex-basis
Es importante entender que flex-grow trabaja en conjunto con flex-basis, que define el tamaño inicial de un elemento antes de que se aplique el crecimiento:
.container {
display: flex;
width: 500px;
}
.item {
flex-basis: 100px;
flex-grow: 1;
}
En este caso, cada elemento comienza con 100px (flex-basis) y luego crece equitativamente para ocupar el espacio restante.
Consideraciones importantes
- flex-grow solo distribuye el espacio disponible después de que todos los elementos hayan alcanzado su tamaño base.
- Si no hay espacio extra disponible, flex-grow no tiene efecto.
- Los valores decimales son válidos (como
flex-grow: 0.5). - Un valor de 0 significa que el elemento no crecerá, independientemente del espacio disponible.
Ejemplo visual
Para visualizar mejor cómo funciona flex-grow, consideremos este ejemplo:
<div class="flex-container">
<div class="flex-item item1">1</div>
<div class="flex-item item2">2</div>
<div class="flex-item item3">3</div>
</div>
.flex-container {
display: flex;
height: 100px;
background-color: #f0f0f0;
}
.flex-item {
padding: 10px;
text-align: center;
background-color: #3498db;
color: white;
}
.item1 {
flex-grow: 1;
}
.item2 {
flex-grow: 2;
}
.item3 {
flex-grow: 1;
}
En este ejemplo, el segundo elemento crecerá el doble que los otros dos, creando una distribución proporcional del espacio disponible.
La propiedad flex-grow es especialmente útil para crear diseños adaptables que se ajusten automáticamente al espacio disponible, lo que la convierte en una herramienta fundamental para el diseño web moderno y responsive.
Control de reducción con flex-shrink y cálculo de espacio
Mientras que flex-grow controla cómo los elementos crecen cuando hay espacio extra disponible, flex-shrink determina cómo los elementos se reducen cuando no hay suficiente espacio en el contenedor flex. Esta propiedad es fundamental para crear diseños flexibles que se adapten correctamente cuando el espacio es limitado.
Por defecto, todos los elementos flex tienen un valor de flex-shrink: 1, lo que significa que se reducirán de manera proporcional cuando sea necesario. A diferencia de flex-grow, con flex-shrink los elementos ya están dispuestos a encogerse por defecto.
Valores y comportamiento básico
La propiedad flex-shrink acepta un valor numérico no negativo:
.item {
flex-shrink: 1; /* Valor por defecto */
}
- flex-shrink: 0 - El elemento no se reducirá, manteniendo su tamaño base
- flex-shrink: 1 - El elemento se reducirá de forma proporcional cuando sea necesario
- flex-shrink: 2 - El elemento se reducirá el doble que un elemento con valor 1
Cómo se calcula la reducción
El cálculo de la reducción con flex-shrink es más complejo que con flex-grow, ya que tiene en cuenta tanto el factor de reducción como el tamaño base del elemento. Veamos un ejemplo:
.container {
display: flex;
width: 400px; /* Contenedor más pequeño que la suma de los elementos */
}
.item-1 {
flex-basis: 200px;
flex-shrink: 1;
}
.item-2 {
flex-basis: 200px;
flex-shrink: 2;
}
.item-3 {
flex-basis: 200px;
flex-shrink: 3;
}
En este ejemplo:
- El contenedor tiene 400px de ancho
- Los tres elementos tienen un tamaño base de 200px cada uno
- El espacio total necesario sería 600px (200px × 3)
- El déficit de espacio es 200px (600px - 400px)
Para calcular cuánto se reduce cada elemento:
- Multiplicamos cada
flex-basispor suflex-shrink:
- Item 1: 200px × 1 = 200
- Item 2: 200px × 2 = 400
- Item 3: 200px × 3 = 600
- Total: 1200
- Calculamos el factor de reducción para cada elemento:
- Item 1: (200 / 1200) × 200px = 33.33px
- Item 2: (400 / 1200) × 200px = 66.67px
- Item 3: (600 / 1200) × 200px = 100px
- Tamaño final de cada elemento:
- Item 1: 200px - 33.33px = 166.67px
- Item 2: 200px - 66.67px = 133.33px
- Item 3: 200px - 100px = 100px
Ejemplos prácticos
Veamos algunos casos de uso comunes:
1. Evitar que un elemento se reduzca
.container {
display: flex;
}
.flexible-item {
flex-shrink: 1; /* Se reducirá cuando sea necesario */
}
.fixed-width-item {
flex-shrink: 0; /* No se reducirá */
width: 200px;
}
Este patrón es útil para elementos que deben mantener un tamaño constante, como logotipos o botones con un ancho específico.
2. Reducción proporcional en una barra de navegación
.navbar {
display: flex;
}
.brand {
flex-shrink: 0; /* El logo no se reduce */
}
.nav-link {
flex-shrink: 1; /* Enlaces se reducen por igual */
}
.search-box {
flex-shrink: 2; /* El buscador se reduce más rápido */
}
En este ejemplo, cuando el espacio es limitado, el buscador se reducirá primero, seguido por los enlaces de navegación, mientras que el logo mantendrá su tamaño.
3. Galería de imágenes adaptable
.gallery {
display: flex;
}
.main-image {
flex-basis: 500px;
flex-shrink: 1;
}
.thumbnail {
flex-basis: 100px;
flex-shrink: 2; /* Las miniaturas se reducen más rápido */
}
Comportamiento con diferentes tamaños base
El impacto de flex-shrink varía según el tamaño base de los elementos:
.container {
display: flex;
width: 500px;
}
.item-large {
flex-basis: 400px;
flex-shrink: 1;
}
.item-small {
flex-basis: 200px;
flex-shrink: 1;
}
Aunque ambos elementos tienen el mismo valor de flex-shrink: 1, el elemento más grande (item-large) se reducirá más en términos absolutos porque la reducción se calcula proporcionalmente al tamaño base.
Ejemplo visual con diferentes valores de flex-shrink
Para visualizar mejor cómo funciona flex-shrink, consideremos este ejemplo:
<div class="flex-container">
<div class="flex-item shrink-1">flex-shrink: 1</div>
<div class="flex-item shrink-2">flex-shrink: 2</div>
<div class="flex-item shrink-0">flex-shrink: 0</div>
</div>
.flex-container {
display: flex;
width: 100%;
max-width: 600px;
border: 2px solid #333;
}
.flex-item {
flex-basis: 250px; /* Cada elemento necesita 250px */
padding: 15px;
text-align: center;
}
.shrink-1 {
background-color: #3498db;
flex-shrink: 1;
}
.shrink-2 {
background-color: #e74c3c;
flex-shrink: 2;
}
.shrink-0 {
background-color: #2ecc71;
flex-shrink: 0;
}
En este ejemplo:
- El contenedor tiene un ancho máximo de 600px
- Los tres elementos tienen un tamaño base de 250px cada uno (750px en total)
- Cuando el contenedor se reduce, el elemento con
flex-shrink: 2se reducirá el doble que el elemento conflex-shrink: 1 - El elemento con
flex-shrink: 0mantendrá siempre sus 250px
Consideraciones importantes
- Si todos los elementos tienen
flex-shrink: 0, pueden desbordar el contenedor cuando no hay suficiente espacio. - Los valores más altos de flex-shrink hacen que los elementos se reduzcan más rápidamente.
- La reducción se aplica después de considerar los márgenes, bordes y rellenos.
- flex-shrink solo tiene efecto cuando el tamaño total de los elementos es mayor que el tamaño del contenedor.
La propiedad flex-shrink es esencial para crear diseños que se adapten correctamente a diferentes tamaños de pantalla, especialmente cuando el espacio es limitado, como en dispositivos móviles o cuando la ventana del navegador se reduce.
Fuentes y referencias
Documentación oficial y recursos externos para profundizar en CSS
Documentación oficial de CSS
Alan Sastre
Ingeniero de Software y formador, CEO en CertiDevs
Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, CSS es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.
Más tutoriales de CSS
Explora más contenido relacionado con CSS y continúa aprendiendo con nuestros tutoriales gratuitos.
Aprendizajes de esta lección
- Comprender cómo funciona la propiedad flex-grow para controlar el crecimiento proporcional de los elementos flex.
- Entender el funcionamiento de flex-shrink para gestionar la reducción proporcional cuando el espacio es limitado.
- Aplicar patrones prácticos con flex-grow para crear distribuciones equitativas y layouts con barra lateral.
- Aprender a evitar la reducción de elementos específicos con flex-shrink: 0 para logotipos y botones.