CSS

CSS

Tutorial CSS: Flexbox para crear layouts y estructuras

Aprende a usar flexbox en CSS para diseñar layouts adaptables y estructuras flexibles con contenedores y elementos flex.

Aprende CSS y certifícate

Concepto de contenedor flex y elementos flex

Flexbox es un modelo de diseño en CSS que permite crear estructuras de página flexibles y adaptables. A diferencia de los métodos tradicionales de maquetación, flexbox facilita la distribución de elementos en una página de forma más intuitiva, especialmente cuando trabajamos con diseños que deben adaptarse a diferentes tamaños de pantalla.

Para entender flexbox, es fundamental comprender sus dos componentes principales: el contenedor flex y los elementos flex.

El contenedor flex

El contenedor flex (o flex container) es el elemento padre que define un contexto flexible para todos sus hijos directos. Para crear un contenedor flex, simplemente aplicamos la propiedad display con el valor flex o inline-flex:

.container {
  display: flex;
}

Este simple cambio transforma radicalmente cómo se comportan los elementos dentro del contenedor. Al establecer display: flex, el elemento se convierte en un bloque flexible que ocupa todo el ancho disponible, similar a un elemento con display: block, pero con las capacidades de flexbox.

Si necesitamos que nuestro contenedor flex se comporte como un elemento en línea (sin ocupar todo el ancho disponible), podemos usar:

.container {
  display: inline-flex;
}

Veamos un ejemplo básico de cómo crear un contenedor flex:

.navbar {
  display: flex;
  background-color: #333;
  padding: 15px;
}

Con este código, todos los elementos hijos directos de .navbar se convertirán automáticamente en elementos flex.

Los elementos flex

Los elementos flex (o flex items) son todos los hijos directos de un contenedor flex. Estos elementos adquieren comportamientos especiales que les permiten crecer, encogerse y alinearse de formas que no serían posibles con los modelos de diseño tradicionales.

Por ejemplo, si tenemos:

<div class="container">
  <div class="item">Elemento 1</div>
  <div class="item">Elemento 2</div>
  <div class="item">Elemento 3</div>
</div>
.container {
  display: flex;
}

Cada <div class="item"> se convierte automáticamente en un elemento flex, sin necesidad de aplicar propiedades adicionales.

Características básicas de los elementos flex

Los elementos flex tienen varias características importantes:

  • Dimensionamiento flexible: Pueden crecer o encogerse según el espacio disponible.
  • Alineación: Pueden alinearse de diferentes maneras tanto en el eje principal como en el cruzado.
  • Ordenamiento: Pueden reordenarse visualmente sin cambiar el HTML.

Veamos un ejemplo de cómo los elementos flex se comportan de forma diferente a los elementos normales:

.container {
  display: flex;
  height: 200px;
  background-color: #f0f0f0;
}

.item {
  padding: 20px;
  margin: 10px;
  background-color: #3498db;
  color: white;
}

Con este código, los elementos .item se colocarán uno al lado del otro (en lugar de uno debajo del otro como sería el comportamiento normal), y tendrán la misma altura que el contenedor.

Relación entre contenedor y elementos

La relación entre el contenedor flex y sus elementos es fundamental. El contenedor establece el contexto y las reglas generales, mientras que los elementos responden a estas reglas y pueden tener propiedades específicas que modifican su comportamiento individual.

Podemos visualizar esta relación con un ejemplo práctico:

<nav class="main-menu">
  <a href="#" class="menu-item">Inicio</a>
  <a href="#" class="menu-item">Productos</a>
  <a href="#" class="menu-item">Servicios</a>
  <a href="#" class="menu-item">Contacto</a>
</nav>
.main-menu {
  display: flex;
  background-color: #2c3e50;
  padding: 15px;
}

.menu-item {
  color: white;
  text-decoration: none;
  padding: 10px 15px;
  margin: 0 5px;
}

/* Modificando un elemento flex específico */
.menu-item:last-child {
  margin-left: auto; /* Empuja el último elemento hacia la derecha */
}

En este ejemplo, el contenedor .main-menu establece el contexto flex, y todos los enlaces .menu-item se convierten en elementos flex. El último elemento tiene una propiedad especial que lo empuja hacia el extremo derecho del contenedor.

