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-directionLo primero que viene a la mente al leer su pregunta es que
flex-basisno siempre se aplicawidth.Cuando
flex-directionesrow,flex-basiscontrola el ancho.Pero cuando
flex-directionescolumn,flex-basiscontrola la altura.Diferencias clave
Aquí hay algunas diferencias importantes entre
flex-basisywidth/height:flex-basisse aplica solo a artículos flexibles. Los contenedores flexibles (que no son también artículos flexibles) se ignoraránflex-basispero pueden usarwidthyheight.flex-basisfunciona solo en el eje principal. Por ejemplo, si está dentroflex-direction: column, lawidthpropiedad sería necesaria para dimensionar elementos flexibles horizontalmente.flex-basisno tiene ningún efecto en artículos flexibles posicionados absolutamente.widthy lasheightpropiedades serían necesarias. Los elementos flexibles ubicados de manera absoluta no participan en el diseño flexible .Mediante el uso de la
flexpropiedad, tres propiedades -flex-grow,flex-shrinkyflex-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-basisywidth, a menos queflex-basisseaautoocontent.De la especificación:
Pero el impacto de
autoocontentpuede ser mínimo o nada en absoluto. Más de la especificación:Por lo tanto, de acuerdo con las especificaciones,
flex-basisywidthresolver de forma idéntica, a menos queflex-basisseaautoocontent. En tales casos,flex-basispuede usar el ancho del contenido (que, presumiblemente, lawidthpropiedad también usaría).El
flex-shrinkfactorEs 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/ especificadoheightpuede anularse.Por ejemplo,
flex-basis: 100pxowidth: 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-basisignorado en un contenedor flexible anidado.widthtrabajos.Cuando se usa
flex-basis, el contenedor ignora el tamaño de sus elementos secundarios, y los elementos secundarios desbordan el contenedor. Pero con lawidthpropiedad, el contenedor respeta el tamaño de sus hijos y se expande en consecuencia.Referencias
Ejemplos:
Uso de artículos flexibles
flex-basisy contenedor dewhite-space: nowrapdesbordamientoinline-flex.widthtrabajos.Parece que un contenedor flexible configurado para
inline-flexno reconoceflex-basisa 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
widthse 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-basisfalla 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: absoluteel uso defloatyinline-blocktambién generará la misma salida defectuosa ( demo jsfiddle ).Errores que afectan a IE 10 y 11:
flexlas declaraciones abreviadas conflex-basisvalores sin unidades se ignoranflex-basisno tiene en cuentabox-sizing: border-boxflex-basisno es compatiblecalc()flex-basiscuando se usa laflextaquigrafíafuente
min-width:100px;? ¿Puede ser una opción para desactivar la reducción?flex-shrinkdetiene a lasmin-width. La regla flexible equivalente seríaflex: 1 0 100px.flex: 1 0 100pxconduce 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-shrinkyflex-basis(o la taquigrafíaflex :fg fs fb) ... puede dar algunos resultados interesantes.fuente
flex-basisywidth / heightestablecer el tamaño inicial / partir de un elemento. Por ejemplo,flex-basis: 200pxbásicamente funciona igual queflex-basis: auto; width: 200px;. Parece que cuandoflex-basisno está configurado enauto, simplemente anula elwidth / heightvalor. 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/heighttome el control y se aplicarán sus valores.Es una muy buena idea, casi esencial, definir
width/heightelementos, incluso si tiene un valor completamente diferenteflex-basis. Recuerde probar deshabilitandodisplay:flexy viendo lo que obtiene.fuente
flex.