
Tamaño base con flex-basis y su relación con width/height
La propiedad flex-basis define el tamaño inicial de un elemento flex antes de que se apliquen las propiedades de crecimiento (flex-grow) o reducción (flex-shrink). Podemos considerarla como el "tamaño base" o "tamaño sugerido" para un elemento dentro de un contenedor flex.
Esta propiedad es fundamental para entender cómo se comportan los elementos flex, ya que establece el punto de partida desde el cual los elementos pueden crecer o reducirse.
Valores básicos de flex-basis
.item {
flex-basis: auto; /* Valor por defecto */
}
Los valores más comunes para flex-basis son:
- auto: Utiliza el tamaño intrínseco del elemento (width/height según el eje principal)
- Longitudes: Valores como
100px,10rem,50%, etc. - content: Basa el tamaño en el contenido del elemento (poco soportado en navegadores)
- 0: Ignora el tamaño intrínseco y parte desde cero
Relación con width y height
La relación entre flex-basis y las propiedades width/height es uno de los aspectos más importantes (y a veces confusos) de Flexbox:
.container {
display: flex;
flex-direction: row; /* Dirección horizontal (por defecto) */
}
.item {
width: 200px;
flex-basis: 150px;
}
En este ejemplo, ¿qué tamaño tendrá el elemento? La respuesta depende de la dirección del eje principal:
- En flex-direction: row (horizontal), flex-basis tiene prioridad sobre width
- En flex-direction: column (vertical), flex-basis tiene prioridad sobre height
Veamos un ejemplo más claro:
.container {
display: flex; /* Por defecto, flex-direction: row */
}
.item {
width: 200px; /* Será ignorado si flex-basis no es auto */
flex-basis: 150px; /* Este valor prevalece */
}
En este caso, el elemento tendrá un tamaño inicial de 150px, no de 200px, porque flex-basis tiene prioridad en el eje principal.
Comportamiento según el eje principal
El comportamiento de flex-basis cambia según la dirección del eje principal:
/* Eje horizontal (row) */
.container-row {
display: flex;
flex-direction: row;
}
.item-row {
flex-basis: 200px; /* Afecta al ancho */
height: 100px; /* Se respeta normalmente */
}
/* Eje vertical (column) */
.container-column {
display: flex;
flex-direction: column;
}
.item-column {
flex-basis: 200px; /* Afecta a la altura */
width: 100px; /* Se respeta normalmente */
}
Ejemplo práctico: Galería de imágenes
Veamos un ejemplo práctico de cómo usar flex-basis para crear una galería de imágenes con diferentes tamaños base:
<div class="gallery">
<div class="image featured">Imagen destacada</div>
<div class="image">Imagen normal</div>
<div class="image">Imagen normal</div>
</div>
.gallery {
display: flex;
width: 100%;
gap: 10px;
}
.image {
flex-basis: 200px;
flex-grow: 1;
height: 150px;
background-color: #3498db;
color: white;
display: flex;
justify-content: center;
align-items: center;
}
.featured {
flex-basis: 400px; /* La imagen destacada tiene un tamaño base mayor */
}
En este ejemplo, todas las imágenes tienen un tamaño base diferente, pero pueden crecer proporcionalmente gracias a flex-grow: 1.
Flex-basis: auto vs width/height
Cuando flex-basis está establecido en auto (su valor por defecto), el comportamiento es especial:
.item {
flex-basis: auto;
width: 200px;
}
Con flex-basis: auto, el navegador mirará:
- Primero, si hay un width definido (en flex-direction: row) o height (en flex-direction: column)
- Si no hay dimensión definida, usará el tamaño del contenido
Este comportamiento hace que flex-basis: auto sea muy útil para crear diseños flexibles que respeten las dimensiones explícitas cuando están definidas.
Flex-basis: 0 vs flex-basis: auto
La diferencia entre estos dos valores es crucial para entender Flexbox:
/* Con flex-basis: 0 */
.container-1 {
display: flex;
}
.item-1 {
flex-basis: 0;
flex-grow: 1;
}
/* Con flex-basis: auto */
.container-2 {
display: flex;
}
.item-2 {
flex-basis: auto; /* Respeta el contenido o width/height */
flex-grow: 1;
}
- Con
flex-basis: 0, todos los elementos empiezan desde cero y crecen proporcionalmente según su valor de flex-grow, ignorando completamente su contenido o dimensiones. - Con
flex-basis: auto, los elementos empiezan desde su tamaño intrínseco (contenido o width/height) y luego crecen proporcionalmente.
Ejemplo visual: Comparación de diferentes valores de flex-basis
<div class="flex-container">
<div class="flex-item basis-auto">flex-basis: auto</div>
<div class="flex-item basis-0">flex-basis: 0</div>
<div class="flex-item basis-200">flex-basis: 200px</div>
</div>
.flex-container {
display: flex;
width: 100%;
border: 2px solid #333;
margin-bottom: 20px;
}
.flex-item {
padding: 15px;
text-align: center;
flex-grow: 1;
}
.basis-auto {
background-color: #3498db;
flex-basis: auto;
/* Sin width definido, usará el tamaño del contenido */
}
.basis-0 {
background-color: #e74c3c;
flex-basis: 0;
/* Ignora el contenido y parte desde cero */
}
.basis-200 {
background-color: #2ecc71;
flex-basis: 200px;
/* Comienza con 200px exactos */
}
Casos de uso comunes
1. Columnas de igual ancho independientemente del contenido
.equal-columns {
display: flex;
}
.column {
flex-basis: 0;
flex-grow: 1;
}
Este patrón es perfecto para crear columnas que tengan exactamente el mismo ancho, sin importar cuánto contenido tenga cada una.
2. Elementos que respetan un tamaño mínimo
.container {
display: flex;
}
.item {
flex-basis: 200px;
flex-grow: 1;
flex-shrink: 1;
}
Aquí, los elementos intentarán mantener al menos 200px de ancho, pero pueden crecer o reducirse según sea necesario.
3. Barra lateral con ancho fijo
.page-layout {
display: flex;
}
.sidebar {
flex-basis: 250px;
flex-shrink: 0; /* Evita que se reduzca */
}
.main-content {
flex-basis: 0;
flex-grow: 1;
}
Este patrón crea una barra lateral que mantiene su ancho mientras el contenido principal ocupa todo el espacio restante.
Consideraciones importantes
- flex-basis siempre se refiere a la dimensión en el eje principal (ancho en row, altura en column).
- Si un elemento tiene
flex-basis: 0yflex-grow: 0, su tamaño será 0 (invisible). - Los valores porcentuales de flex-basis se calculan respecto al tamaño del contenedor flex.
- Para un control completo, es recomendable establecer explícitamente flex-basis en lugar de confiar en el valor por defecto.
La propiedad flex-basis es esencial para crear diseños flexibles y predecibles, ya que establece el punto de partida desde el cual los elementos pueden adaptarse. Entender su relación con width y height te permitirá crear layouts más robustos y evitar comportamientos inesperados en tus diseños con Flexbox.
Shorthand flex y valores comunes (flex: 1, flex: auto, flex: none)
La propiedad shorthand flex es una forma abreviada y util de controlar simultáneamente las tres propiedades principales de los elementos flexibles: flex-grow, flex-shrink y flex-basis. Esta sintaxis condensada nos permite definir el comportamiento completo de un elemento flex con una sola declaración, lo que hace nuestro código más limpio y mantenible.
La sintaxis básica de esta propiedad es:
.item {
flex: [flex-grow] [flex-shrink] [flex-basis];
}
Aunque puedes especificar los tres valores, CSS también ofrece algunos valores predefinidos que cubren los patrones de diseño más comunes y que simplifican enormemente nuestro trabajo.
Valores predefinidos más utilizados
El valor flex: 1
.item {
flex: 1;
}
Este valor es probablemente el más utilizado en diseños flexbox. Cuando aplicamos flex: 1 a un elemento, estamos estableciendo:
.item {
flex-grow: 1; /* Puede crecer */
flex-shrink: 1; /* Puede reducirse */
flex-basis: 0%; /* Comienza desde cero */
}
Este valor hace que los elementos:
- Ignoren su tamaño inicial
- Ocupen todo el espacio disponible de forma equitativa
- Se reduzcan proporcionalmente cuando no hay suficiente espacio
Es perfecto para crear distribuciones equitativas como menús de navegación, galerías o columnas de igual ancho:
.equal-columns {
display: flex;
}
.column {
flex: 1;
padding: 20px;
}
El valor flex: auto
.item {
flex: auto;
}
Este valor es similar a flex: 1, pero con una diferencia crucial en el tamaño base:
.item {
flex-grow: 1; /* Puede crecer */
flex-shrink: 1; /* Puede reducirse */
flex-basis: auto; /* Comienza desde su tamaño intrínseco */
}
Con flex: auto, los elementos:
- Comienzan con su tamaño de contenido natural
- Crecen para ocupar el espacio disponible
- Se reducen cuando es necesario
La diferencia clave con flex: 1 es que los elementos con más contenido obtendrán inicialmente más espacio:
.content-aware {
display: flex;
}
.item {
flex: auto;
padding: 10px;
}
El valor flex: none
.item {
flex: none;
}
Este valor crea elementos completamente inflexibles:
.item {
flex-grow: 0; /* No crece */
flex-shrink: 0; /* No se reduce */
flex-basis: auto; /* Mantiene su tamaño intrínseco */
}
Con flex: none, los elementos:
- Mantienen su tamaño exacto basado en su contenido o dimensiones explícitas
- No crecen aunque haya espacio disponible
- No se reducen aunque falte espacio (pueden causar desbordamiento)
Es ideal para elementos que deben mantener dimensiones fijas, como logotipos, iconos o botones con un tamaño específico:
.toolbar {
display: flex;
}
.logo {
flex: none;
width: 100px;
}
.spacer {
flex: 1;
}
.action-button {
flex: none;
width: 80px;
}
El valor flex: initial (o flex: 0 auto)
.item {
flex: initial;
}
Este es el valor por defecto para los elementos flex:
.item {
flex-grow: 0; /* No crece */
flex-shrink: 1; /* Puede reducirse */
flex-basis: auto; /* Comienza desde su tamaño intrínseco */
}
Con flex: initial, los elementos:
- Mantienen su tamaño basado en su contenido
- No crecen aunque haya espacio disponible
- Se reducen si es necesario para evitar desbordamiento
Es útil para elementos que deben mantener su tamaño natural pero pueden comprimirse si el espacio es limitado:
.navbar {
display: flex;
}
.nav-item {
flex: initial;
padding: 10px 15px;
}
Ejemplos prácticos con valores comunes
Veamos algunos ejemplos prácticos que muestran cómo estos valores predefinidos resuelven problemas de diseño comunes:
1. Diseño de aplicación con barra lateral y contenido principal
<div class="app-layout">
<nav class="sidebar">Navegación</nav>
<main class="content">Contenido principal</main>
</div>
.app-layout {
display: flex;
height: 100vh;
}
.sidebar {
flex: none; /* No crece ni se reduce */
width: 250px;
background-color: #f0f0f0;
}
.content {
flex: 1; /* Ocupa todo el espacio restante */
padding: 20px;
overflow: auto;
}
2. Barra de herramientas con elementos de diferentes comportamientos
<div class="toolbar">
<div class="tool-group">
<button>Cortar</button>
<button>Copiar</button>
<button>Pegar</button>
</div>
<div class="spacer"></div>
<div class="search">
<input type="text" placeholder="Buscar...">
</div>
</div>
.toolbar {
display: flex;
padding: 10px;
background-color: #f5f5f5;
}
.tool-group {
flex: none; /* Mantiene su tamaño exacto */
display: flex;
gap: 5px;
}
.spacer {
flex: 1; /* Ocupa todo el espacio disponible */
}
.search {
flex: auto; /* Crece pero respeta su contenido */
max-width: 300px;
}
3. Tarjetas de producto con diferentes comportamientos
<div class="product-grid">
<div class="product featured">Producto destacado</div>
<div class="product">Producto normal</div>
<div class="product">Producto normal</div>
<div class="product">Producto normal</div>
</div>
.product-grid {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.product {
flex: 1 1 300px; /* Puede crecer, puede reducirse, base 300px */
min-height: 200px;
padding: 15px;
background-color: #e0e0e0;
}
.featured {
flex: 2 1 400px; /* Crece el doble, puede reducirse, base 400px */
background-color: #d0d0f0;
}
Valores numéricos personalizados
Además de los valores predefinidos, podemos crear combinaciones personalizadas para casos específicos:
.item-1 {
flex: 2 0 200px;
/* Crece el doble que otros elementos, no se reduce, comienza con 200px */
}
.item-2 {
flex: 0 2 auto;
/* No crece, se reduce el doble que otros elementos, tamaño base automático */
}
Formas abreviadas con menos valores
La propiedad flex también permite formas abreviadas con uno o dos valores:
Con un valor numérico (solo flex-grow):
.item {
flex: 2;
/* Equivale a: flex-grow: 2; flex-shrink: 1; flex-basis: 0%; */
}
Con un valor de longitud o porcentaje (solo flex-basis):
.item {
flex: 300px;
/* Equivale a: flex-grow: 1; flex-shrink: 1; flex-basis: 300px; */
}
Con dos valores (flex-grow y flex-basis):
.item {
flex: 2 200px;
/* Equivale a: flex-grow: 2; flex-shrink: 1; flex-basis: 200px; */
}
Con dos valores (flex-grow y flex-shrink):
.item {
flex: 2 3;
/* Equivale a: flex-grow: 2; flex-shrink: 3; flex-basis: 0%; */
}
Comparación visual de los valores comunes
Para entender mejor las diferencias entre los valores predefinidos, veamos un ejemplo comparativo:
<div class="comparison">
<div class="flex-container">
<div class="item flex-1">flex: 1</div>
<div class="item flex-1">flex: 1</div>
<div class="item flex-1">flex: 1</div>
</div>
<div class="flex-container">
<div class="item flex-auto">flex: auto (poco texto)</div>
<div class="item flex-auto">flex: auto (con mucho más contenido para mostrar)</div>
<div class="item flex-auto">flex: auto (texto medio)</div>
</div>
<div class="flex-container">
<div class="item flex-none">flex: none</div>
<div class="item flex-1">flex: 1</div>
<div class="item flex-initial">flex: initial</div>
</div>
</div>
.comparison {
display: flex;
flex-direction: column;
gap: 20px;
}
.flex-container {
display: flex;
border: 1px solid #ccc;
padding: 10px;
}
.item {
padding: 10px;
text-align: center;
border-radius: 4px;
}
.flex-1 {
flex: 1;
background-color: #e3f2fd;
}
.flex-auto {
flex: auto;
background-color: #ffebee;
}
.flex-none {
flex: none;
background-color: #e8f5e9;
width: 100px;
}
.flex-initial {
flex: initial;
background-color: #fff8e1;
}
Consejos prácticos para elegir el valor adecuado
- Usa flex: 1 cuando quieras que los elementos ocupen todo el espacio disponible por igual, independientemente de su contenido.
- Usa flex: auto cuando quieras que los elementos se distribuyan según su contenido pero también ocupen el espacio disponible.
- Usa flex: none para elementos que deben mantener un tamaño exacto, como logotipos o botones con dimensiones específicas.
- Usa flex: initial (o no especifiques nada) para elementos que deben mantener su tamaño natural pero pueden reducirse si es necesario.
- Para casos más específicos, usa la sintaxis completa con los tres valores.
Consideraciones importantes
- La propiedad flex reestablece los valores omitidos a sus valores iniciales específicos, que pueden ser diferentes de los valores predeterminados de las propiedades individuales.
- Es recomendable usar la propiedad flex en lugar de las propiedades individuales para garantizar un comportamiento consistente.
- Los valores como
flex: 1son muy útiles para crear diseños responsivos que se adapten a diferentes tamaños de pantalla. - Recuerda que
flex: 0 0 autoes equivalente aflex: none, y ambos crean elementos completamente inflexibles.
La propiedad shorthand flex es una herramienta esencial en el diseño moderno con CSS. Dominar estos valores comunes te permitirá crear layouts flexibles y responsivos con muy pocas líneas de código, ahorrando tiempo y reduciendo la complejidad de tu CSS.
Fuentes y referencias
Documentación oficial y recursos externos para profundizar en CSS
Documentación oficial de CSS
Alan Sastre
Ingeniero de Software y formador, CEO en CertiDevs
Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, CSS es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.
Más tutoriales de CSS
Explora más contenido relacionado con CSS y continúa aprendiendo con nuestros tutoriales gratuitos.
Aprendizajes de esta lección
- Aprender el papel de flex-basis como tamaño base inicial y su relación con width y height.
- Comprender la diferencia entre flex-basis: auto y flex-basis: 0 y cuándo usar cada uno.
- Conocer la sintaxis y valores comunes de la propiedad shorthand flex: 1, flex: auto, flex: none y flex: initial.
- Aplicar patrones prácticos para crear diseños flexibles y adaptables usando estas propiedades.