Propiedad CSS flex-grow
La propiedad flex-grow define cuánto crecerá el elemento. Consulta sus valores y prueba algunos ejemplos.
La propiedad flex-grow controla cuánto crece un elemento flex para ocupar el espacio libre restante dentro de su contenedor flex. El valor es un factor de crecimiento sin unidad, no una longitud: responde a la pregunta "cuando hay espacio extra, ¿qué parte de él debe tomar este elemento?"
Cuando cada elemento tiene un factor flex-grow, el espacio sobrante se divide proporcionalmente entre esos factores. El tamaño principal de un elemento flex es su anchura o su altura, dependiendo de la flex-direction: en una fila los elementos crecen horizontalmente, en una columna crecen verticalmente.
Esta propiedad es una de las propiedades CSS3. Normalmente se usa junto con flex-shrink (cómo se reducen los elementos cuando el espacio es insuficiente) y flex-basis (su tamaño inicial), y las tres se suelen establecer a la vez mediante la abreviación flex.
Cómo se distribuye el espacio libre
El algoritmo flex se ejecuta en dos pasos:
- Distribuir cada elemento según su
flex-basis(o su tamaño de contenido siflex-basis: auto). - Medir el espacio libre — el tamaño principal del contenedor menos la suma de esos tamaños base — y repartirlo en proporción al factor
flex-growde cada elemento.
Si los elementos anteriores empiezan con anchura casi cero y el contenedor tiene, digamos, 600px de espacio libre con factores 1, 2, 1, 1, 1 (total 6), cada unidad vale 600 / 6 = 100px. El elemento con factor 2 recibe 200px de crecimiento, mientras que cada elemento con factor 1 recibe 100px. Duplicar el factor duplica la parte del espacio extra, pero no hace que un elemento sea el doble de ancho en total.
flex-grow solo tiene efecto cuando hay espacio libre y los elementos son elementos flex reales (el padre tiene display: flex o display: inline-flex). Sin espacio libre, o sin elementos flex, no tiene ningún efecto.
| Valor inicial | 0 |
|---|---|
| Se aplica a | Elementos flex, incluyendo pseudoelementos en flujo. |
| Heredable | No. |
| Animable | Sí. Los elementos son animables. |
| Versión | CSS3 |
| Sintaxis DOM | object.style.flexGrow = 3; |
Sintaxis
Sintaxis de la propiedad CSS flex-grow
flex-grow: number | initial | inherit;Ejemplo de la propiedad flex-grow:
Ejemplo de la propiedad CSS flex-grow con valor numérico
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<style>
.box {
width: 320px;
height: 120px;
border: 2px solid #cccccc;
display: flex;
}
.box div:nth-of-type(1) {
flex-grow: 1;
}
.box div:nth-of-type(2) {
flex-grow: 2;
}
.box div:nth-of-type(3) {
flex-grow: 1;
}
.box div:nth-of-type(4) {
flex-grow: 1;
}
.box div:nth-of-type(5) {
flex-grow: 1;
}
</style>
</head>
<body>
<h2>Flex-grow property example</h2>
<div class="box">
<div style="background-color: #eeeeee;"></div>
<div style="background-color: #1c87c9;"></div>
<div style="background-color: #8ebf42;"></div>
<div style="background-color: #cccccc;"></div>
<div style="background-color: #666666;"></div>
</div>
</body>
</html>Resultado
Ejemplo de la propiedad flex-grow con un factor de crecimiento mayor:
Propiedad CSS flex-grow con un número como valor
<!DOCTYPE html>
<html>
<head>
<title>The title of the document</title>
<style>
.box {
width: 320px;
height: 120px;
border: 2px solid #cccccc;
display: flex;
}
.box div:nth-of-type(1) {
flex-grow: 1;
}
.box div:nth-of-type(2) {
flex-grow: 6;
}
.box div:nth-of-type(3) {
flex-grow: 1;
}
.box div:nth-of-type(4) {
flex-grow: 1;
}
.box div:nth-of-type(5) {
flex-grow: 1;
}
</style>
</head>
<body>
<h2>Flex-grow property example</h2>
<div class="box">
<div style="background-color: #eeeeee;"></div>
<div style="background-color: #1c87c9;"></div>
<div style="background-color: #8ebf42;"></div>
<div style="background-color: #cccccc;"></div>
<div style="background-color: #666666;"></div>
</div>
</body>
</html>Usar flex-grow dentro de la abreviación flex
Rara vez se escribe flex-grow por sí solo. El patrón más común es flex: 1, que es la abreviación de flex-grow: 1; flex-shrink: 1; flex-basis: 0. Establecer la base en 0 le indica al navegador que ignore el tamaño del contenido y divida el contenedor completo proporcionalmente, de modo que varios elementos con flex: 1 acaben con exactamente la misma anchura:
.item {
flex: 1; /* grow:1 shrink:1 basis:0 → equal columns */
}Para que un elemento tome el doble de espacio que los demás, aumenta su factor de crecimiento:
.sidebar { flex: 1; }
.main { flex: 2; } /* gets 2/3 of the space, sidebar gets 1/3 */Errores comunes
- Factor, no anchura.
flex-grow: 2no significa "el doble de ancho" — significa "el doble de la parte del espacio sobrante." Cuando los elementos tienen tamaños de contenido diferentes, las anchuras finales no serán una proporción exacta de 2:1 a menos queflex-basissea0. - Los valores negativos no son válidos. Se ignoran y la propiedad conserva su valor anterior.
- Sin espacio libre, sin efecto. Si los elementos ya llenan (o desbordan) el contenedor,
flex-growno cambia nada — ese caso lo gestiona flex-shrink. - El factor no tiene unidad. No escribas
flex-grow: 2px; ese no es un valor válido.
Valores
| Valor | Descripción | Pruébalo |
|---|---|---|
| number | Especifica cuánto crecerá el elemento en relación con el resto de los elementos flexibles del mismo contenedor. El valor predeterminado es 0. | Pruébalo » |
| initial | Establece la propiedad en su valor predeterminado. | Pruébalo » |
| inherit | Hereda esta propiedad del elemento padre. |