Layout con Flexbox

Aprende Flexbox para distribuir y alinear elementos en una dimensión: filas y columnas con control total.

Flexbox es un sistema de layout unidimensional: trabaja en una dirección a la vez, ya sea fila o columna. Es ideal para distribuir elementos en una barra de navegación, una lista de tarjetas o cualquier grupo de elementos que necesita alinearse.


Activar Flexbox

Basta con añadir display: flex al contenedor padre:

.contenedor {
  display: flex;
}

Los hijos directos se convierten automáticamente en flex items y se colocan en fila por defecto.


Dirección: flex-direction

.contenedor {
  flex-direction: row;            /* fila → (por defecto) */
  flex-direction: row-reverse;    /* fila ← */
  flex-direction: column;         /* columna ↓ */
  flex-direction: column-reverse; /* columna ↑ */
}

Alineación en el eje principal: justify-content

Controla cómo se distribuyen los items en la dirección de flex-direction:

.contenedor {
  justify-content: flex-start;    /* al inicio (por defecto) */
  justify-content: flex-end;      /* al final */
  justify-content: center;        /* centrados */
  justify-content: space-between; /* espacio entre items */
  justify-content: space-around;  /* espacio alrededor */
  justify-content: space-evenly;  /* espacio igual */
}

Alineación en el eje cruzado: align-items

Controla la alineación en la dirección perpendicular:

.contenedor {
  align-items: stretch;     /* estiran para llenar (por defecto) */
  align-items: flex-start;  /* al inicio del eje cruzado */
  align-items: flex-end;    /* al final */
  align-items: center;      /* centrados */
  align-items: baseline;    /* alineados por línea base del texto */
}

Centrado perfecto con dos líneas

.contenedor {
  display: flex;
  justify-content: center;
  align-items: center;
}

Salto de línea: flex-wrap

Por defecto, todos los items intentan caber en una línea:

.contenedor {
  flex-wrap: nowrap;  /* sin salto (por defecto) */
  flex-wrap: wrap;    /* salta a la siguiente línea si no caben */
}

Propiedades de los items

flex-grow

Cuánto espacio disponible puede ocupar el item (proporcionalmente):

.item-1 { flex-grow: 1; }
.item-2 { flex-grow: 2; } /* ocupa el doble que item-1 */

flex-shrink

Cuánto puede encogerse el item si no hay espacio:

.item { flex-shrink: 1; } /* se encoge (por defecto) */
.fijo { flex-shrink: 0; } /* nunca se encoge */

flex-basis

El tamaño base del item antes de que se aplique grow o shrink:

.item { flex-basis: 200px; }
.item { flex-basis: 33.33%; }

El shorthand: flex

.item {
  flex: 1;        /* flex-grow: 1, flex-shrink: 1, flex-basis: 0 */
  flex: 0 0 200px; /* no crece, no encoge, mide 200px */
}

align-self

Sobreescribe align-items para un item concreto:

.especial {
  align-self: flex-end;
}

Ejemplo práctico: barra de navegación

.nav {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0 2rem;
  height: 60px;
}

.nav-logo {
  font-weight: bold;
  font-size: 1.25rem;
}

.nav-links {
  display: flex;
  gap: 1.5rem;
  list-style: none;
}

Ejemplo práctico: rejilla de tarjetas

.grid-tarjetas {
  display: flex;
  flex-wrap: wrap;
  gap: 1.5rem;
}

.tarjeta {
  flex: 1 1 280px; /* crece, se encoge, base 280px */
  border: 1px solid #ddd;
  border-radius: 8px;
  padding: 1.5rem;
}

En la siguiente lección veremos CSS Grid: el sistema bidimensional para layouts más complejos con filas y columnas simultáneas.