Guia completa de CSS Flexbox: domina el layout flexible en 2026
Aprende CSS Flexbox desde cero. Propiedades del contenedor (display flex, direction, wrap, justify, align), propiedades de los items (grow, shrink, basis), patrones comunes como centrado, navbar, grid de cards y holy grail layout.
Que es CSS Flexbox y por que deberias dominarlo
CSS Flexbox (Flexible Box Layout Module) es un modelo de layout unidimensional que permite distribuir espacio y alinear elementos dentro de un contenedor de forma eficiente, incluso cuando sus tamanos son desconocidos o dinamicos. Fue disenado especificamente para resolver los problemas historicos de maquetacion en CSS que antes requerian hacks con floats, tablas o position absolute.
Desde su estandarizacion en 2017 y la adopcion universal por todos los navegadores modernos, Flexbox se ha convertido en una herramienta imprescindible para cualquier desarrollador frontend. A diferencia de los metodos antiguos, Flexbox funciona de forma predecible, responde bien a diferentes tamanos de pantalla y reduce drasticamente la cantidad de CSS necesario para layouts comunes.
Problemas que Flexbox resuelve elegantemente:
- Centrado vertical: Antes de Flexbox, centrar un elemento verticalmente requeria trucos como translateY(-50%) o tablas CSS. Con Flexbox es una sola propiedad
- Distribucion equitativa: Repartir espacio entre elementos de forma igual o proporcional sin calculos manuales
- Orden visual: Cambiar el orden de los elementos en pantalla sin alterar el HTML
- Responsive sin media queries: Los elementos flex pueden encoger, crecer y envolverse automaticamente
- Alineacion consistente: Alinear elementos vertical y horizontalmente con una sintaxis coherente
En esta guia cubrimos todas las propiedades de Flexbox con ejemplos practicos. Si quieres experimentar mientras lees, abre nuestro playground de Flexbox en otra pestana para probar cada propiedad en tiempo real.
El contenedor flex: display flex y el eje principal
Todo en Flexbox empieza al declarar un contenedor como display: flex (o display: inline-flex si quieres que el contenedor se comporte como un elemento en linea). Al hacerlo, todos los hijos directos se convierten automaticamente en flex items.
Comportamiento por defecto de display: flex:
- Los hijos se colocan en una fila horizontal (flex-direction: row)
- Los hijos NO se envuelven a la siguiente linea (flex-wrap: nowrap)
- Los hijos se alinean al inicio del eje principal (justify-content: flex-start)
- Los hijos se estiran para llenar la altura del contenedor (align-items: stretch)
flex-direction define el eje principal del contenedor:
| Valor | Eje principal | Direccion |
|---|---|---|
row (default) | Horizontal | Izquierda a derecha (en idiomas LTR) |
row-reverse | Horizontal | Derecha a izquierda |
column | Vertical | Arriba a abajo |
column-reverse | Vertical | Abajo a arriba |
Es fundamental entender que Flexbox trabaja con dos ejes: el eje principal (main axis, definido por flex-direction) y el eje cruzado (cross axis, perpendicular al principal). Todas las propiedades de alineacion se refieren a estos ejes, no a "horizontal" o "vertical" de forma fija.
flex-wrap controla si los items se envuelven:
nowrap(default): Todos los items en una sola linea, aunque se comprimanwrap: Los items pasan a la siguiente linea cuando no cabenwrap-reverse: Igual que wrap pero las lineas se apilan en orden inverso
El atajo flex-flow combina ambas propiedades: flex-flow: row wrap; es equivalente a declarar flex-direction: row; y flex-wrap: wrap; por separado.
Propiedades de alineacion: justify-content y align-items
Las propiedades de alineacion son el corazon de Flexbox. justify-content alinea items a lo largo del eje principal, mientras que align-items los alinea a lo largo del eje cruzado.
justify-content (alineacion en el eje principal):
| Valor | Comportamiento |
|---|---|
flex-start | Items agrupados al inicio del eje principal |
flex-end | Items agrupados al final del eje principal |
center | Items centrados en el eje principal |
space-between | Primer item al inicio, ultimo al final, espacio igual entre los demas |
space-around | Espacio igual alrededor de cada item (los bordes tienen la mitad de espacio) |
space-evenly | Espacio identico entre todos los items y los bordes del contenedor |
align-items (alineacion en el eje cruzado):
| Valor | Comportamiento |
|---|---|
stretch (default) | Items se estiran para llenar el eje cruzado completo |
flex-start | Items alineados al inicio del eje cruzado |
flex-end | Items alineados al final del eje cruzado |
center | Items centrados en el eje cruzado |
baseline | Items alineados por la linea base de su texto |
align-content (solo con flex-wrap: wrap):
Cuando hay multiples lineas de flex items, align-content controla como se distribuyen esas lineas en el eje cruzado. Acepta los mismos valores que justify-content mas stretch. Solo tiene efecto cuando hay mas de una linea de items.
gap (espaciado entre items):
La propiedad gap (antes grid-gap) establece el espacio entre flex items sin usar margenes. Acepta uno o dos valores: gap: 16px; aplica 16px en ambas direcciones, gap: 16px 24px; aplica 16px vertical y 24px horizontal. Es la forma mas limpia de espaciar elementos y evita el problema de margenes en los bordes.
Propiedades de los flex items: grow, shrink y basis
Las propiedades de los flex items controlan como cada elemento individual ocupa el espacio disponible dentro del contenedor flex. Son la clave para crear layouts verdaderamente flexibles.
flex-grow (factor de crecimiento):
Define cuanto espacio sobrante debe tomar un item en proporcion a los demas. El valor por defecto es 0 (no crece). Si todos los items tienen flex-grow: 1, todos crecen por igual. Si un item tiene flex-grow: 2 y los demas flex-grow: 1, el primero recibira el doble de espacio sobrante.
flex-grow: 0- El item NO crece mas alla de su tamano baseflex-grow: 1- El item toma su parte proporcional del espacio sobranteflex-grow: 2- El item toma el doble de espacio sobrante que un item con flex-grow: 1
flex-shrink (factor de encogimiento):
Define cuanto se encoge un item cuando el espacio es insuficiente. El valor por defecto es 1 (todos los items se encogen proporcionalmente). Si un item tiene flex-shrink: 0, nunca se encogera por debajo de su tamano base, lo cual es util para elementos con tamano fijo como iconos o logos.
flex-basis (tamano base):
Define el tamano inicial del item antes de que el espacio sobrante se distribuya. Acepta valores de longitud (200px, 30%) o auto (default, usa el width o height del item). Es mas predecible que width/height para flex items porque se calcula en el contexto del eje principal.
El atajo flex:
La propiedad flex combina grow, shrink y basis en una sola declaracion:
flex: 1;equivale aflex: 1 1 0%;(crece, se encoge, tamano base 0)flex: auto;equivale aflex: 1 1 auto;(crece, se encoge, tamano base automatico)flex: none;equivale aflex: 0 0 auto;(no crece, no se encoge, tamano fijo)flex: 0 0 250px;crea un item de exactamente 250px que no cambia de tamano
align-self permite que un item individual anule la alineacion del contenedor en el eje cruzado. Acepta los mismos valores que align-items. Y la propiedad order cambia el orden visual de un item sin modificar el HTML (default: 0, valores negativos van primero).
Patrones comunes: centrado, navbar y footer fijo
Flexbox brilla en los patrones de layout mas comunes del desarrollo web. Estos son los que usaras practicamente en cada proyecto:
Patron 1: Centrado perfecto (vertical y horizontal)
El patron mas buscado en CSS. Con Flexbox son 3 lineas:
display: flex;justify-content: center;align-items: center;
Esto centra cualquier elemento hijo tanto horizontal como verticalmente, sin importar sus dimensiones. Funciona para texto, imagenes, modales, spinners de carga, paginas de error, cualquier cosa.
Patron 2: Navbar con logo a la izquierda y menu a la derecha
El layout tipico de una barra de navegacion:
- Contenedor nav:
display: flex; justify-content: space-between; align-items: center; - El logo se queda a la izquierda automaticamente
- Los links del menu se agrupan a la derecha
- Todo queda centrado verticalmente sin esfuerzo
Patron 3: Footer fijo al final de la pagina (sticky footer)
Un footer que siempre este al final, aunque el contenido sea corto:
- Body o wrapper:
display: flex; flex-direction: column; min-height: 100vh; - Contenido principal:
flex: 1;(toma todo el espacio disponible) - El footer se queda al fondo natural o empujado hacia abajo
Patron 4: Lista de items con el ultimo alineado a la derecha
Por ejemplo, un breadcrumb o una fila de botones donde el ultimo va al final:
- Contenedor:
display: flex; align-items: center; - Ultimo item:
margin-left: auto; - El margin auto en Flexbox absorbe todo el espacio disponible, empujando el item al extremo opuesto
Patron 5: Sidebar + contenido principal
- Contenedor:
display: flex; - Sidebar:
flex: 0 0 280px;(ancho fijo de 280px) - Contenido:
flex: 1;(ocupa todo el espacio restante)
Experimenta con estos patrones en nuestro playground de Flexbox para verlos funcionar en tiempo real.
Grid de cards responsive y holy grail layout
Flexbox es excelente para crear layouts de tarjetas responsivas y el clasico "holy grail layout" (header, footer, sidebar y contenido principal).
Grid de cards responsive con flex-wrap:
El patron mas comun para mostrar tarjetas de producto, articulos de blog o cualquier coleccion de elementos:
- Contenedor:
display: flex; flex-wrap: wrap; gap: 24px; - Cada card:
flex: 1 1 300px;(minimo 300px de ancho, crece para llenar el espacio) - Las cards se distribuyen automaticamente: 3 por fila en pantallas grandes, 2 en medianas, 1 en movil
Un problema comun con este patron: si la ultima fila tiene menos items que las anteriores, estos crecen para llenar toda la fila. Para evitarlo, usa flex: 0 1 calc(33.333% - 16px); con un max-width o cambia a CSS Grid para esa situacion especifica.
Holy grail layout (el layout perfecto):
El "santo grial" del diseno web: header fijo arriba, footer fijo abajo, sidebar izquierda, sidebar derecha y contenido principal en el centro:
- Wrapper exterior:
display: flex; flex-direction: column; min-height: 100vh; - Header: tamano automatico
- Seccion central:
display: flex; flex: 1; - Sidebar izquierda:
flex: 0 0 200px; - Contenido principal:
flex: 1; - Sidebar derecha:
flex: 0 0 200px; - Footer: tamano automatico
Este layout es 100% responsive: en pantallas pequenas, puedes cambiar la seccion central a flex-direction: column; con una media query para apilar las sidebars debajo del contenido.
Cards con altura igual (equal height cards):
Un beneficio automatico de Flexbox: todos los items en una fila tienen la misma altura por defecto (align-items: stretch). Esto significa que las cards de una misma fila siempre tendran la misma altura, sin importar cuanto contenido tenga cada una. Si ademas necesitas que el boton de cada card quede al fondo, aplica flex-direction: column al contenido de la card y margin-top: auto; al boton.
Flexbox vs CSS Grid: cuando usar cada uno
La pregunta que todo desarrollador se hace: si ya tengo Flexbox, necesito CSS Grid? Y viceversa. La respuesta es que no son competidores, son complementarios. Cada uno tiene escenarios donde es la mejor opcion.
Usa Flexbox cuando:
- El layout es unidimensional (una fila O una columna, no ambas a la vez)
- Necesitas que los items se adapten dinamicamente al espacio disponible
- El contenido debe dictar el tamano de los elementos
- Necesitas alinear elementos dentro de un componente (navbar, card, toolbar, form)
- Quieres que los items se envuelvan naturalmente sin definir filas/columnas explicitas
Usa CSS Grid cuando:
- El layout es bidimensional (necesitas controlar filas Y columnas simultaneamente)
- Tienes una estructura de cuadricula definida con areas nombradas
- El layout debe dictar el tamano del contenido (no al reves)
- Necesitas colocar items en posiciones especificas de la cuadricula
- Quieres que items abarquen multiples filas o columnas
Comparativa directa:
| Caracteristica | Flexbox | CSS Grid |
|---|---|---|
| Dimensionalidad | 1D (fila o columna) | 2D (filas y columnas) |
| Enfoque | Contenido hacia afuera | Layout hacia adentro |
| Alineacion | Excelente en un eje | Excelente en ambos ejes |
| Responsive | Automatico con wrap | Requiere media queries o auto-fill |
| Complejidad | Menor curva de aprendizaje | Mayor poder, mayor complejidad |
En la practica, los mejores layouts combinan ambos: CSS Grid para la estructura general de la pagina (header, sidebar, main, footer) y Flexbox para la alineacion interna de cada componente (items del navbar, contenido de una card, botones de un formulario). Prueba ambos con nuestro playground Flexbox y nuestro generador de CSS Grid.
Errores comunes y consejos avanzados de Flexbox
Incluso los desarrolladores experimentados cometen errores con Flexbox. Estos son los mas frecuentes y como evitarlos:
Error 1: Olvidar que flex-shrink por defecto es 1
Los flex items se encogen por defecto. Si un item tiene un ancho fijo que debe respetarse (como un icono de 48px), necesitas flex-shrink: 0; explicitamente. Sin esto, el item puede comprimirse por debajo de su tamano esperado cuando el espacio es insuficiente.
Error 2: Usar width en lugar de flex-basis
Aunque width funciona en la mayoria de casos, flex-basis es mas predecible dentro de un contexto flex. flex-basis: 300px; establece el tamano en el eje principal independientemente de si es horizontal o vertical.
Error 3: No usar min-width: 0 para texto truncado
Los flex items tienen min-width: auto por defecto, lo que impide que se encoja por debajo del tamano de su contenido. Si necesitas truncar texto con text-overflow: ellipsis dentro de un flex item, anade min-width: 0; al item para permitir que se comprima.
Error 4: Intentar crear grids complejos solo con Flexbox
Flexbox no fue disenado para layouts bidimensionales complejos. Si necesitas que items se alineen en filas Y columnas simultaneamente, CSS Grid es la herramienta correcta.
Consejos avanzados:
- margin: auto en flex items: Absorbe todo el espacio disponible en la direccion indicada.
margin-left: auto;empuja un item a la derecha.margin: auto;centra un item perfectamente - flex-basis: 0 vs auto: Con
flex: 1 1 0%todos los items tienen el mismo tamano base (se distribuyen equitativamente). Conflex: 1 1 autoel tamano base depende del contenido (items con mas texto son mas anchos) - Contenedores flex anidados: Un flex item puede ser a su vez un contenedor flex. Esto es la base de layouts complejos como dashboards y aplicaciones web
- Accesibilidad y order: La propiedad order cambia el orden visual pero NO el orden de lectura del screen reader ni la navegacion con Tab. Usala con cuidado y nunca como sustituto de un HTML bien estructurado
Practica y depura tus layouts flex con nuestro playground de Flexbox interactivo, donde puedes cambiar cada propiedad y ver el resultado al instante.
Prueba esta herramienta:
Abrir herramienta→Preguntas frecuentes
Cual es la diferencia entre justify-content y align-items?
justify-content alinea los items a lo largo del eje principal (horizontal por defecto con flex-direction: row), mientras que align-items los alinea a lo largo del eje cruzado (vertical por defecto). Si cambias flex-direction a column, los roles se invierten: justify-content controla el eje vertical y align-items el horizontal.
Que hace flex: 1 exactamente?
flex: 1 es un atajo que equivale a flex-grow: 1, flex-shrink: 1, flex-basis: 0%. Significa que el item crecera para tomar su parte proporcional del espacio disponible, se encogera si es necesario, y su tamano base es 0 (todo el tamano viene del crecimiento). Si todos los items tienen flex: 1, se repartiran el espacio equitativamente.
Como centro un div vertical y horizontalmente con Flexbox?
Aplica al contenedor padre: display: flex; justify-content: center; align-items: center; y asegurate de que el contenedor tenga una altura definida (por ejemplo, min-height: 100vh para pantalla completa). Estas 3 propiedades centran cualquier elemento hijo en ambos ejes.
Flexbox o Grid: cual debo aprender primero?
Flexbox. Es mas sencillo de aprender, cubre la mayoria de necesidades de layout de componentes, y se usa dentro de CSS Grid. Una vez domines Flexbox, CSS Grid sera mucho mas facil de entender porque comparten conceptos como gap, align-items y justify-content. En la practica profesional usaras ambos: Grid para la estructura de la pagina y Flexbox para componentes internos.
Por que mis flex items no se envuelven a la siguiente linea?
El valor por defecto de flex-wrap es nowrap, lo que fuerza a todos los items a quedarse en una sola linea aunque se compriman. Para que los items pasen a la siguiente linea cuando no caben, anade flex-wrap: wrap; al contenedor flex. Tambien puedes usar el atajo flex-flow: row wrap;
Puedo usar Flexbox y CSS Grid juntos en el mismo proyecto?
Si, y de hecho es la practica recomendada. Usa CSS Grid para la estructura general de la pagina (definir areas como header, sidebar, main, footer) y Flexbox para la alineacion interna de componentes (items dentro del navbar, contenido de una card, botones de un formulario). Un item de Grid puede ser a su vez un contenedor Flex y viceversa.