La pregunta "¿Grid o Flexbox?" está mal planteada casi siempre. No compites entre dos herramientas que hacen lo mismo, como pasaría al elegir entre Python y JavaScript para aprender a programar; compites entre dos herramientas que resuelven problemas distintos y que, en un proyecto real, casi siempre conviven en el mismo archivo CSS. La confusión viene de que ambas usan un vocabulario parecido (contenedor, elementos, alineación), pero el modelo mental detrás es diferente.
La diferencia de fondo: una dimensión vs dos
Flexbox está pensado para distribuir elementos en una dimensión: una fila o una columna. Es la herramienta natural para una barra de navegación, una lista de botones, o centrar un elemento dentro de otro. Grid está pensado para dos dimensiones a la vez: filas y columnas simultáneamente, lo que lo hace ideal para el layout general de una página o para una cuadrícula de tarjetas donde te importa tanto la alineación horizontal como la vertical.
Una forma práctica de decidir: si estás organizando el contenido de dentro de un componente (un grupo de botones, los elementos de una card), probablemente quieres Flexbox. Si estás organizando la estructura general de una sección o página (cabecera, contenido principal, barra lateral, pie), probablemente quieres Grid.
El mismo layout, resuelto con Grid y con Flexbox
Nada aclara más esto que ver el mismo resultado —una cuadrícula de tarjetas de producto que se ajusta al ancho disponible— resuelto de las dos formas:
.contenedor {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 1.5rem;
}
.tarjeta {
/* Grid ya reparte el ancho: la tarjeta no necesita flex-basis ni width */
padding: 1rem;
}
.contenedor {
display: flex;
flex-wrap: wrap;
gap: 1.5rem;
}
.tarjeta {
/* hay que decirle a cada tarjeta cuánto puede crecer/encogerse */
flex: 1 1 220px;
padding: 1rem;
}
Con Grid, repeat(auto-fill, minmax(220px, 1fr)) le dice al navegador "encaja tantas columnas de al menos 220px como quepan, y repártelas el espacio sobrante a partes iguales". Con Flexbox, el mismo efecto se consigue combinando flex-wrap: wrap con un flex-basis en cada tarjeta, pero el control fino de cuántas columnas caben por fila es menos directo: Flexbox no sabe de "columnas" como concepto, solo de elementos que se acomodan en una línea y saltan a la siguiente cuando no caben.
Cuándo Flexbox gana claramente
Para una barra de navegación con el logo a la izquierda y los enlaces a la derecha, Flexbox es más directo que Grid:
.navbar {
display: flex;
align-items: center;
justify-content: space-between;
}
.navbar .enlaces {
display: flex;
gap: 1.5rem;
}
justify-content: space-between empuja el primer y el último elemento a los extremos, y align-items: center los centra verticalmente. Resolver esto mismo con Grid es posible, pero requiere definir columnas explícitas donde en realidad no piensas en columnas, sino en "elementos en fila".
Cuándo Grid gana claramente
Para el esqueleto de una página completa —cabecera arriba, barra lateral a un lado, contenido en medio, pie abajo— Grid modela la intención directamente, incluyendo huecos vacíos si hace falta:
.pagina {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-areas:
"cabecera cabecera"
"sidebar contenido"
"pie pie";
min-height: 100vh;
}
.cabecera { grid-area: cabecera; }
.sidebar { grid-area: sidebar; }
.contenido { grid-area: contenido; }
.pie { grid-area: pie; }
grid-template-areas es, literalmente, un mapa visual del layout escrito en el propio CSS: se lee casi como un dibujo. No hay forma razonable de conseguir ese mismo control bidimensional con Flexbox sin anidar varios contenedores flex unos dentro de otros, lo que complica el código sin necesidad.
Tabla resumen
| Situación | Herramienta recomendada |
|---|---|
| Barra de navegación | Flexbox |
| Centrar un elemento en su contenedor | Flexbox |
| Cuadrícula de tarjetas responsive | Grid |
| Layout general de página (header/sidebar/footer) | Grid |
| Lista de etiquetas o chips que se ajustan al ancho | Flexbox |
| Formulario con campos alineados en columnas | Grid |
No elijas entre Grid y Flexbox como si fuera una decisión de por vida. En un proyecto real conviven: Grid para la estructura general, Flexbox para organizar el contenido dentro de cada pieza de esa estructura.
Se pueden combinar sin problema
De hecho, es habitual usar Grid para el layout general de una página y Flexbox dentro de cada celda de esa cuadrícula para alinear su contenido interno. Esta combinación es tan común en interfaces modernas que, si estás aprendiendo a construir tu primera app con React, verás rápidamente que casi cualquier componente de UI mezcla ambos: un Grid para la disposición general de las tarjetas y un Flex interno en cada tarjeta para alinear icono, título y descripción.
Prueba tú mismo la diferencia
La mejor forma de fijar estos conceptos es cambiar los valores en un proyecto real y ver qué pasa. Copia cualquiera de los dos bloques de código de arriba en un archivo HTML con un puñado de div dentro, y ve cambiando grid-template-columns o flex hasta que el comportamiento tenga sentido para ti. No hay atajo mejor que ver el layout romperse y arreglarlo con tus propias manos.