Saltar al contenido
Curso de CSS
Todos los cursos Ir al ejercicio →

Flexbox

  • ⏱ 45 minutos
  • 📶 Nivel: principiante
  • 🧩 Incluye ejercicio

💡 🎯 Al terminar esta lección podrás…

  • Distinguir contenedor, ítems y los dos ejes de Flexbox.
  • Alinear y repartir con justify-content, align-items y gap.
  • Controlar el tamaño de los ítems con flex.
  • Resolver los patrones habituales: centrado, barra de navegación y tarjetas.

1.La idea de Flexbox

Flexbox es el sistema de CSS para acomodar elementos en una sola dimensión: en una fila o en una columna. Resuelve de forma sencilla cosas que antes eran un dolor de cabeza: alinear, centrar, repartir espacio y hacer que los elementos se adapten.

Todo parte de dos piezas:

PiezaQué esCómo se activa
Contenedor flex (*flex container*)El elemento padredisplay: flex (o inline-flex)
Ítems flex (*flex items*)Los hijos directos del contenedorAutomático: todos los hijos directos

⚠️ Importante · Solo los hijos directos

display: flex actúa solo sobre los hijos directos, no sobre los nietos. Si algo no se alinea como esperas, revisa en las herramientas de desarrollo cuál es realmente el contenedor y cuáles los ítems.

Los dos ejes

Un contenedor flex tiene un eje principal (la dirección en que se colocan los ítems) y un eje transversal (perpendicular). Con flex-direction: row (por defecto), el eje principal es horizontal; con column, es vertical. Casi todas las propiedades se entienden a partir de aquí:

AspectoEje principalEje transversal
Se controla conjustify-contentalign-items
En row esHorizontal →Vertical ↓
En column esVertical ↓Horizontal →

2.Propiedades del contenedor

PropiedadQué haceValores principales
display: flexActiva flexboxflex, inline-flex
flex-directionDirección del eje principalrow, row-reverse, column, column-reverse
justify-contentReparte a lo largo del eje principalflex-start, center, flex-end, space-between, space-around, space-evenly
align-itemsAlinea en el eje transversalstretch (por defecto), flex-start, center, flex-end, baseline
flex-wrap¿Pueden pasar a otra línea?nowrap (por defecto), wrap
gapEspacio entre ítems16px, 1rem, 1rem 2rem (fila / columna)
align-contentReparte las líneas cuando hay wrapIgual que justify-content
Así se comporta el contenedor al cambiar sus propiedades: pruébalo tú en el editor de abajo.
✏️ Prueba todas las propiedades

💡 Consejo · El truco para no confundirte

Antes de escribir, pregunta: «¿hacia dónde va mi eje principal?». justify-content siempre trabaja a lo largo de él, y align-items a través de él. Si cambias a column, los dos intercambian su dirección visual.

3.Propiedades de los ítems

PropiedadQué haceEjemplo
flex-growCuánto crece para ocupar el espacio libreflex-grow: 1
flex-shrinkCuánto se encoge si no cabe (1 por defecto)flex-shrink: 0 para que no se encoja
flex-basisTamaño inicial antes de crecer o encogerseflex-basis: 200px
flexAtajo de las tres anterioresflex: 1, flex: 0 0 200px, flex: 1 1 250px
align-selfAlineación propia en el eje transversalalign-self: flex-end
orderCambia el orden visualorder: -1 (va primero)

El atajo más usado es flex: 1: «reparte el espacio sobrante a partes iguales». Y margin-left: auto empuja un ítem al final:

✏️ Crecer y repartir

📌 Nota · flex: 1 no es «igual ancho»

flex: 1 equivale a flex: 1 1 0: parte de ancho 0 y reparte todo el espacio. Por eso los ítems resultan iguales. Con flex: 1 1 auto, parten de su tamaño natural y por eso no son iguales.

4.Patrones que usarás todos los días

1. Centrar absolutamente

Centrar en horizontal y vertical
.centro {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 200px;
}

2. Barra de navegación

✏️ Barra con logo, menú y botón

3. Tarjetas de la misma altura

Con align-items: stretch (el valor por defecto) todas las tarjetas de una fila miden lo mismo, aunque su contenido sea distinto. Añade flex-wrap: wrap y flex: 1 1 220px para que se acomoden solas:

✏️ Tarjetas que se adaptan

4. Pie de página al fondo

El pie siempre abajo
body { min-height: 100dvh; display: flex; flex-direction: column; }
main { flex: 1; }             /* el contenido absorbe el espacio libre */
/* el <footer> queda pegado al fondo aunque haya poco contenido */

5.Trampas habituales

ProblemaCausa y solución
Mis ítems no se alineandisplay: flex está en el elemento equivocado: debe ir en el padre directo
align-items: center no centra en verticalEl contenedor no tiene alto; ponle height o min-height
El texto largo desborda el ítemLos ítems tienen min-width: auto; añade min-width: 0 para permitir que se encojan
El ítem se encoge demasiadoUsa flex-shrink: 0 o un flex-basis mínimo
No hay espacio entre ítemsUsa gap en el contenedor (mejor que márgenes)
El orden con order confundeorder solo cambia lo visual; el teclado y lectores de pantalla siguen el orden del HTML

⚠️ Importante · order y accesibilidad

Reordenar visualmente con order o row-reverse no cambia el orden en que se recorre la página con la tecla Tab o un lector de pantalla. Si quieres otro orden, cámbialo en el HTML.

6.Errores frecuentes

📒 Apuntes para llevar

  • display: flex convierte al padre en contenedor y a sus hijos directos en ítems.
  • Hay un eje principal (flex-direction) y uno transversal: justify-content trabaja en el principal y align-items en el transversal.
  • gap separa los ítems; flex-wrap: wrap permite varias líneas.
  • flex: 1 reparte el espacio sobrante; flex: 0 0 200px fija un tamaño; margin-left: auto empuja un ítem al final.
  • align-items: stretch iguala la altura de las tarjetas de una fila.
  • justify-content: center + align-items: center centra en ambos ejes (con alto definido).
  • min-width: 0 evita que un ítem con texto largo desborde.
  • order solo cambia lo visual, no el orden de lectura.

7.Glosario

TérminoSignificado
Contenedor flexEl elemento con display: flex.
Ítem flexCada hijo directo de un contenedor flex.
Eje principalLa dirección en que se colocan los ítems (flex-direction).
Eje transversalEl eje perpendicular al principal.
gapEspacio entre ítems, sin márgenes.
flex-basisTamaño inicial de un ítem antes de crecer o encogerse.
flex-grow / flex-shrinkCuánto crece o se encoge un ítem.
orderPosición visual de un ítem.

🧠 Comprueba lo aprendido

Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.

¿Qué hace justify-content?

Con flex-direction: column, ¿qué propiedad centra los ítems horizontalmente?

¿Cuál es la manera más cómoda de separar ítems flex?

align-items: center no centra en vertical. ¿Qué falta probablemente?

¿Qué hace flex: 1 en tres ítems hermanos?

Tu progreso se guarda en este navegador y se refleja en el índice del curso.

💡 🚀 ¡Ahora te toca!

La práctica fija lo aprendido. Pasa al ejercicio de esta lección.

Ir al ejercicio