Anidamiento de contenedores flex

Es importante destacar que los contenedores flex pueden anidarse. Un elemento flex puede ser a su vez un contenedor flex para sus propios hijos:

<div class="outer-container">
  <div class="inner-container">
    <div class="item">A</div>
    <div class="item">B</div>
  </div>
  <div class="item">C</div>
</div>
.outer-container {
  display: flex;
  background-color: #ecf0f1;
  padding: 20px;
}

.inner-container {
  display: flex;
  background-color: #bdc3c7;
  padding: 10px;
}

.item {
  padding: 20px;
  margin: 5px;
  background-color: #e74c3c;
  color: white;
}

En este caso, .outer-container es un contenedor flex con dos elementos flex: .inner-container y el tercer .item. A su vez, .inner-container es un contenedor flex para los dos primeros .item.

Este anidamiento permite crear estructuras complejas manteniendo la flexibilidad y adaptabilidad que caracteriza a flexbox.

Inspección de contenedores y elementos flex

Una forma práctica de entender cómo funcionan los contenedores y elementos flex es utilizando las herramientas de desarrollo del navegador. Al inspeccionar un elemento que tiene display: flex, muchos navegadores modernos mostrarán indicadores visuales que ayudan a identificar el contenedor flex y sus elementos.

Por ejemplo, en Chrome DevTools, los contenedores flex se marcan con un borde punteado y los elementos flex se resaltan cuando se selecciona el contenedor.

Ejes principal y cruzado en flexbox

Uno de los conceptos fundamentales para dominar flexbox es entender sus dos ejes: el eje principal y el eje cruzado. Estos ejes determinan cómo se distribuyen y alinean los elementos flex dentro del contenedor.

Eje principal (main axis)

El eje principal es la dirección primaria en la que se colocan los elementos flex. Su orientación viene determinada por la propiedad flex-direction, que puede tener cuatro valores posibles:

.container {
  display: flex;
  flex-direction: row; /* valor por defecto */
}

Las opciones para flex-direction son:

  • row: Los elementos se colocan horizontalmente de izquierda a derecha (valor predeterminado)
  • row-reverse: Los elementos se colocan horizontalmente de derecha a izquierda
  • column: Los elementos se colocan verticalmente de arriba hacia abajo
  • column-reverse: Los elementos se colocan verticalmente de abajo hacia arriba

Veamos cómo afecta esta propiedad a la disposición de los elementos:

.container-row {
  display: flex;
  flex-direction: row;
  background-color: #f0f0f0;
  margin-bottom: 20px;
}

.container-column {
  display: flex;
  flex-direction: column;
  background-color: #f0f0f0;
}

.item {
  padding: 20px;
  margin: 5px;
  background-color: #3498db;
  color: white;
}

En el primer contenedor, los elementos se dispondrán en una fila horizontal, mientras que en el segundo lo harán en una columna vertical.

Eje cruzado (cross axis)

El eje cruzado es perpendicular al eje principal. Su dirección depende automáticamente de la dirección del eje principal:

  • Si el eje principal es horizontal (row o row-reverse), el eje cruzado será vertical
  • Si el eje principal es vertical (column o column-reverse), el eje cruzado será horizontal

Esta relación perpendicular es fundamental para entender cómo funcionan las propiedades de alineación en flexbox.

Inicio y fin de los ejes

Cada eje tiene un punto de inicio (start) y un punto final (end). Estos puntos son importantes porque determinan:

  1. La dirección en que fluyen los elementos
  2. El punto de referencia para las propiedades de alineación

En un documento con dirección de texto de izquierda a derecha (como el español o inglés):

  • Para flex-direction: row:

  • Inicio del eje principal: izquierda

  • Fin del eje principal: derecha

  • Inicio del eje cruzado: arriba

  • Fin del eje cruzado: abajo

  • Para flex-direction: column:

  • Inicio del eje principal: arriba

  • Fin del eje principal: abajo

  • Inicio del eje cruzado: izquierda

  • Fin del eje cruzado: derecha

Propiedades de alineación en el eje principal

Para controlar cómo se distribuyen los elementos a lo largo del eje principal, utilizamos la propiedad justify-content:

