flex-direction
Flexbox
Define la dirección del eje principal en un contenedor flex: si los ítems se disponen en fila o en columna, y en qué sentido.
flex-direction es la propiedad que determina en qué dirección fluyen los ítems dentro de un contenedor flex. Define el eje principal — el eje a lo largo del cual se colocan los ítems uno tras otro — y con él, de forma implícita, el eje cruzado, que siempre es perpendicular. Esta única decisión tiene efecto cascada sobre todas las demás propiedades de alineación: justify-content siempre actúa sobre el eje principal, y align-items siempre actúa sobre el eje cruzado. Cuando cambiás flex-direction, esos ejes rotan y el efecto visual de ambas propiedades cambia aunque su código no se toque.
El valor por defecto es row, que organiza los ítems en una fila horizontal de izquierda a derecha. Este comportamiento refleja el flujo de lectura occidental. Cambiar a column apila los ítems verticalmente — útil para listas de navegación lateral, acordeones o cualquier contenido que deba apilarse en lugar de alinearse. Los valores *-reverse invierten el sentido sin cambiar qué eje es el principal.
Entender flex-direction es condición para entender el resto de Flexbox. Es el primer ajuste que hacés al definir un contenedor flex, y todos los demás se calibran a partir de él.
Cómo funciona
flex-direction afecta directamente qué significan los términos main-start, main-end, cross-start y cross-end del modelo de Flexbox. Con row, main-start está a la izquierda y main-end a la derecha (en sistemas LTR). Con column, main-start está arriba y main-end abajo. Los valores *-reverse invierten main-start y main-end sin tocar el eje cruzado.
La consecuencia práctica más importante: si usás flex-direction: column, justify-content: center ya no centra horizontalmente — centra verticalmente, porque el eje principal ahora es vertical. Del mismo modo, align-items: center pasaría a centrar horizontalmente. Este intercambio es el punto que más confunde al empezar con Flexbox.
Sintaxis
.contenedor {
display: flex;
flex-direction: row; /* valor por defecto */
flex-direction: row-reverse;
flex-direction: column;
flex-direction: column-reverse;
}
Valores
row (valor por defecto)
Los ítems se disponen en fila, de izquierda a derecha (en documentos LTR). El eje principal es horizontal; el cruzado es vertical. Es el comportamiento que asume el navegador si no se declara flex-direction.
Cuándo usarlo: barras de navegación, grupos de botones, listas de etiquetas, cualquier contenido que debe alinearse horizontalmente.
row-reverse
Igual que row pero el orden se invierte: los ítems fluyen de derecha a izquierda. El primer ítem en el HTML aparece a la derecha visualmente.
Gotcha: el orden visual cambia pero el orden de tabulación del teclado y los lectores de pantalla siguen el orden del HTML — puede generar confusión de accesibilidad si se abusa.
column
Los ítems se apilan verticalmente, de arriba a abajo. El eje principal es ahora vertical; el cruzado es horizontal. justify-content controla la distribución vertical y align-items controla la alineación horizontal.
Cuándo usarlo: menús de navegación lateral, listas de opciones en columna, layouts donde los ítems deben apilarse.
column-reverse
Igual que column pero los ítems fluyen de abajo a arriba. El primer ítem del HTML aparece en la parte inferior.
Ejemplo realista
/* Barra de navegación horizontal */
.nav-horizontal {
display: flex;
flex-direction: row;
gap: 16px;
}
/* Menú lateral vertical */
.menu-lateral {
display: flex;
flex-direction: column;
gap: 8px;
}
Cuándo usar cada valor
| Situación | Valor recomendado |
|---|---|
| Barra de navegación, botones en línea, tarjetas en fila | row |
| Menú lateral, lista de opciones apiladas | column |
| Invertir el orden visual de una fila | row-reverse |
| Apilar ítems con el primero al fondo (acordeón inverso) | column-reverse |
Notas, gotchas e interacción
- El eje rota con
flex-direction.justify-contentsiempre actúa sobre el eje principal;align-itemssiempre actúa sobre el cruzado. Concolumn,justify-content: centercentra verticalmente — no horizontalmente. Este es el malentendido más frecuente al aprender Flexbox. *-reverseafecta accesibilidad. Los valoresrow-reverseycolumn-reversecambian el orden visual pero no el orden en el DOM. Los lectores de pantalla y la navegación por teclado siguen el orden HTML. Si el orden visual importa para la comprensión, es mejor reordenar el HTML directamente.- Interacción con
flex-wrap.flex-wraptambién puede invertir el sentido de las líneas adicionales conwrap-reverse, independientemente deflex-direction. Son ortogonales. writing-modeydirection. En idiomas con escritura de derecha a izquierda (RTL) o de arriba a abajo,flex-direction: rowsigue el modo de escritura —main-startpodría estar a la derecha. En proyectos multilingüe, tenerlo en cuenta.- No afecta al elemento contenedor.
flex-directionsolo cambia cómo se organizan los hijos. El contenedor en sí sigue siendo bloque o inline según su propiodisplay.
Vigente / legacy
flex-direction forma parte de la especificación Flexbox Level 1, ampliamente soportada. No hay alternativa legacy: el comportamiento que flex-direction: column produce era irreproducible limpiamente antes de Flexbox. No se necesitan prefijos de vendor en proyectos modernos.