Si alguna vez has intentado centrar un elemento en CSS con los métodos tradicionales y terminaste con el cerebro frito después de 20 minutos de prueba y error, esta guía es para ti.
Flexbox llegó para resolver exactamente eso. Con una sola línea de CSS puedes centrar, distribuir, ordenar y alinear elementos de formas que antes requerían trucos malabaristas con float, position y margin: auto.
En este artículo vas a aprender Flexbox desde cero: qué es, cómo funciona y todas las propiedades que necesitas dominar, con ejemplos visuales en cada paso para que no quede nada en el aire.
¿Qué es Flexbox y por qué usarlo?
Flexbox (Flexible Box Layout) es un modelo de diseño de CSS que permite organizar, alinear y distribuir elementos dentro de un contenedor de forma flexible y eficiente, adaptándose automáticamente al espacio disponible.
Antes de Flexbox, centrar un elemento verticalmente en CSS era famoso por ser frustrante. Necesitabas trucos como position: absolute + transform: translateY(-50%) o calcular márgenes manualmente. Con Flexbox, se hace en dos líneas:
.contenedor {
display: flex;
justify-content: center;
align-items: center;
}Eso es todo. Dos propiedades y cualquier cosa dentro del contenedor queda centrada perfectamente, horizontal y verticalmente, sin importar su tamaño.
Flexbox es compatible con todos los navegadores modernos y es una de las herramientas más usadas en el desarrollo web frontend en 2026. Si estás aprendiendo CSS, esto no es opcional.
El concepto fundamental: contenedor y elementos
Para entender Flexbox necesitas tener claro que hay dos actores principales:
- 🏠 El contenedor flex (flex container) — el elemento padre al que le aplicas
display: flex - 📦 Los elementos flex (flex items) — los hijos directos del contenedor
<div class="contenedor"> ← Flex Container
<div class="item">1</div> ← Flex Item
<div class="item">2</div> ← Flex Item
<div class="item">3</div> ← Flex Item
</div>.contenedor {
display: flex; /* ← activa Flexbox en este contenedor */
}
/* Los .item se convierten automáticamente en flex items */Las propiedades de Flexbox se dividen en dos grupos:
- Propiedades del contenedor — controlan cómo se distribuyen los elementos dentro
- Propiedades de los elementos — controlan el comportamiento individual de cada elemento
Los dos ejes de Flexbox
Flexbox trabaja con dos ejes perpendiculares entre sí. Entenderlos es clave para no confundirte con las propiedades de alineación:
- ➡️ Eje principal (main axis) — la dirección en la que se colocan los elementos. Por defecto, es horizontal (de izquierda a derecha).
- ⬇️ Eje cruzado (cross axis) — perpendicular al eje principal. Por defecto, es vertical.
/* Eje principal horizontal (default) */
Contenedor: [Item1] [Item2] [Item3] → eje principal
↓ eje cruzado
/* Eje principal vertical (con flex-direction: column) */
Contenedor: [Item1] ← eje cruzado
[Item2]
[Item3] ↓ eje principal¿Por qué importa? Porque justify-content siempre controla el eje principal y align-items siempre controla el eje cruzado. Si cambias la dirección, también cambia qué propiedad hace qué.
Propiedades del Contenedor
1. display: flex — activar Flexbox
La propiedad que lo inicia todo. Sin esta, ninguna otra propiedad de Flexbox funciona.
.contenedor {
display: flex; /* elementos en fila, ocupa todo el ancho */
/* o */
display: inline-flex; /* igual pero ocupa solo el espacio necesario */
}Resultado visual al aplicar display: flex:
Antes (display block): Después (display flex):
┌──────────────────┐ ┌────┐┌────┐┌────┐
│ Item 1 │ │ 1 ││ 2 ││ 3 │
├──────────────────┤ └────┘└────┘└────┘
│ Item 2 │
├──────────────────┤
│ Item 3 │
└──────────────────┘2. flex-direction — dirección del eje principal
Controla en qué dirección se colocan los elementos dentro del contenedor.
.contenedor {
display: flex;
flex-direction: row; /* ← fila (izq a der) — DEFAULT */
/* flex-direction: row-reverse; fila (der a izq) */
/* flex-direction: column; columna (arr a abaj) */
/* flex-direction: column-reverse; columna (abaj a arr) */
}row (default): row-reverse: column: column-reverse:
┌──┬──┬──┐ ┌──┬──┬──┐ ┌──┐ ┌──┐
│1 │2 │3 │ │3 │2 │1 │ │1 │ │3 │
└──┴──┴──┘ └──┴──┴──┘ ├──┤ ├──┤
│2 │ │2 │
├──┤ ├──┤
│3 │ │1 │
└──┘ └──┘💡 Tip clave: Cuando usas flex-direction: column, el eje principal pasa a ser vertical. Eso significa que justify-content controlará el eje vertical y align-items el horizontal. ¡Exactamente al revés de lo que harían en row!
3. justify-content — alinear en el eje principal
Distribuye los elementos a lo largo del eje principal (horizontal en row, vertical en column).
.contenedor {
display: flex;
justify-content: flex-start; /* inicio — DEFAULT */
/* justify-content: flex-end; final */
/* justify-content: center; centro */
/* justify-content: space-between; espacio entre elementos */
/* justify-content: space-around; espacio alrededor */
/* justify-content: space-evenly; espacio uniforme */
}flex-start: [1][2][3]···············
flex-end: ···············[1][2][3]
center: ·······[1][2][3]·······
space-between: [1]·······[2]·······[3]
space-around: ··[1]····[2]····[3]··
space-evenly: ···[1]···[2]···[3]···El más útil en el día a día: space-between para barras de navegación y center para centrar contenido.
/* Ejemplo real: barra de navegación */
nav {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 40px;
}
/* Resultado: */
/* [Logo]·············[Inicio][Sobre mí][Contacto] */4. align-items — alinear en el eje cruzado
Alinea los elementos en el eje cruzado (vertical en row, horizontal en column).
.contenedor {
display: flex;
align-items: stretch; /* estira al tamaño del contenedor — DEFAULT */
/* align-items: flex-start; inicio del eje cruzado */
/* align-items: flex-end; final del eje cruzado */
/* align-items: center; centro del eje cruzado */
/* align-items: baseline; alineados por la línea base del texto */
}/* Contenedor con altura fija — eje cruzado VERTICAL */
stretch: flex-start: center: flex-end:
┌──┬──┬──┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│1 │2 │3 │ │[1][2][3] │ │ │ │ │
│ │ │ │ │ │ │[1][2][3] │ │ │
│ │ │ │ │ │ │ │ │[1][2][3] │
└──┴──┴──┘ └──────────┘ └──────────┘ └──────────┘La combinación mágica para centrar cualquier cosa perfectamente:
.centrar-todo {
display: flex;
justify-content: center; /* centra horizontalmente */
align-items: center; /* centra verticalmente */
height: 100vh; /* necesitas altura para que funcione */
}
/* ¡Con esto, cualquier hijo queda centrado en la pantalla! */5. flex-wrap — control del desbordamiento
Por defecto, Flexbox intenta meter todos los elementos en una sola línea, achicándolos si hace falta. Con flex-wrap puedes cambiar ese comportamiento.
.contenedor {
display: flex;
flex-wrap: nowrap; /* todo en una línea, se achica si hace falta — DEFAULT */
/* flex-wrap: wrap; si no caben, pasan a la siguiente línea */
/* flex-wrap: wrap-reverse; igual pero en orden inverso */
}nowrap (default): wrap:
┌──┬──┬──┬──┬──┐ ┌──┬──┬──┐
│1 │2 │3 │4 │5 │ │1 │2 │3 │
└──┴──┴──┴──┴──┘ ├──┬──┤ │
(se achican) │4 │5 │ │
└──┴──┘6. flex-flow — shorthand de direction + wrap
/* En lugar de escribir dos propiedades separadas: */
.contenedor {
flex-direction: row;
flex-wrap: wrap;
}
/* Puedes usar el shorthand: */
.contenedor {
flex-flow: row wrap;
/* flex-flow: column nowrap; */
/* flex-flow: row-reverse wrap-reverse; */
}7. gap — espacio entre elementos
Una de las propiedades más útiles y modernas. Agrega espacio entre los elementos sin necesidad de usar margin.
.contenedor {
display: flex;
gap: 16px; /* mismo espacio horizontal y vertical */
/* gap: 16px 32px; 16px vertical, 32px horizontal */
/* row-gap: 16px; solo entre filas */
/* column-gap: 32px; solo entre columnas */
}💡 Antes de que existiera gap, se usaba margin en los elementos hijos, lo que generaba problemas con el primer y último elemento. gap es mucho más limpio.
8. align-content — alinear múltiples filas
Solo tiene efecto cuando hay múltiples filas (con flex-wrap: wrap). Controla cómo se distribuyen esas filas en el eje cruzado.
.contenedor {
display: flex;
flex-wrap: wrap;
align-content: flex-start; /* filas al inicio */
/* align-content: flex-end; filas al final */
/* align-content: center; filas en el centro */
/* align-content: space-between; espacio entre filas */
/* align-content: space-around; espacio alrededor de filas */
/* align-content: stretch; estira las filas — DEFAULT */
}Propiedades de los Elementos (Flex Items)
9. flex-grow — crecer para llenar espacio
Define cuánto puede crecer un elemento para ocupar el espacio disponible. El valor es un número que representa la proporción relativa.
.contenedor {
display: flex;
}
.item-1 { flex-grow: 1; } /* toma 1 parte del espacio libre */
.item-2 { flex-grow: 2; } /* toma 2 partes del espacio libre */
.item-3 { flex-grow: 1; } /* toma 1 parte del espacio libre */
/* Total: 4 partes. item-2 es el doble de ancho que item-1 y item-3 */
/* [──Item1──][────Item2────][──Item3──] */El caso más común: flex-grow: 1 en todos los elementos hace que repartan el espacio equitativamente:
.item {
flex-grow: 1;
}
/* [───Item1───][───Item2───][───Item3───] */10. flex-shrink — encogerse si no hay espacio
Define cuánto puede encogerse un elemento si el contenedor es demasiado pequeño. Por defecto es 1 (todos se encogen igual). Con flex-shrink: 0, el elemento nunca se encoge.
.logo {
flex-shrink: 0; /* el logo nunca se encoge aunque la pantalla sea pequeña */
width: 120px;
}
.contenido {
flex-shrink: 1; /* el contenido sí puede encogerse */
}11. flex-basis — tamaño base del elemento
Define el tamaño inicial de un elemento antes de que se aplique flex-grow o flex-shrink. Es como un width pero para el eje principal.
.item {
flex-basis: 200px; /* tamaño inicial de 200px */
/* flex-basis: auto; usa el width/height del elemento — DEFAULT */
/* flex-basis: 0; empieza desde 0 y crece desde ahí */
}12. flex — shorthand de grow + shrink + basis
La forma abreviada de las tres propiedades anteriores. Es la más usada en proyectos reales.
.item {
flex: 1; /* flex-grow: 1, flex-shrink: 1, flex-basis: 0% */
/* flex: 1 1 auto; grow: 1, shrink: 1, basis: auto */
/* flex: 0 0 200px; no crece, no encoge, siempre 200px */
/* flex: none; equivale a 0 0 auto */
}El valor flex: 1 es uno de los más usados: hace que los elementos llenen el espacio disponible repartiéndolo equitativamente.
13. align-self — alineación individual
Sobreescribe la alineación del contenedor (align-items) para un elemento específico.
.contenedor {
display: flex;
align-items: center; /* todos los elementos centrados */
height: 200px;
}
.item-especial {
align-self: flex-end; /* este elemento específico va abajo */
/* align-self: flex-start; */
/* align-self: stretch; */
/* align-self: auto; hereda del contenedor — DEFAULT */
}Resultado:
┌─────────────────────────┐
│ │[Item2]│ │
│ [Item1] │ │[Item3]│
│ │ │ ↑aquí │
│ [Item-especial] │ ← align-self: flex-end
└─────────────────────────┘14. order — cambiar el orden visual
Cambia el orden en que aparecen los elementos sin modificar el HTML. Por defecto todos tienen order: 0. Los valores menores van primero.
<div class="contenedor">
<div class="item" id="a">A</div>
<div class="item" id="b">B</div>
<div class="item" id="c">C</div>
</div>#a { order: 2; }
#b { order: 0; } /* primero */
#c { order: 1; }
/* Resultado visual: [B][C][A] */
/* El HTML sigue siendo [A][B][C] */⚠️ Importante: order es solo visual. No afecta el orden de lectura para lectores de pantalla ni la accesibilidad. Úsalo con cuidado.
Tabla resumen: todas las propiedades
| Propiedad | Aplica a | ¿Qué hace? | Valores clave |
|---|---|---|---|
display | Contenedor | Activa Flexbox | flex, inline-flex |
flex-direction | Contenedor | Dirección del eje principal | row, column, row-reverse |
justify-content | Contenedor | Alineación en eje principal | center, space-between, flex-end |
align-items | Contenedor | Alineación en eje cruzado | center, stretch, flex-start |
flex-wrap | Contenedor | Control de desbordamiento | nowrap, wrap |
flex-flow | Contenedor | Shorthand direction + wrap | row wrap, column nowrap |
gap | Contenedor | Espacio entre elementos | 16px, 1rem |
align-content | Contenedor | Alinea múltiples filas | space-between, center |
flex-grow | Elemento | Cuánto puede crecer | 0, 1, 2... |
flex-shrink | Elemento | Cuánto puede encogerse | 0, 1... |
flex-basis | Elemento | Tamaño base | auto, 200px, 0 |
flex | Elemento | Shorthand grow + shrink + basis | 1, 0 0 200px |
align-self | Elemento | Alineación individual | center, flex-end, auto |
order | Elemento | Orden visual | 0, -1, 1... |
Casos de uso reales — los más comunes
✅ Centrar un elemento en la pantalla
.pantalla {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
width: 100%;
}✅ Barra de navegación
nav {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 40px;
height: 64px;
}
/* [Logo]···············[Link1][Link2][Link3] */✅ Tarjetas en fila que se adaptan
.galeria {
display: flex;
flex-wrap: wrap;
gap: 24px;
}
.tarjeta {
flex: 1 1 280px; /* crece, encoge, mínimo 280px */
/* auto-ajuste: llena la fila con tarjetas de mínimo 280px */
}✅ Layout de dos columnas
.layout {
display: flex;
gap: 32px;
}
.sidebar { flex: 0 0 280px; } /* sidebar fijo de 280px */
.contenido { flex: 1; } /* contenido ocupa el resto */✅ Footer con tres zonas
footer {
display: flex;
justify-content: space-between;
align-items: center;
padding: 24px 40px;
}
/* [Copyright]·········[Links]·········[Redes] */✅ Botones en fila con separación automática
.acciones {
display: flex;
gap: 12px;
align-items: center;
}
.acciones .cancelar {
margin-left: auto; /* empuja el botón cancelar al extremo derecho */
}
/* [Guardar][Publicar]·············[Cancelar] */Flexbox vs CSS Grid: ¿cuándo usar cada uno?
Una pregunta que surge siempre. La respuesta rápida:
- ⚡ Flexbox — para distribución en una dimensión: una fila O una columna. Ideal para navbars, listas de botones, grupos de tarjetas y componentes pequeños.
- 🔲 CSS Grid — para distribución en dos dimensiones: filas Y columnas al mismo tiempo. Ideal para layouts completos de páginas, galerías complejas y diseños con áreas definidas.
En la práctica, muchos proyectos profesionales usan ambos: Grid para el layout general de la página y Flexbox para los componentes internos.
Errores comunes con Flexbox
Aplicar propiedades de contenedor a los elementos y viceversa
/* ❌ align-items no funciona en el elemento, es del contenedor */
.item {
align-items: center; /* no hace nada */
}
/* ✅ Para alinear un item individualmente, usa align-self */
.item {
align-self: center; /* sí funciona */
}Olvidar que justify-content cambia con flex-direction
/* Con flex-direction: row (default) */
.contenedor {
justify-content: center; /* centra horizontalmente */
align-items: center; /* centra verticalmente */
}
/* Con flex-direction: column */
.contenedor {
flex-direction: column;
justify-content: center; /* ahora centra VERTICALMENTE */
align-items: center; /* ahora centra HORIZONTALMENTE */
}No darle altura al contenedor para centrar verticalmente
/* ❌ align-items: center no hace nada si el contenedor no tiene altura */
.contenedor {
display: flex;
align-items: center;
/* sin height, el contenedor tiene la misma altura que sus hijos */
}
/* ✅ El contenedor necesita altura para que el centrado vertical funcione */
.contenedor {
display: flex;
align-items: center;
height: 300px; /* o min-height, o 100vh */
}Recursos para practicar Flexbox
La mejor forma de dominar Flexbox es practicar. Aquí van los recursos más recomendados:
- 🐸 Flexbox Froggy (flexboxfroggy.com) — el juego más popular para aprender Flexbox. Mueves ranas a sus lirios usando propiedades CSS reales. 24 niveles, completamente gratis.
- 🏰 Flexbox Defense (flexboxdefense.com) — un juego de tower defense donde posicionas torres usando Flexbox.
- 🔬 CSS Tricks Flexbox Guide — la guía de referencia definitiva con visualizaciones de cada propiedad.
Resumen: lo que aprendiste hoy
- ✅ Flexbox se activa con
display: flexen el contenedor padre - ✅ Hay dos actores: el contenedor (flex container) y los hijos (flex items)
- ✅ Los dos ejes: eje principal (dirección de los items) y eje cruzado (perpendicular)
- ✅
justify-contentalinea en el eje principal;align-itemsen el eje cruzado - ✅
flex-directioncambia la dirección (y también cuál eje es cuál) - ✅
flex-wrappermite que los elementos pasen a la siguiente línea - ✅
gapagrega espacio entre elementos sin necesidad de márgenes - ✅
flex: 1hace que los elementos llenen el espacio disponible equitativamente - ✅
align-selfyorderpermiten personalizar elementos individuales - ✅ Flexbox es para una dimensión; CSS Grid para dos dimensiones
🧪 ¿Tienes claros los fundamentos de HTML y CSS?
Flexbox es CSS intermedio. Para aprovecharlo al máximo, necesitas tener bien sólidos los fundamentos de HTML y CSS: selectores, el modelo de caja, unidades de medida y posicionamiento básico.
Comprueba dónde estás con nuestro test de introducción a HTML y CSS:
👉 Test: Introducción a HTML y CSS 👉 Test: Fundamentos de JavaScript
¿Ya usabas Flexbox o era la primera vez que lo veías? ¿Cuál propiedad te costó más entender: justify-content vs align-items, o el efecto de flex-direction en los ejes? Cuéntanos en los comentarios 👇 — respondemos todos. 🚀
No hay comentarios todavía. Sé el primero en compartir tu opinión.