.container {
  display: flex;
  justify-content: flex-start; /* valor por defecto */
}

Las opciones más comunes para justify-content son:

  • flex-start: Alinea los elementos al inicio del eje principal
  • flex-end: Alinea los elementos al final del eje principal
  • center: Centra los elementos en el eje principal
  • space-between: Distribuye los elementos uniformemente con el primer elemento al inicio y el último al final
  • space-around: Distribuye los elementos con espacios iguales alrededor de cada uno
  • space-evenly: Distribuye los elementos con espacios exactamente iguales entre ellos

Veamos un ejemplo práctico:

.container {
  display: flex;
  justify-content: space-between;
  background-color: #f0f0f0;
  padding: 10px;
}

.item {
  padding: 15px;
  background-color: #3498db;
  color: white;
}

Este código creará una barra de navegación con elementos distribuidos uniformemente, con el primer elemento pegado a la izquierda y el último a la derecha.

Propiedades de alineación en el eje cruzado

Para controlar la alineación en el eje cruzado, utilizamos principalmente dos propiedades:

  1. align-items: Controla la alineación de todos los elementos en el eje cruzado
  2. align-self: Permite sobrescribir la alineación para un elemento específico
.container {
  display: flex;
  height: 200px;
  align-items: stretch; /* valor por defecto */
}

.item {
  align-self: center; /* sobrescribe align-items para este elemento */
}

Las opciones principales para ambas propiedades son:

  • stretch: Estira los elementos para ocupar todo el espacio disponible en el eje cruzado (valor predeterminado)
  • flex-start: Alinea los elementos al inicio del eje cruzado
  • flex-end: Alinea los elementos al final del eje cruzado
  • center: Centra los elementos en el eje cruzado
  • baseline: Alinea los elementos según la línea base de su texto

Un ejemplo práctico de alineación en el eje cruzado:

.hero-section {
  display: flex;
  height: 400px;
  background-color: #34495e;
  align-items: center; /* Centra verticalmente todos los elementos */
}

.hero-content {
  padding: 30px;
  color: white;
}

.hero-image {
  align-self: flex-end; /* Coloca la imagen en la parte inferior */
}

Múltiples líneas y alineación

Cuando los elementos flex no caben en una sola línea y se permite el salto de línea con flex-wrap: wrap, podemos controlar cómo se alinean estas múltiples líneas usando la propiedad align-content:

.container {
  display: flex;
  flex-wrap: wrap;
  height: 400px;
  align-content: space-between;
}

Las opciones para align-content son similares a las de justify-content, pero aplicadas a la distribución de las líneas en el eje cruzado:

  • flex-start: Agrupa las líneas al inicio del eje cruzado
  • flex-end: Agrupa las líneas al final del eje cruzado
  • center: Centra las líneas en el eje cruzado
  • space-between: Distribuye las líneas uniformemente con la primera al inicio y la última al final
  • space-around: Distribuye las líneas con espacios iguales alrededor de cada una
  • stretch: Estira las líneas para ocupar todo el espacio disponible (valor predeterminado)

Cambio de dirección y ejes

Es importante entender que cuando cambiamos la dirección del eje principal con flex-direction, los ejes y sus propiedades asociadas también cambian:

.container {
  display: flex;
  flex-direction: column;
  height: 300px;
  /* En este caso, justify-content alinea verticalmente */
  justify-content: space-between;
  /* Y align-items alinea horizontalmente */
  align-items: center;
}

En este ejemplo, al usar flex-direction: column:

  • justify-content ahora controla la distribución vertical
  • align-items ahora controla la alineación horizontal

Visualización de los ejes

Para entender mejor cómo funcionan los ejes en flexbox, podemos crear un ejemplo visual:

.axis-demo {
  display: flex;
  height: 250px;
  background-color: #f5f5f5;
  border: 2px dashed #999;
  padding: 15px;
  position: relative;
}

.axis-demo::before {
  content: "→ Eje principal";
  position: absolute;
  bottom: 5px;
  left: 50%;
  transform: translateX(-50%);
  color: #e74c3c;
}

.axis-demo::after {
  content: "↓ Eje cruzado";
  position: absolute;
  top: 50%;
  right: 5px;
  transform: translateY(-50%) rotate(90deg);
  transform-origin: right center;
  color: #3498db;
}

