En esta página
Flexbox desde cero
Qué es Flexbox?
Flexbox (Flexible Box Layout) es un sistema de layout CSS disenado para distribuir espacio y alinear elementos dentro de un contenedor, incluso cuando su tamaño es desconocido o dinámico.
Se activa con display: flex en el elemento padre. Todos sus hijos directos se convierten automaticamente en flex items.
Los dos ejes de Flexbox
Flexbox trabaja sobre dos ejes:
- Eje principal (main axis): definido por
flex-direction. Por defecto es horizontal (de izquierda a derecha). - Eje cruzado (cross axis): perpendicular al principal. Por defecto es vertical.
Entender estos ejes es fundamental porque justify-content alinea sobre el eje principal y align-items sobre el eje cruzado.
Propiedades del contenedor flex
flex-direction
Controla la dirección del eje principal:
| Valor | Direccion |
|---|---|
row |
Izquierda a derecha (defecto) |
row-reverse |
Derecha a izquierda |
column |
Arriba a abajo |
column-reverse |
Abajo a arriba |
justify-content (eje principal)
Distribuye los items a lo largo del eje principal:
| Valor | Efecto |
|---|---|
flex-start |
Alineados al inicio (defecto) |
flex-end |
Alineados al final |
center |
Centrados |
space-between |
Espacio igual entre items |
space-around |
Espacio igual alrededor de cada item |
space-evenly |
Espacio perfectamente igual entre todos |
align-items (eje cruzado)
Alinea los items en el eje cruzado:
| Valor | Efecto |
|---|---|
stretch |
Se estiran para llenar el contenedor (defecto) |
flex-start |
Alineados al inicio del eje cruzado |
flex-end |
Alineados al final |
center |
Centrados verticalmente |
baseline |
Alineados por la linea base del texto |
flex-wrap
Por defecto, los flex items se comprimen en una sola linea. Con flex-wrap: wrap, pueden saltar a la siguiente linea cuando no hay espacio suficiente.
.contenedor {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}gap
Define el espacio entre flex items sin usar margin. Acepta uno o dos valores (fila y columna):
.contenedor {
gap: 1rem; /* Mismo espacio en ambos ejes */
gap: 1rem 2rem; /* 1rem vertical, 2rem horizontal */
}Propiedades de los flex items
flex-grow, flex-shrink y flex-basis
Estas tres propiedades controlan como los items se expanden o comprimen:
- flex-grow: cuanto crece el item para llenar espacio sobrante (defecto: 0)
- flex-shrink: cuanto se encoge si no hay espacio suficiente (defecto: 1)
- flex-basis: tamaño base antes de distribuir espacio (defecto: auto)
El shorthand flex
La propiedad flex combina las tres:
.item { flex: 1; } /* grow:1, shrink:1, basis:0 */
.item { flex: 0 0 200px; } /* Tamano fijo de 200px */
.item { flex: 2 1 auto; } /* Crece el doble, se encoge, base automática */align-self
Permite que un item individual se alinee diferente al resto en el eje cruzado:
.item-especial {
align-self: flex-end; /* Solo este item va al fondo */
}order
Cambia el orden visual de un item sin modificar el HTML:
.primero { order: -1; } /* Aparece antes que los demas */
.último { order: 99; } /* Aparece al final */Patrones comunes con Flexbox
Centrado perfecto
.centrado {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
}Footer pegado al fondo
body {
display: flex;
flex-direction: column;
min-height: 100vh;
}
main { flex: 1; }Cards responsivas sin media queries
.cards {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}
.card {
flex: 1 1 300px; /* Minimo 300px, crece si hay espacio */
}Flexbox domina los layouts unidimensionales. En la siguiente leccion aprenderemos CSS Grid, que lleva los layouts bidimensionales a otro nivel.
Práctica
- Construye una navbar con Flexbox: Crea una barra de navegacion con un logo a la izquierda y links a la derecha usando
display: flex,justify-content: space-betweenyalign-items: center. - Centra un elemento vertical y horizontalmente: Usa un contenedor flex con
justify-content: centeryalign-items: centerpara centrar una caja en el viewport completo. - Crea cards responsivas con flex-wrap: Construye una grilla de tarjetas usando
flex-wrap: wrapyflex: 1 1 300pxpara que se adapten automaticamente sin media queries.
/* Contenedor flex básico */
.contenedor {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
gap: 1rem;
}
/* Navbar clásica con Flexbox */
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
}
.navbar__links {
display: flex;
gap: 1.5rem;
list-style: none;
}
/* Cards que se envuelven */
.grid-cards {
display: flex;
flex-wrap: wrap;
gap: 1.5rem;
}
.grid-cards > .card {
flex: 1 1 280px;
padding: 1.5rem;
border: 1px solid #ddd;
border-radius: 8px;
}
/* Layout con sidebar + contenido */
.layout {
display: flex;
min-height: 100vh;
}
.sidebar {
flex: 0 0 250px; /* No crece, no encoge, 250px fijo */
background: #f5f5f5;
padding: 1rem;
}
.contenido {
flex: 1; /* Ocupa todo el espacio restante */
padding: 2rem;
}
/* Footer pegado al fondo */
.página {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.página > main {
flex: 1; /* Empuja el footer abajo */
}
.página > footer {
padding: 1rem;
background: #1a1a2e;
color: white;
}
Inicia sesión para guardar tu progreso