TechLead

Flexbox

Layouts flexibles unidimensionales

¿Qué es Flexbox?

Flexbox (Flexible Box Layout) es un modelo de layout CSS diseñado para distribuir espacio y alinear elementos dentro de un contenedor, incluso cuando su tamaño es desconocido o dinámico. Es perfecto para layouts unidimensionales (filas o columnas).

Antes de Flexbox, crear layouts responsivos requería hacks de float, posicionamiento y JavaScript. Flexbox hace que diseños complejos sean simples con solo unas pocas propiedades.

Conceptos Básicos

Contenedor Flex: El elemento padre con display: flex
Items Flex: Los hijos directos del contenedor flex
Eje Principal: Dirección principal del layout (horizontal por defecto)
Eje Transversal: Perpendicular al eje principal

/* El padre se convierte en contenedor flex */
.container {
  display: flex;
}

/* Los hijos se convierten automáticamente en items flex */
.container > div {
  /* Estos son items flex */
}

Propiedades del Contenedor

flex-direction

Define la dirección del eje principal.

.container {
  flex-direction: row;            /* Por defecto: izquierda a derecha */
  flex-direction: row-reverse;    /* Derecha a izquierda */
  flex-direction: column;         /* Arriba a abajo */
  flex-direction: column-reverse; /* Abajo a arriba */
}

justify-content (Eje Principal)

Alinea items a lo largo del eje principal.

.container {
  justify-content: flex-start;    /* Inicio (por defecto) */
  justify-content: flex-end;      /* Final */
  justify-content: center;        /* Centro */
  justify-content: space-between; /* Espacio entre items */
  justify-content: space-around;  /* Espacio igual alrededor */
  justify-content: space-evenly;  /* Espacio igual entre todos */
}

align-items (Eje Transversal)

Alinea items a lo largo del eje transversal.

.container {
  align-items: stretch;     /* Estirar para llenar (por defecto) */
  align-items: flex-start;  /* Inicio del eje transversal */
  align-items: flex-end;    /* Final del eje transversal */
  align-items: center;      /* Centro del eje transversal */
  align-items: baseline;    /* Alinear líneas base de texto */
}

flex-wrap

Controla si los items se envuelven a nuevas líneas.

.container {
  flex-wrap: nowrap;       /* Una línea (por defecto) */
  flex-wrap: wrap;         /* Envolver a múltiples líneas */
  flex-wrap: wrap-reverse; /* Envolver en reversa */
}

gap

Agrega espacio entre items flex.

.container {
  gap: 20px;          /* Fila y columna */
  gap: 20px 10px;     /* Fila | Columna */
  row-gap: 20px;      /* Solo filas */
  column-gap: 10px;   /* Solo columnas */
}

Propiedades de los Items

flex-grow

Cuánto puede crecer un item para llenar espacio disponible.

.item {
  flex-grow: 0;  /* No crecer (por defecto) */
  flex-grow: 1;  /* Crecer para llenar espacio */
  flex-grow: 2;  /* Crecer el doble que flex-grow: 1 */
}

flex-shrink

Cuánto puede encogerse un item si es necesario.

.item {
  flex-shrink: 1;  /* Puede encogerse (por defecto) */
  flex-shrink: 0;  /* No encogerse */
  flex-shrink: 2;  /* Encogerse el doble que flex-shrink: 1 */
}

flex-basis

Tamaño inicial antes de que se distribuya el espacio.

.item {
  flex-basis: auto;   /* Usar width/height del item */
  flex-basis: 200px;  /* Tamaño inicial fijo */
  flex-basis: 25%;    /* Porcentaje del contenedor */
  flex-basis: 0;      /* Ignorar tamaño del contenido */
}

Atajo flex

.item {
  flex: 1;           /* flex-grow: 1, shrink: 1, basis: 0% */
  flex: 0 0 200px;   /* No crecer, no encogerse, 200px de ancho */
  flex: 1 1 auto;    /* Crecer y encogerse, tamaño auto */
}

align-self

Sobrescribe align-items para un item específico.

.item {
  align-self: auto;       /* Usar align-items del contenedor */
  align-self: flex-start;
  align-self: flex-end;
  align-self: center;
  align-self: stretch;
}

Patrones Comunes de Flexbox

Centrado Perfecto

.container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}

Barra de Navegación

.navbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1rem;
}

Footer Fijo al Fondo

.page {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}

.content {
  flex: 1;  /* Empuja el footer hacia abajo */
}

Columnas de Igual Altura

.row {
  display: flex;
}

.column {
  flex: 1;  /* Todos crecen igual, alturas iguales */
}

✓ Mejores Prácticas de Flexbox

  • • Usa gap en lugar de márgenes para espaciado
  • • Prefiere flex: 1 sobre anchos específicos para layouts fluidos
  • • Usa min-width: 0 en items flex para prevenir desbordamiento
  • • Considera Grid para layouts bidimensionales
  • • Prueba con diferentes tamaños de pantalla