.axis-item {
  padding: 20px;
  margin: 10px;
  background-color: #2ecc71;
  color: white;
}

Este código crea un contenedor flex con indicadores visuales que muestran la dirección de ambos ejes, lo que facilita la comprensión de cómo se relacionan con las propiedades de alineación.

Aplicación práctica: Centrado perfecto

Una de las aplicaciones más comunes de la comprensión de los ejes en flexbox es el centrado perfecto de elementos, tanto horizontal como verticalmente:

.perfect-center {
  display: flex;
  justify-content: center; /* Centra en el eje principal (horizontal) */
  align-items: center; /* Centra en el eje cruzado (vertical) */
  height: 100vh; /* Altura total de la ventana */
}

.centered-box {
  padding: 30px;
  background-color: #3498db;
  color: white;
  border-radius: 5px;
}

Este patrón de centrado es extremadamente útil para modales, héroes de página y otros elementos que necesitan estar perfectamente centrados en la pantalla.

Diferencias entre flexbox y sistemas tradicionales de layout

Antes de la llegada de flexbox, los desarrolladores web utilizaban diversos métodos tradicionales para crear layouts en CSS. Estos sistemas presentaban limitaciones significativas que flexbox ha logrado superar, revolucionando la forma en que estructuramos nuestras páginas web.

Sistemas tradicionales de layout

Históricamente, los desarrolladores web han utilizado principalmente estas técnicas para crear layouts:

  • Posicionamiento con display: block e inline: El flujo normal del documento donde los elementos de bloque ocupan todo el ancho disponible y los elementos en línea solo el espacio necesario.

  • Posicionamiento con float: Técnica que permite "flotar" elementos a la izquierda o derecha, haciendo que el contenido fluya alrededor de ellos.

  • Posicionamiento con position: Usando valores como relative, absolute o fixed para colocar elementos en coordenadas específicas.

  • Tablas HTML: Aunque no recomendado para layouts, muchos sitios antiguos utilizaban tablas para estructurar el contenido.

Veamos un ejemplo de layout tradicional usando floats:

.container {
  width: 100%;
  overflow: hidden; /* Para contener los elementos flotantes */
}

.sidebar {
  float: left;
  width: 25%;
  background-color: #f0f0f0;
  padding: 15px;
}

.main-content {
  float: left;
  width: 75%;
  padding: 15px;
}

.footer {
  clear: both; /* Para evitar que se vea afectado por los floats */
  background-color: #333;
  color: white;
  padding: 15px;
}

Limitaciones de los sistemas tradicionales

Los métodos tradicionales presentaban varios problemas fundamentales:

  • Centrado vertical: Era notoriamente difícil centrar elementos verticalmente. Se requerían trucos como usar position: absolute con transformaciones o márgenes negativos.

  • Distribución del espacio: Distribuir elementos uniformemente o con proporciones específicas requería cálculos precisos y código adicional.

  • Orden de los elementos: El orden visual estaba estrictamente ligado al orden en el HTML, limitando la flexibilidad del diseño.

  • Altura igual en columnas: Lograr que múltiples columnas tuvieran la misma altura era complicado y requería soluciones con JavaScript o técnicas de fondo falsas.

  • Adaptabilidad: Crear diseños que se adaptaran a diferentes tamaños de pantalla era laborioso y propenso a errores.

Un ejemplo de la complejidad del centrado vertical con métodos tradicionales:

.parent {
  position: relative;
  height: 300px;
}

.child {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  /* Alternativa antigua para navegadores sin soporte para transform */
  margin-top: -50px; /* La mitad de la altura del elemento */
  margin-left: -100px; /* La mitad del ancho del elemento */
  height: 100px;
  width: 200px;
}

Ventajas de flexbox sobre sistemas tradicionales

Flexbox resuelve elegantemente las limitaciones anteriores, ofreciendo:

  • Alineación bidireccional: Permite alinear elementos tanto horizontal como verticalmente con propiedades simples como justify-content y align-items.

  • Distribución flexible del espacio: Con propiedades como flex-grow, flex-shrink y flex-basis, los elementos pueden crecer o encogerse proporcionalmente.

  • Reordenamiento visual: La propiedad order permite cambiar el orden visual de los elementos sin modificar el HTML.

  • Altura igual automática: Los elementos en una fila flexbox tienen automáticamente la misma altura por defecto.

  • Diseño responsive simplificado: Adaptar layouts a diferentes tamaños de pantalla es mucho más sencillo y requiere menos código.

