Guías
Frontend Actualizado el 6 de noviembre de 2026

CSS Flexbox

Guía rápida de Flexbox: ejes, propiedades del contenedor y de los elementos, valores de flex, patrones comunes y errores típicos.

  • #css
  • #flexbox
  • #layout
  • #frontend

Conceptos clave

ConceptoSignificado
Contenedor flexElemento con display: flex; sus hijos directos pasan a ser elementos flex
Elemento flexCada hijo directo del contenedor (los nietos no se ven afectados)
Eje principalDirección en la que se colocan los elementos; la define flex-direction
Eje cruzadoPerpendicular al principal (vertical si la dirección es row)
Inicio y fin (start / end)Extremos de cada eje; dependen de la dirección y del idioma (LTR/RTL)
Espacio libreLo que sobra o falta en el eje principal; lo reparten flex-grow y flex-shrink
Línea flexCada fila (o columna) de elementos cuando hay flex-wrap: wrap

Contenedor: dirección y envoltura

PropiedadQué hace
display: flexConvierte el elemento en contenedor flex de tipo bloque
display: inline-flexIgual, pero el contenedor se comporta como elemento en línea
flex-direction: rowEje principal horizontal (valor por defecto)
flex-direction: columnEje principal vertical; los elementos se apilan
row-reverse / column-reverseInvierte el orden visual (no el orden de lectura ni el foco)
flex-wrap: nowrapTodo en una sola línea; los elementos se encogen (por defecto)
flex-wrap: wrapLos elementos pasan a la siguiente línea cuando no caben
flex-flow: row wrapAtajo de flex-direction + flex-wrap
gap: 1remEspacio entre elementos; acepta row-gap y column-gap por separado

Contenedor: alineación

PropiedadQué hace
justify-content: flex-startAgrupa los elementos al inicio del eje principal (por defecto)
justify-content: centerLos centra en el eje principal
justify-content: flex-endLos empuja al final del eje principal
justify-content: space-betweenPrimero y último en los extremos; el resto del espacio, repartido entre ellos
justify-content: space-aroundMismo espacio a cada lado de cada elemento (los bordes quedan con la mitad)
justify-content: space-evenlyEspacios idénticos entre elementos y en los bordes
align-items: stretchEstira los elementos a lo alto de la línea (por defecto)
align-items: center / flex-start / flex-endCentra o pega los elementos en el eje cruzado
align-items: baselineAlinea por la línea base del texto (útil con tamaños de fuente distintos)
align-content: space-betweenReparte las líneas en el eje cruzado; solo actúa con flex-wrap: wrap

Propiedades de los elementos

PropiedadQué hace
flex-grow: 1Cuánto crece el elemento para ocupar el espacio libre (0 = no crece)
flex-shrink: 1Cuánto se encoge cuando falta espacio (0 = nunca se encoge)
flex-basis: 200pxTamaño inicial en el eje principal antes de repartir espacio (auto usa width/height)
flex: 1 1 200pxAtajo de grow, shrink y basis, en ese orden
order: -1Cambia el orden visual (por defecto 0); no cambia el orden del teclado ni del lector de pantalla
align-self: flex-endSobrescribe align-items solo para este elemento
margin-left: autoAbsorbe todo el espacio libre a su izquierda y empuja el elemento al final

Valores abreviados de flex

ValorSignificado
flex: initial0 1 auto: no crece, sí se encoge, parte de su tamaño (comportamiento por defecto)
flex: 11 1 0%: crece y se encoge; todos los flex: 1 quedan del mismo ancho
flex: auto1 1 auto: crece y se encoge, pero parte de su contenido; los más largos quedan más anchos
flex: none0 0 auto: tamaño fijo según su contenido; ni crece ni se encoge
flex: 0 0 200pxExactamente 200px: ideal para una barra lateral o una columna fija
flex: 2Crece el doble que un hermano con flex: 1

Patrones: centrado y navegación

Centrado perfecto

css
.center {
  display: flex;
  justify-content: center; /* horizontal */
  align-items: center; /* vertical */
  min-height: 100dvh;
}

Barra con logo a la izquierda y menú a la derecha

css
.navbar {
  display: flex;
  align-items: center;
  gap: 1rem;
}

.navbar .menu {
  margin-left: auto; /* pushes the menu to the right edge */
}

Patrones: página y tarjetas

css
body {
  display: flex;
  flex-direction: column;
  min-height: 100dvh;
  margin: 0;
}

main {
  flex: 1; /* takes all remaining height */
}

Tarjetas que se reparten y envuelven

css
.cards {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
}

.card {
  flex: 1 1 16rem; /* grow, shrink, never below ~16rem per row */
}

Patrón: sidebar + contenido

css
.layout {
  display: flex;
  gap: 2rem;
}

.sidebar {
  flex: 0 0 250px; /* fixed width */
}

.content {
  flex: 1;
  min-width: 0; /* lets long content shrink instead of overflowing */
}

@media (width < 48rem) {
  .layout {
    flex-direction: column;
  }
}

Errores frecuentes

ProblemaSolución
El texto no hace ellipsis y desbordaLos elementos flex tienen min-width: auto; añade min-width: 0 al elemento flex
Las imágenes se deforman o se estiranUsa align-self: flex-start o flex-shrink: 0, y object-fit: cover si fijas alto y ancho
align-content no hace nadaSolo funciona con varias líneas: necesita flex-wrap: wrap
justify-content no centra en verticalEn row el eje principal es horizontal; para vertical usa align-items
flex: 1 no reparte igualComprueba min-width: 0 y que ningún hijo tenga width fijo grande
order rompe la navegación con TabEl foco sigue el orden del HTML; reordena el marcado en lugar de usar order

Texto truncado con puntos suspensivos

css
.item {
  flex: 1;
  min-width: 0;
}

.item .title {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}