¿Qué significa flex: 1?

129

Como todos sabemos, la flexpropiedad es una abreviatura para el flex-grow, flex-shrinky las flex-basispropiedades. Su valor predeterminado es 0 1 auto, lo que significa

flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;

pero he notado que en muchos lugares flex: 1se usa. ¿Es una abreviatura de 1 1 autoo 1 0 auto? No puedo entender lo que significa y no obtengo nada cuando busco en Google.

Md. Rafee
fuente
1
citando w3schools.com "La propiedad flex es una abreviatura de las propiedades flex-grow, flex-shrink y flex-base"
Imran Ali

Respuestas:

86

Aquí está la explicación:

https://www.w3.org/TR/css-flexbox-1/#flex-common

flex: <number-positive>
Equivalente a flex: <positive-number> 1 0. Hace que el elemento flexible sea flexible y establece la base flexible en cero, lo que da como resultado un elemento que recibe la proporción especificada del espacio libre en el contenedor flexible. Si todos los elementos del contenedor flexible utilizan este patrón, sus tamaños serán proporcionales al factor flexible especificado.

Por flex:1lo tanto es equivalente aflex: 1 1 0

Danut Pralea
fuente
10
flexión: 1; no es igual a flex: 1 1 0; vea mi respuesta a continuación para ver por qué.
DreamTeK
En una nota al margen: creo que cuando se aplica lo mismo flexa todos los niños, lo que realmente importa es flex: 1 ? 0;dónde "?" puede ser cualquier cosa, no hará ninguna diferencia
flen
@DreamTeK Solo en navegadores que no cumplen con los estándares como Chrome.
TylerH
1
@TylerH Correcto y anotado en mi respuesta, sin embargo, what does flex:1 mean?está abierto a interpretación. La operación no pide especificaciones, solo lo que está sucediendo. Desafortunadamente, Chrome es ahora el navegador más popular y se requiere soporte. ¡Yo mismo no soy fan ni usuario de Chrome!
DreamTeK
1
@TylerH Por eso, en mi respuesta, se hace referencia a los estados "Debe tenerse en cuenta que esto falla porque estos navegadores no han cumplido con la especificación". junto con un enlace a la especificación.
DreamTeK
99

flex: 1 significa lo siguiente:

flex-grow : 1;    ➜ The div will grow in same proportion as the window-size       
flex-shrink : 1;  ➜ The div will shrink in same proportion as the window-size 
flex-basis : 0;   ➜ The div does not have a starting value as such and will 
                     take up screen as per the screen size available for
                     e.g:- if 3 divs are in the wrapper then each div will take 33%.
Rinku Bhilota
fuente
1
@CookieMonster No, flex: 1significa 1 1 0... pero en IE lo es1 1 0px
Ason
@LGSon, se puede omitir la unidad desde el valor base de modo 1 1 0y 1 1 0pxson equivalentes. IE simplemente es compatible con el que tiene una unidad.
CookieMonster
@CookieMonster Sé cómo funciona Flexbox, solo estaba corrigiendo tu primer comentario, que está mal.
Ason
@LGSon, ¿Cómo es flex: 1 significa 1 1 0px incorrecto cuando 1 1 0pxy 1 1 0son equivalentes?
CookieMonster
2
@CookieMonster Pueden representar lo mismo, pero no son equivalentes, ya que cuando se usa un valor sin unidades para flex-basis, el contenido se ignora y el tamaño del elemento se basa en su flex-grow/ flex-shrink.
Ason
78

TEN CUIDADO

En algunos navegadores:

flex:1; no es igualflex:1 1 0;

flex:1;= flex:1 1 0n;(donde n es una unidad de longitud).

  • flex-grow: un número que especifica cuánto crecerá el elemento en relación con el resto de los elementos flexibles.
  • flex-shrink Un número que especifica cuánto se encogerá el artículo en relación con el resto de los artículos flexibles
  • base flexible La longitud del artículo. Valores legales: "auto", "heredar" o un número seguido de "%", "px", "em" o cualquier otra unidad de longitud.

El punto clave aquí es que la base flexible requiere una unidad de longitud .

En Chrome por ejemplo flex:1y flex:1 1 0producir resultados diferentes. En la mayoría de las circunstancias, puede parecer que flex:1 1 0;está funcionando, pero examinemos lo que realmente sucede:

EJEMPLO

La base flexible se ignora y solo se aplican flex-grow y flex-shrink.

flex:1 1 0;= flex:1 1;=flex:1;

Sin embargo, esto puede parecer correcto a primera vista si la unidad aplicada del contenedor está anidada; ¡esperar lo inesperado!

Prueba este ejemplo en CROMO

.Wrap{
  padding:10px;
  background: #333;
}
.Flex110x, .Flex1, .Flex110, .Wrap {
  display: -webkit-flex;
  display: flex;
  -webkit-flex-direction: column;
  flex-direction: column;
}
.Flex110 {
  -webkit-flex: 1 1 0;
  flex: 1 1 0;
}
.Flex1 {
  -webkit-flex: 1;
  flex: 1;
}
.Flex110x{
  -webkit-flex: 1 1 0%;
  flex: 1 1 0%;
}
FLEX 1 1 0
<div class="Wrap">
  <div class="Flex110">
    <input type="submit" name="test1" value="TEST 1">
  </div>
</div>

FLEX 1
<div class="Wrap">
  <div class="Flex1">
    <input type="submit" name="test2" value="TEST 2">
  </div>
</div>

FLEX 1 1 0%
<div class="Wrap">
  <div class="Flex110x">
    <input type="submit" name="test3" value="TEST 3">
  </div>
</div>

COMPATIBILIDAD

Cabe señalar que esto falla porque algunos navegadores no han cumplido con la especificación .

Navegadores que utilizan la especificación flexible completa:

  • Firefox - ✓
  • Edge - ✓ (Lo sé, también me sorprendió).
  • Cromo - x
  • Valiente - x
  • Opera - x
  • IE - (lol, funciona sin unidad de longitud pero no con una).

ACTUALIZACIÓN 2019

Las últimas versiones de Chrome parecen haber solucionado finalmente este problema, pero otros navegadores aún no lo han hecho.

Probado y funcionando en Chrome Ver 74.

DreamTeK
fuente
1
Cuando el valor es 0, la unidad no es obligatoria. La especificación dice que flex: 1es lo mismo que flex: 1 1 0. En su ejemplo, si elimina la .Wrapclase en la .Flex110x,.Flex1, .Flex110, .Wrapregla, funciona como se esperaba.
Proporcione un enlace, por favor, no puedo encontrar en la especificación lo que está diciendo. No he inventado nada, mi respuesta se basa en la especificación de
@Obsidian Aquí está el enlace: w3.org/TR/css-flexbox-1 Si va a la parte de 'taquigrafía' encontrará: "flex: [número-positivo] Equivalente a flex: [número-positivo] 1 0 ...
MikeB
1
@Toskan Para una máxima compatibilidad, use la sintaxis completaflex:1 1 0n;
DreamTeK
2
Gracias por señalar esta diferencia, no pude averiguar de dónde provenían mis problemas. Ten algo de recompensa.
Nit