Comparemos el centrado vertical anterior con la solución en flexbox:

.parent {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 300px;
}

.child {
  /* No se necesita código adicional para el centrado */
  height: 100px;
  width: 200px;
}

Comparativa directa con ejemplos

Veamos algunos ejemplos concretos que ilustran las diferencias:

1. Distribución de espacio

Con float (tradicional):

.container {
  width: 100%;
  overflow: hidden;
}

.column {
  float: left;
  width: 33.33%; /* Requiere cálculos precisos */
  padding: 15px;
  box-sizing: border-box;
}

/* Necesitamos limpiar los floats */
.container::after {
  content: "";
  display: table;
  clear: both;
}

Con flexbox:

.container {
  display: flex;
}

.column {
  flex: 1; /* Cada columna ocupa el mismo espacio automáticamente */
  padding: 15px;
}

2. Navegación responsive

Con métodos tradicionales:

/* Versión escritorio */
.nav {
  background-color: #333;
  overflow: hidden;
}

.nav-item {
  float: left;
  padding: 15px 20px;
}

/* Versión móvil requiere media queries y cambios significativos */
@media (max-width: 768px) {
  .nav-item {
    float: none;
    display: block;
    text-align: center;
  }
}

Con flexbox:

.nav {
  display: flex;
  background-color: #333;
}

.nav-item {
  padding: 15px 20px;
}

/* Versión móvil simplificada */
@media (max-width: 768px) {
  .nav {
    flex-direction: column;
  }
}

3. Alineación de elementos con diferentes tamaños

Con métodos tradicionales, alinear elementos de diferentes tamaños requería técnicas complejas. Con flexbox, es trivial:

.feature-list {
  display: flex;
  align-items: center; /* Alinea verticalmente al centro */
}

.feature-icon {
  margin-right: 15px;
}

.feature-text {
  /* No se necesita código especial para la alineación */
}

Compatibilidad y consideraciones

A pesar de sus ventajas, hay algunos aspectos a considerar al elegir entre flexbox y métodos tradicionales:

  • Soporte de navegadores: Flexbox tiene buen soporte en navegadores modernos, pero proyectos que requieran compatibilidad con IE9 o anteriores necesitarán alternativas.

  • Curva de aprendizaje: Flexbox introduce nuevos conceptos (ejes, contenedores, elementos) que requieren tiempo para dominar.

  • Casos de uso: Aunque flexbox es versátil, para layouts de página completa con muchas filas y columnas, CSS Grid puede ser más apropiado.

  • Rendimiento: En casos extremos con cientos de elementos flex, algunos navegadores antiguos pueden mostrar problemas de rendimiento.

Transición de sistemas tradicionales a flexbox

Para proyectos existentes, la migración a flexbox puede hacerse gradualmente:

/* Enfoque híbrido durante la transición */
.container {
  /* Soporte para navegadores antiguos */
  overflow: hidden;
  
  /* Soporte para navegadores modernos */
  display: flex;
  flex-wrap: wrap;
}

.column {
  /* Soporte para navegadores antiguos */
  float: left;
  width: 33.33%;
  
  /* Soporte para navegadores modernos */
  flex: 0 0 33.33%;
}

Este enfoque progresivo permite aprovechar las ventajas de flexbox mientras se mantiene la compatibilidad con navegadores más antiguos.

Impacto en el desarrollo web moderno

La adopción de flexbox ha transformado el desarrollo front-end de varias maneras:

  • Código más limpio: Menos hacks y soluciones alternativas significan CSS más mantenible.

  • Desarrollo más rápido: Crear layouts complejos requiere menos tiempo y esfuerzo.

  • Mejores experiencias móviles: La adaptabilidad inherente de flexbox facilita el diseño responsive.

  • Mayor creatividad: Los diseñadores pueden implementar layouts que antes eran demasiado complicados técnicamente.

Flexbox no solo ha simplificado problemas existentes, sino que ha abierto nuevas posibilidades de diseño que eran prácticamente imposibles con los métodos tradicionales, marcando un antes y un después en el desarrollo de interfaces web.

Casos de uso ideales para flexbox

Flexbox destaca como una solución óptima para numerosos escenarios de diseño web que anteriormente resultaban complejos de implementar. Conocer cuándo aplicar flexbox te permitirá aprovechar al máximo sus capacidades y crear interfaces más eficientes.

Barras de navegación

Las barras de navegación representan uno de los casos de uso más comunes para flexbox. Con unas pocas líneas de código, podemos crear menús horizontales perfectamente alineados y que respondan a diferentes tamaños de pantalla:

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

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

/* Versión móvil */
@media (max-width: 768px) {
  .navbar {
    flex-direction: column;
  }
  
  .nav-links {
    margin-top: 1rem;
    width: 100%;
    justify-content: space-around;
  }
}

Este ejemplo crea una barra de navegación que distribuye los elementos uniformemente y se adapta a pantallas pequeñas cambiando a una disposición vertical, todo sin necesidad de recalcular dimensiones o usar posicionamiento absoluto.

Tarjetas y componentes de interfaz

Los componentes tipo tarjeta (cards) se benefician enormemente de flexbox, especialmente cuando necesitamos alinear elementos internos de forma consistente:

.card {
  display: flex;
  flex-direction: column;
  border-radius: 8px;
  overflow: hidden;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  width: 300px;
}

.card-image {
  width: 100%;
  height: 180px;
  object-fit: cover;
}

.card-content {
  display: flex;
  flex-direction: column;
  padding: 1rem;
  flex-grow: 1; /* Hace que el contenido ocupe el espacio disponible */
}

.card-footer {
  display: flex;
  justify-content: space-between;
  padding: 1rem;
  background-color: #f5f5f5;
}

Este patrón permite crear tarjetas con alturas iguales incluso cuando el contenido varía, y mantiene elementos como botones o iconos perfectamente alineados en la parte inferior.

Formularios y controles de entrada

Los formularios suelen requerir alineaciones precisas entre etiquetas y campos. Flexbox simplifica enormemente esta tarea:

.form-group {
  display: flex;
  margin-bottom: 1rem;
}

.form-label {
  flex: 0 0 120px; /* Ancho fijo para todas las etiquetas */
  display: flex;
  align-items: center;
}

.form-input {
  flex: 1; /* Ocupa el espacio restante */
  padding: 0.5rem;
  border: 1px solid #ddd;
  border-radius: 4px;
}

/* Alineación de botones al final del formulario */
.form-actions {
  display: flex;
  justify-content: flex-end;
  gap: 0.5rem;
  margin-top: 1.5rem;
}

Esta estructura garantiza que todas las etiquetas tengan el mismo ancho y que los campos de entrada se alineen perfectamente, mejorando significativamente la legibilidad del formulario.

Diseños de página tipo "holy grail"

El patrón de diseño conocido como "holy grail" (santo grial) consiste en un encabezado, pie de página, contenido principal y barras laterales. Tradicionalmente era complicado de implementar, pero con flexbox se vuelve sencillo:

.layout {
  display: flex;
  flex-direction: column;
  min-height: 100vh; /* Ocupa al menos toda la altura de la ventana */
}

.header, .footer {
  background-color: #333;
  color: white;
  padding: 1rem;
}

.main-container {
  display: flex;
  flex: 1; /* Ocupa todo el espacio disponible entre header y footer */
}

.sidebar {
  flex: 0 0 250px; /* Ancho fijo */
  background-color: #f0f0f0;
  padding: 1rem;
}

.content {
  flex: 1; /* Ocupa el espacio restante */
  padding: 1rem;
}

/* Versión responsive */
@media (max-width: 768px) {
  .main-container {
    flex-direction: column;
  }
  
  .sidebar {
    flex: 0 0 auto; /* Ya no tiene ancho fijo */
  }
}

Este layout se adapta perfectamente a diferentes tamaños de pantalla y garantiza que el contenido principal ocupe todo el espacio disponible.

Centrado perfecto de elementos

