Considerar flex-direction
Lo primero que viene a la mente al leer su pregunta es que flex-basis
no siempre se aplica width
.
Cuando flex-direction
es row
, flex-basis
controla el ancho.
Pero cuando flex-direction
es column
, flex-basis
controla la altura.
Diferencias clave
Aquí hay algunas diferencias importantes entre flex-basis
y width
/ height
:
flex-basis
se aplica solo a artículos flexibles. Los contenedores flexibles (que no son también artículos flexibles) se ignorarán flex-basis
pero pueden usar width
y height
.
flex-basis
funciona solo en el eje principal. Por ejemplo, si está dentro flex-direction: column
, la width
propiedad sería necesaria para dimensionar elementos flexibles horizontalmente.
flex-basis
no tiene ningún efecto en artículos flexibles posicionados absolutamente. width
y las height
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
y flex-basis
- puede ser perfectamente combinadas en una sola declaración. Usando width
, 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
y width
, a menos que flex-basis
sea auto
o content
.
De la especificación:
7.2.3 La flex-basis
propiedad
Para todos los valores que no sean auto
y content
, flex-basis
se resuelve de la misma manera que width
en los modos de escritura horizontal.
Pero el impacto de auto
o content
puede ser mínimo o nada en absoluto. Más de la especificación:
auto
Cuando se especifica en un elemento flexible, la auto
palabra clave recupera el valor de la propiedad de tamaño principal como se usa flex-basis
. Si ese valor es él mismo auto
, entonces el valor utilizado es content
.
content
Indica el tamaño automático, en función del contenido del elemento flexible.
Nota: Este valor no estaba presente en la versión inicial de Diseño de caja flexible y, por lo tanto, algunas implementaciones anteriores no lo admitirán. El efecto equivalente se puede lograr mediante el uso auto
junto con un tamaño principal ( width
o height
) de auto
.
Por lo tanto, de acuerdo con las especificaciones, flex-basis
y width
resolver de forma idéntica, a menos que flex-basis
sea auto
o content
. En tales casos, flex-basis
puede usar el ancho del contenido (que, presumiblemente, la width
propiedad también usaría).
El flex-shrink
factor
Es importante recordar la configuración inicial de un contenedor flexible. Algunas de estas configuraciones incluyen:
flex-direction: row
- los elementos flexibles se alinearán horizontalmente
justify-content: flex-start
- los elementos flexibles se apilarán al comienzo de la línea en el eje principal
align-items: stretch
- los artículos flexibles se expandirán para cubrir el tamaño transversal del contenedor
flex-wrap: nowrap
- los artículos flexibles se ven obligados a permanecer en una sola línea
flex-shrink: 1
- un elemento flexible puede encogerse
Tenga 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
/ especificado height
puede anularse.
Por ejemplo, flex-basis: 100px
o width: 100px
, junto con flex-shrink: 1
, no necesariamente será de 100 px.
Para representar el ancho especificado, y mantenerlo fijo , deberá desactivar la reducción:
div {
width: 100px;
flex-shrink: 0;
}
O
div {
flex-basis: 100px;
flex-shrink: 0;
}
O, según lo recomendado por la especificación:
flex: 0 0 100px; /* don't grow, don't shrink, stay fixed at 100px */
7.2. Componentes de flexibilidad
Se alienta a los autores a controlar la flexibilidad utilizando la flex
taquigrafía en lugar de sus propiedades de la mano directamente, ya que la taquigrafía restablece correctamente cualquier componente no especificado para acomodar usos comunes .
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 la width
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 de white-space: nowrap
desbordamiento inline-flex
. width
trabajos.
Parece que un contenedor flexible configurado para inline-flex
no reconoce flex-basis
a un niño cuando representa a un hermano white-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 de flex-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
(y flex-grow
) no funciona en el elemento de tabla
Referencias
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 de float
y inline-block
también generará la misma salida defectuosa ( demo jsfiddle ).
Errores que afectan a IE 10 y 11: