Ha habido preguntas y artículos sobre esto, pero nada concluyente por lo que puedo decir. El mejor resumen que pude encontrar es
flex-base le permite especificar el tamaño inicial / inicial del elemento, antes de calcular cualquier otra cosa. Puede ser un porcentaje o un valor absoluto.
... que en sí mismo no dice mucho sobre el comportamiento de los elementos con un conjunto de bases flexibles . Con mi conocimiento actual de flexbox, no veo por qué eso no podría describir el ancho también.
Me gustaría saber cómo exactamente la base flexible es diferente del ancho en la práctica:
- Si reemplazo el ancho con base flexible (y viceversa), ¿qué cambiará visualmente?
- ¿Qué sucede si configuro ambos a un valor diferente? ¿Qué pasa si tienen el mismo valor?
- ¿Hay algunos casos especiales en los que el uso de ancho o flex-base tendría una diferencia significativa con el uso del otro?
- ¿Cómo difieren el ancho y la base flexible cuando se usan junto con otros estilos de flexbox, como flex-wrap , flex-grow y flex-shrink ?
- ¿Alguna otra diferencia significativa?
Edición / aclaración : esta pregunta se ha formulado en un formato diferente en ¿Qué conjuntos de propiedades de base flexible son exactamente? pero sentí que sería agradable una comparación o resumen más directo de las diferencias de base flexible y ancho (o altura ).
Respuestas:
Considerar
flex-direction
Lo primero que viene a la mente al leer su pregunta es que
flex-basis
no siempre se aplicawidth
.Cuando
flex-direction
esrow
,flex-basis
controla el ancho.Pero cuando
flex-direction
escolumn
,flex-basis
controla la altura.Diferencias clave
Aquí hay algunas diferencias importantes entre
flex-basis
ywidth
/height
:flex-basis
se aplica solo a artículos flexibles. Los contenedores flexibles (que no son también artículos flexibles) se ignoraránflex-basis
pero pueden usarwidth
yheight
.flex-basis
funciona solo en el eje principal. Por ejemplo, si está dentroflex-direction: column
, lawidth
propiedad sería necesaria para dimensionar elementos flexibles horizontalmente.flex-basis
no tiene ningún efecto en artículos flexibles posicionados absolutamente.width
y lasheight
propiedades serían necesarias. Los elementos flexibles ubicados de manera absoluta no participan en el diseño flexible .Mediante el uso de la
flex
propiedad, tres propiedades -flex-grow
,flex-shrink
yflex-basis
- puede ser perfectamente combinadas en una sola declaración. Usandowidth
, la misma regla requeriría múltiples líneas de código.Comportamiento del navegador
En términos de cómo se representan, no debería haber diferencia entre
flex-basis
ywidth
, a menos queflex-basis
seaauto
ocontent
.De la especificación:
Pero el impacto de
auto
ocontent
puede ser mínimo o nada en absoluto. Más de la especificación:Por lo tanto, de acuerdo con las especificaciones,
flex-basis
ywidth
resolver de forma idéntica, a menos queflex-basis
seaauto
ocontent
. En tales casos,flex-basis
puede usar el ancho del contenido (que, presumiblemente, lawidth
propiedad también usaría).El
flex-shrink
factorEs importante recordar la configuración inicial de un contenedor flexible. Algunas de estas configuraciones incluyen:
flex-direction: row
- los elementos flexibles se alinearán horizontalmentejustify-content: flex-start
- los elementos flexibles se apilarán al comienzo de la línea en el eje principalalign-items: stretch
- los artículos flexibles se expandirán para cubrir el tamaño transversal del contenedorflex-wrap: nowrap
- los artículos flexibles se ven obligados a permanecer en una sola líneaflex-shrink: 1
- un elemento flexible puede encogerseTenga en cuenta la última configuración.
Debido a que los elementos flexibles pueden reducirse de forma predeterminada (lo que evita que desborden el contenedor), el
flex-basis
/width
/ especificadoheight
puede anularse.Por ejemplo,
flex-basis: 100px
owidth: 100px
, junto conflex-shrink: 1
, no necesariamente será de 100 px.Para representar el ancho especificado, y mantenerlo fijo , deberá desactivar la reducción:
O
O, según lo recomendado por la especificación:
Errores del navegador
Algunos navegadores tienen problemas para dimensionar elementos flexibles en contenedores flexibles anidados.
flex-basis
ignorado en un contenedor flexible anidado.width
trabajos.Cuando se usa
flex-basis
, el contenedor ignora el tamaño de sus elementos secundarios, y los elementos secundarios desbordan el contenedor. Pero con lawidth
propiedad, el contenedor respeta el tamaño de sus hijos y se expande en consecuencia.Referencias
Ejemplos:
Uso de artículos flexibles
flex-basis
y contenedor dewhite-space: nowrap
desbordamientoinline-flex
.width
trabajos.Parece que un contenedor flexible configurado para
inline-flex
no reconoceflex-basis
a un niño cuando representa a un hermanowhite-space: nowrap
(aunque podría ser un elemento con un ancho indefinido). El contenedor no se expande para acomodar los artículos.Pero cuando
width
se utiliza la propiedad en lugar deflex-basis
, el contenedor respeta el tamaño de sus elementos secundarios y se expande en consecuencia. Esto no es un problema en IE11 y Edge.Referencias
Ejemplo:
flex-basis
(yflex-grow
) no funciona en el elemento de tablaReferencias
flex-basis
falla en Chrome y Firefox cuando el contenedor de los abuelos es un elemento que se contrae para adaptarse. La configuración funciona bien en Edge.Al igual que en el ejemplo presentado en el enlace anterior,
position: absolute
el uso defloat
yinline-block
también generará la misma salida defectuosa ( demo jsfiddle ).Errores que afectan a IE 10 y 11:
flex
las declaraciones abreviadas conflex-basis
valores sin unidades se ignoranflex-basis
no tiene en cuentabox-sizing: border-box
flex-basis
no es compatiblecalc()
flex-basis
cuando se usa laflex
taquigrafíafuente
min-width:100px;
? ¿Puede ser una opción para desactivar la reducción?flex-shrink
detiene a lasmin-width
. La regla flexible equivalente seríaflex: 1 0 100px
.flex: 1 0 100px
conduce al mismo resultado, pero no estoy seguro de lo que quiere decir con "equivalente".flex: 0 0 100px
, por ejemplo?Además del excelente resumen de Michael_B, vale la pena repetir esto:
La parte importante aquí es inicial .
Por sí solo, esto se resuelve en ancho / alto hasta que las otras propiedades de crecimiento / contracción de flexión entran en juego.
Entonces. un niño con
inicialmente tendrá un ancho del 25%, pero luego se expandirá de inmediato lo más que pueda hasta que se tengan en cuenta los otros elementos. Si no hay ninguno ... será 100% ancho / alto.
Una demostración rápida:
Mostrar fragmento de código
Experimentar con
flex-grow
,flex-shrink
yflex-basis
(o la taquigrafíaflex :fg fs fb
) ... puede dar algunos resultados interesantes.fuente
flex-basis
ywidth / height
establecer el tamaño inicial / partir de un elemento. Por ejemplo,flex-basis: 200px
básicamente funciona igual queflex-basis: auto; width: 200px;
. Parece que cuandoflex-basis
no está configurado enauto
, simplemente anula elwidth / height
valor. La única diferencia que veo es la forma en que se maneja el desbordamiento de contenido.Posiblemente el punto más importante para agregar:
¿Qué pasa si el navegador no es compatible
flex
? En tal caso,width/height
tome el control y se aplicarán sus valores.Es una muy buena idea, casi esencial, definir
width/height
elementos, incluso si tiene un valor completamente diferenteflex-basis
. Recuerde probar deshabilitandodisplay:flex
y viendo lo que obtiene.fuente
flex
.