El centrado vertical y horizontal simultáneo era uno de los problemas más frustrantes en CSS antes de flexbox. Ahora es trivial:

.modal-container {
  display: flex;
  justify-content: center;
  align-items: center;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
}

.modal {
  background-color: white;
  padding: 2rem;
  border-radius: 8px;
  max-width: 500px;
  width: 90%;
}

Este patrón es ideal para modales, diálogos, pantallas de carga y cualquier elemento que necesite estar perfectamente centrado en la pantalla.

Distribución de elementos con tamaño variable

Cuando necesitamos distribuir elementos que tienen diferentes tamaños o que deben crecer de forma proporcional, flexbox ofrece una solución elegante:

.feature-list {
  display: flex;
  gap: 1rem;
}

.feature {
  flex: 1; /* Todos los elementos ocupan el mismo espacio */
  padding: 1.5rem;
  background-color: #f9f9f9;
  border-radius: 8px;
}

/* Elemento destacado que ocupa más espacio */
.feature.primary {
  flex: 2; /* Ocupa el doble de espacio que los demás */
  background-color: #e6f7ff;
}

Este enfoque es perfecto para secciones de características, planes de precios o cualquier conjunto de elementos que deban distribuirse proporcionalmente.

Alineación de elementos con diferentes alturas

Cuando trabajamos con elementos de diferentes alturas que deben alinearse de forma específica, flexbox simplifica enormemente el proceso:

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

.testimonial-card {
  flex: 1 1 300px; /* Base de 300px, pero puede crecer y encogerse */
  display: flex;
  flex-direction: column;
  padding: 1.5rem;
  border-radius: 8px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}

.testimonial-content {
  flex-grow: 1; /* Ocupa todo el espacio disponible */
}

.testimonial-author {
  display: flex;
  align-items: center;
  margin-top: 1rem;
}

.author-avatar {
  width: 50px;
  height: 50px;
  border-radius: 50%;
  margin-right: 1rem;
}

Este patrón garantiza que los elementos como avatares o información del autor siempre estén alineados en la parte inferior, independientemente de la longitud del contenido principal.

Diseños masonry simplificados

Aunque para un verdadero layout tipo masonry (estilo Pinterest) se recomienda CSS Grid o JavaScript, flexbox puede crear una aproximación simple:

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

.gallery-item {
  flex: 1 1 300px; /* Base de 300px, puede crecer y encogerse */
  margin-bottom: 1rem;
}

.gallery-image {
  width: 100%;
  display: block;
  border-radius: 4px;
}

Esta solución crea una galería de imágenes que se adapta al ancho disponible, manteniendo proporciones consistentes y aprovechando el espacio de manera eficiente.

Interfaces de aplicaciones tipo panel

Las interfaces de aplicaciones con paneles laterales, barras de herramientas y áreas de contenido se benefician enormemente de flexbox:

.app-interface {
  display: flex;
  height: 100vh;
}

.sidebar {
  flex: 0 0 250px; /* Ancho fijo */
  background-color: #2c3e50;
  color: white;
  overflow-y: auto;
}

.main-area {
  flex: 1; /* Ocupa el resto del espacio */
  display: flex;
  flex-direction: column;
}

.toolbar {
  padding: 0.5rem;
  background-color: #f5f5f5;
  border-bottom: 1px solid #ddd;
}

.content-area {
  flex: 1; /* Ocupa el resto del espacio vertical */
  overflow-y: auto;
  padding: 1rem;
}

Este patrón es ideal para aplicaciones web, paneles de administración y cualquier interfaz que requiera múltiples áreas funcionales con dimensiones específicas.

Consideraciones finales para elegir flexbox

Al decidir si flexbox es la solución adecuada para tu caso específico, considera estos factores:

  • Dirección principal: Si tu diseño fluye principalmente en una dirección (horizontal o vertical) con posibles alineaciones en la dirección perpendicular, flexbox es ideal.

  • Complejidad del layout: Para layouts muy complejos con múltiples filas y columnas que se alinean en ambas direcciones, CSS Grid podría ser más apropiado.

  • Contenido dinámico: Cuando el tamaño del contenido es impredecible o variable, flexbox brinda la flexibilidad necesaria para adaptarse.

  • Necesidades de alineación: Si la alineación precisa de elementos es un requisito clave, flexbox ofrece soluciones simples y potentes.

