Guía Completa de Flexbox
INTRODUCCIÓN
1. Propósito de Flexbox
Qué es: Flexbox es un sistema de diseño unidimensional que permite distribuir espacio y alinear elementos dentro de un contenedor, incluso cuando sus dimensiones son desconocidas o dinámicas. El contenedor padre controla la disposición general, mientras que los elementos hijos pueden ajustarse individualmente. Este ejemplo muestra cómo crear un menú de navegación típico.
<!-- HTML: Estructura del menú de navegación -->
<nav class="menu-navegacion">
<ul>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
<li><a href="#">My Work</a></li>
<li><a href="#">Blog</a></li>
<li><a href="#">Register</a></li>
</ul>
</nav>
/* CSS: Estilos básicos del menú */
/* CSS: Estilos básicos del menú
En primer lugar el estilo del contenedor del menú */
.menu-navegacion {
background-color: lightyellow;
padding: 15px;
border:1px solid black;
}
.menu-navegacion ul{
list-style-type:none;
padding: 0;
margin: 0;
display: flex;
gap: 20px;
}
/* Ahora el estilo de cada uno de los elementos del menú*/
.menu-navegacion a {
color: blue;
text-decoration: none;
padding: 10px 20px;
border:1px solid blue;
background-color:hsl(120,90%,90%);
}
See the Pen
flebox-menu_0 by José Luis Sánchez (@jsanrosa)
on CodePen.
FLEX-CONTAINER (Propiedades del contenedor padre)
2. Crear un flexbox básico
Qué es: La estructura básica de Flexbox requiere un contenedor padre y elementos hijos. El contenedor se convierte en flex container y sus hijos directos se convierten automáticamente en flex items. Esta es la base sobre la que se construyen todas las demás propiedades de Flexbox.
<!-- HTML: Estructura básica -->
<nav class="menu-navegacion">
<ul>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
<li><a href="#">My Work</a></li>
<li><a href="#">Blog</a></li>
<li><a href="#">Register</a></li>
</ul>
</nav>
/* CSS: Estilos básicos del menú
//*En primer lugar el estilo del contenedor del elemento nav que contendrá el menú */
.menu-navegacion {
background-color: lightyellow;
padding: 15px;
border: 1px solid black;
}
//* Ahora le damos estilo a la lista ul que es el contenedor flexbox*/
.menu-navegacion ul {
list-style-type: none;
padding: 0;
margin: 0;
display: flex;
gap: 20px;
}
/* Ahora el estilo de cada uno de los elementos del menú*/
.menu-navegacion a {
color: blue;
text-decoration: none;
padding: 10px 20px;
border: 1px solid blue;
background-color: hsl(120, 90%, 90%);
}
See the Pen
flexbox-menu_1 by José Luis Sánchez (@jsanrosa)
on CodePen.
3. display: flex
Qué es: La propiedad display: flex activa el contexto de formateo flex en el contenedor. Una vez aplicada, todos los hijos directos se convierten en flex items y pueden ser controlados mediante las propiedades de Flexbox. Sin esta declaración, ninguna otra propiedad de Flexbox funcionará.
/* Sin flexbox: comportamiento normal en bloque */
.contenedor-normal {
border: 2px solid #333;
}
/* Los items se apilan verticalmente (comportamiento por defecto) */
/* Con flexbox: los items se alinean horizontalmente */
.contenedor-flex {
display: flex;
border: 2px solid #333;
}
/* Los items ahora se distribuyen en fila por defecto */
4. flex-direction
Qué es: La propiedad flex-direction establece la dirección del eje principal del contenedor flex. Define si los elementos se distribuyen en filas o columnas, y en qué dirección. Esta propiedad determina cómo se comportan justify-content y align-items posteriormente.
/* Valor por defecto: fila horizontal (izquierda a derecha) */
.contenedor {
display: flex;
flex-direction: row;
}
/* Items: [1] [2] [3] [4] [5] */
/* Columna vertical (arriba hacia abajo) */
.contenedor {
display: flex;
flex-direction: column;
}
/* Items se apilan verticalmente:
[1]
[2]
[3]
[4]
[5] */
/* Fila inversa: derecha a izquierda */
.contenedor {
display: flex;
flex-direction: row-reverse;
}
/* Items: [5] [4] [3] [2] [1] */
/* Columna inversa: abajo hacia arriba */
.contenedor {
display: flex;
flex-direction: column-reverse;
}
/* Items invertidos verticalmente:
[5]
[4]
[3]
[2]
[1] */
5. flex-wrap
Qué es: La propiedad flex-wrap controla si los elementos flex deben permanecer en una sola línea o pueden distribuirse en múltiples líneas cuando el espacio del contenedor es insuficiente. Esta propiedad es fundamental para crear diseños responsivos que se adapten al tamaño de la pantalla.
/* Valor por defecto: todos en una línea */
.contenedor {
display: flex;
flex-wrap: nowrap;
}
/* Los items se comprimen para caber en una línea */
/* Al achicar la pantalla, los items se reducen */
/* Los items saltan a la siguiente línea si no caben */
.contenedor {
display: flex;
flex-wrap: wrap;
}
/* Al achicar la pantalla:
Línea 1: [1] [2] [3]
Línea 2: [4] [5] */
/* Saltan a la línea anterior (inversión vertical) */
.contenedor {
display: flex;
flex-wrap: wrap-reverse;
}
/* Las nuevas líneas aparecen arriba:
Línea 1: [4] [5]
Línea 2: [1] [2] [3] */
6. flex-flow
Qué es: La propiedad flex-flow es una forma abreviada que combina flex-direction y flex-wrap en una sola declaración. Permite establecer ambas propiedades simultáneamente, reduciendo la cantidad de código necesario y mejorando la legibilidad.
/* Forma extensa: dos propiedades separadas */
.contenedor {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
/* Forma abreviada: una sola propiedad */
.contenedor {
display: flex;
flex-flow: row wrap;
}
/* Equivalente al ejemplo anterior */
/* Columna con wrap inverso */
.contenedor {
display: flex;
flex-flow: column wrap-reverse;
}
/* Combina dirección vertical con envoltorio inverso */
7. justify-content
Qué es: La propiedad justify-content define cómo se distribuye el espacio libre entre los elementos a lo largo del eje principal del contenedor. Controla la alineación horizontal cuando flex-direction es row, o vertical cuando es column. Esta es una de las propiedades más utilizadas de Flexbox.
/* Valor por defecto: items al inicio */
.contenedor {
display: flex;
justify-content: flex-start;
}
/* [1][2][3][4][5]______________ */
/* Items centrados */
.contenedor {
display: flex;
justify-content: center;
}
/* _______[1][2][3][4][5]_______ */
/* Items al final */
.contenedor {
display: flex;
justify-content: flex-end;
}
/* ______________[1][2][3][4][5] */
/* Espacio entre items, sin espacio en los extremos */
.contenedor {
display: flex;
justify-content: space-between;
}
/* [1]___[2]___[3]___[4]___[5] */
/* Espacio alrededor de cada item */
.contenedor {
display: flex;
justify-content: space-around;
}
/* _[1]__[2]__[3]__[4]__[5]_ */
/* Espacio igual entre y alrededor de los items */
.contenedor {
display: flex;
justify-content: space-evenly;
}
/* __[1]__[2]__[3]__[4]__[5]__ */
8. align-items
Qué es: La propiedad align-items define cómo se alinean los elementos flex en el eje transversal (perpendicular al eje principal). Controla la alineación vertical cuando flex-direction es row, o horizontal cuando es column. Esta propiedad afecta a todos los items del contenedor simultáneamente.
/* Valor por defecto: items estirados para llenar el contenedor */
.contenedor {
display: flex;
height: 200px;
align-items: stretch;
}
/* Los items ocupan toda la altura disponible */
/* Items alineados al inicio del eje transversal */
.contenedor {
display: flex;
height: 200px;
align-items: flex-start;
}
/* Los items se alinean en la parte superior */
/* Items centrados verticalmente */
.contenedor {
display: flex;
height: 200px;
align-items: center;
}
/* Los items se posicionan en el centro vertical */
/* Items alineados al final del eje transversal */
.contenedor {
display: flex;
height: 200px;
align-items: flex-end;
}
/* Los items se alinean en la parte inferior */
/* Items alineados según su línea base de texto */
.contenedor {
display: flex;
align-items: baseline;
}
/* Útil cuando los items tienen diferentes tamaños de fuente */
9. align-content
Qué es: La propiedad align-content controla el espacio entre las líneas de elementos flex cuando hay múltiples líneas en el contenedor. Solo tiene efecto cuando flex-wrap está activado y hay suficiente espacio vertical. A diferencia de align-items que alinea items dentro de cada línea, align-content alinea las líneas completas.
/* Líneas agrupadas al inicio */
.contenedor {
display: flex;
flex-wrap: wrap;
height: 400px;
align-content: flex-start;
}
/* Todas las líneas se agrupan arriba */
/* Espacio distribuido entre las líneas */
.contenedor {
display: flex;
flex-wrap: wrap;
height: 400px;
align-content: space-between;
}
/* Máximo espacio entre líneas, sin espacio en extremos */
/* Líneas centradas verticalmente */
.contenedor {
display: flex;
flex-wrap: wrap;
height: 400px;
align-content: center;
}
/* Todas las líneas agrupadas en el centro vertical */
10. gap (row-gap y column-gap)
Qué es: La propiedad gap establece el espacio entre los elementos flex sin necesidad de usar márgenes. Es más limpia que aplicar margin a cada item porque el espacio solo aparece entre elementos, no en los bordes externos. Se puede usar gap para ambos ejes, o row-gap y column-gap para controlarlos individualmente.
/* Espacio uniforme entre todos los items */
.contenedor {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
/* 20px de espacio horizontal y vertical entre items */
/* Diferentes espacios para filas y columnas */
.contenedor {
display: flex;
flex-wrap: wrap;
row-gap: 30px;
column-gap: 10px;
}
/* 30px entre filas, 10px entre columnas */
/* Forma abreviada con dos valores */
.contenedor {
display: flex;
flex-wrap: wrap;
gap: 30px 10px;
}
/* Equivalente al ejemplo anterior (fila columna) */
FLEX-ITEMS (Propiedades de los elementos hijos)
11. order
Qué es: La propiedad order permite cambiar el orden visual de los elementos flex sin modificar el orden en el HTML. Por defecto, todos los items tienen order: 0. Los items con valores menores aparecen primero. Esta propiedad es útil para reorganizar elementos en diferentes tamaños de pantalla manteniendo el mismo HTML.
/* Sin order: orden natural del HTML */
.item {
/* order: 0 por defecto */
}
/* Resultado: [1] [2] [3] [4] [5] */
/* Mover el primer item al final */
.item:first-child {
order: 1;
}
/* Resultado: [2] [3] [4] [5] [1] */
/* Reorganización completa con valores negativos y positivos */
.item:nth-child(1) { order: 3; }
.item:nth-child(2) { order: -1; }
.item:nth-child(3) { order: 0; }
.item:nth-child(4) { order: 2; }
.item:nth-child(5) { order: 1; }
/* Resultado: [2] [3] [5] [4] [1] */
12. flex-grow
Qué es: La propiedad flex-grow define la capacidad de un elemento flex para crecer en relación con los demás items cuando hay espacio extra disponible en el contenedor. El valor es un número sin unidades que actúa como proporción. Por defecto es 0, lo que significa que los items no crecen.
/* Sin flex-grow: items mantienen su tamaño */
.item {
flex-grow: 0; /* Valor por defecto */
}
/* Los items no crecen, queda espacio vacío */
/* Todos los items crecen por igual */
.item {
flex-grow: 1;
}
/* Todos ocupan el mismo espacio, distribución uniforme */
/* Un item crece el doble que los demás */
.item {
flex-grow: 1;
}
.item:nth-child(3) {
flex-grow: 2;
}
/* El tercer item ocupa el doble de espacio extra */
13. flex-shrink
Qué es: La propiedad flex-shrink define la capacidad de un elemento flex para reducirse en relación con los demás items cuando el espacio del contenedor es insuficiente. El valor es un número sin unidades que actúa como proporción. Por defecto es 1, lo que significa que todos los items se reducen proporcionalmente.
/* Item que no se reduce nunca */
.item:first-child {
flex-shrink: 0;
width: 200px;
}
/* Este item mantiene siempre 200px */
/* Items se reducen proporcionalmente */
.item {
flex-shrink: 1; /* Valor por defecto */
}
/* Todos se reducen de forma uniforme al achicar */
/* Un item se reduce más rápido */
.item {
flex-shrink: 1;
}
.item:last-child {
flex-shrink: 3;
}
/* El último item se reduce 3 veces más rápido */
14. flex-basis
Qué es: La propiedad flex-basis define el tamaño inicial de un elemento flex antes de que se distribuya el espacio restante según flex-grow o flex-shrink. Acepta valores en píxeles, porcentajes u otras unidades. Es similar a width o height, pero respeta la dirección del flex container. El valor por defecto es auto.
/* Tamaño base automático basado en el contenido */
.item {
flex-basis: auto; /* Valor por defecto */
}
/* El tamaño se calcula según el contenido */
/* Tamaño base fijo en píxeles */
.item {
flex-basis: 200px;
}
/* Cada item intenta ocupar 200px antes de grow/shrink */
/* Tamaño base en porcentaje */
.item:nth-child(1) {
flex-basis: 30%;
}
.item:nth-child(2) {
flex-basis: 70%;
}
/* Distribución proporcional: 30% y 70% del contenedor */
15. flex
Qué es: La propiedad flex es una forma abreviada que combina flex-grow, flex-shrink y flex-basis en una sola declaración. Es la forma recomendada de establecer estas propiedades porque el navegador puede calcular valores predeterminados inteligentes. El orden es: flex-grow flex-shrink flex-basis.
/* Forma extensa: tres propiedades separadas */
.item {
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0;
}
/* Forma abreviada equivalente */
.item {
flex: 1 1 0;
}
/* Los items crecen y se reducen por igual desde 0 */
/* Forma abreviada con un solo valor */
.item {
flex: 1;
}
/* Equivale a: flex: 1 1 0 */
/* Items flexibles que ocupan espacio igual */
/* Valores predefinidos útiles */
.item-fijo {
flex: 0 0 200px;
}
/* No crece ni se reduce, mantiene 200px */
.item-flexible {
flex: 1 1 auto;
}
/* Crece y se reduce desde su tamaño natural */
16. align-self
Qué es: La propiedad align-self permite sobrescribir la alineación establecida por align-items del contenedor para un elemento individual específico. Acepta los mismos valores que align-items y solo afecta al elemento al que se aplica. Esta propiedad es útil cuando se necesita que un item específico tenga una alineación diferente al resto.
/* Contenedor con alineación general */
.contenedor {
display: flex;
height: 200px;
align-items: center;
}
/* Todos los items están centrados verticalmente */
/* Un item específico alineado al inicio */
.item:first-child {
align-self: flex-start;
}
/* Este item se alinea arriba, ignorando el center del padre */
/* Diferentes alineaciones para distintos items */
.item:nth-child(1) {
align-self: flex-start;
}
.item:nth-child(3) {
align-self: flex-end;
}
.item:nth-child(5) {
align-self: stretch;
}
/* Items 1, 3 y 5 tienen alineación individual */
/* Items 2 y 4 mantienen el center del contenedor */