Flexbox ha revolucionado la forma en que abordamos estos casos de uso comunes, permitiéndonos crear interfaces más robustas, adaptables y mantenibles con menos código y complejidad.

Aprende CSS online

Otras lecciones de CSS

Accede a todas las lecciones de CSS y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Css

CSS

Introducción Y Entorno

Entorno Para Desarrollar Css

CSS

Introducción Y Entorno

Sintaxis

CSS

Sintaxis De Selectores Y Propiedades

Selectores Básicos

CSS

Sintaxis De Selectores Y Propiedades

Herencia Y Cascada

CSS

Sintaxis De Selectores Y Propiedades

Pseudo-clases Y Pseudo-elementos

CSS

Sintaxis De Selectores Y Propiedades

Colores En Css

CSS

Sintaxis De Selectores Y Propiedades

Unidades De Medida

CSS

Sintaxis De Selectores Y Propiedades

Especificidad

CSS

Sintaxis De Selectores Y Propiedades

Estilos De Fuente

CSS

Estilización De Texto Y Fondo

Propiedades De Texto

CSS

Estilización De Texto Y Fondo

Sombras En Texto Y Cajas

CSS

Estilización De Texto Y Fondo

Propiedades De Fondo

CSS

Estilización De Texto Y Fondo

Fuentes Web

CSS

Estilización De Texto Y Fondo

Efectos De Texto: Gradientes, Recortes

CSS

Estilización De Texto Y Fondo

Tipografía Avanzada

CSS

Estilización De Texto Y Fondo

Modelo De Caja

CSS

Modelo Caja

Propiedades De Posicionamiento

CSS

Modelo Caja

Propiedad 'Display'

CSS

Modelo Caja

Elementos 'Float' Y 'Clear'

CSS

Modelo Caja

Rellenos Y Márgenes

CSS

Modelo Caja

Bordes Y Contornos

CSS

Modelo Caja

Absolute, Fixed, Sticky Y Z-index

CSS

Posicionamiento

Flexbox Para Crear Layouts Y Estructuras

CSS

Flexbox

Css Grid Para Crear Layouts Y Estructuras

CSS

Flexbox

Propiedades Del Contenedor Flex

CSS

Flexbox

Propiedades De Los Items Flex

CSS

Flexbox

Columnas Y Filas En Grid

CSS

Css Grid

Espaciado Y Alineación

CSS

Css Grid

Tipografía Responsive

CSS

Diseño Responsive

Fundamentos Del Diseño Responsive

CSS

Diseño Responsive

Imágenes Responsive

CSS

Diseño Responsive

Funciones Matemáticas

CSS

Variables Y Funciones Css

Transformaciones 2d

CSS

Transformación, Transición, Animación

Transformaciones 3d

CSS

Transformación, Transición, Animación

Animaciones

CSS

Transformación, Transición, Animación

Transiciones

CSS

Transformación, Transición, Animación

Css Para Formularios

CSS

Css Avanzado

Accesibilidad Web Con Css

CSS

Css Avanzado

Container Queries

CSS

Css Avanzado

Selectores Avanzados

CSS

Css Avanzado

Animaciones Y Transiciones

CSS

Técnicas Modernas Y Metodologías

Variables En Css

CSS

Técnicas Modernas Y Metodologías

Diseño Responsive Con Media Queries

CSS

Técnicas Modernas Y Metodologías

Metodologías De Escritura En Css

CSS

Técnicas Modernas Y Metodologías

Accede GRATIS a CSS y certifícate

Ejercicios de programación de CSS

Evalúa tus conocimientos de esta lección Flexbox para crear layouts y estructuras con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender el concepto de contenedor flex y elementos flex en flexbox.
  • Identificar y manejar los ejes principal y cruzado para alinear y distribuir elementos.
  • Diferenciar flexbox de los sistemas tradicionales de layout y conocer sus ventajas.
  • Aplicar flexbox en casos prácticos como barras de navegación, tarjetas, formularios y layouts complejos.
  • Reconocer cuándo es adecuado usar flexbox y cómo combinarlo con otras técnicas para diseños responsivos.