Flexbox o Grid: cómo decido en 10 segundos (con el código que sí uso en la chamba)
una dimensión vs dos dimensiones está bien, pero hay una regla más útil
Contents
Cada semana alguien en la chamba me pregunta "¿esto lo hago con flex o con grid?". La respuesta de libro es "flex para una dimensión, grid para dos". Está bien, pero a mí me sirve más esta otra:
Si el contenido manda el tamaño, flex. Si el layout manda el tamaño, grid.
O sea: con flex los elementos dicen "yo mido esto" y el contenedor se acomoda. Con grid el contenedor dice "aquí hay 3 columnas" y los elementos se acomodan. Van ejemplos reales.
1. Navbar: flex
.nav {
display: flex;
align-items: center;
gap: 1rem;
}
.nav .logout {
margin-left: auto; /* empuja este botón a la derecha */
}
Cada link mide lo que mide su texto. El contenido manda. Flex.
2. Grid de tarjetas responsive sin media queries: grid
.cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 1.5rem;
}
Esto mete todas las columnas de mínimo 240px que quepan, y el espacio que sobra se reparte. En celular queda una columna, en desktop 4 o 5, sin escribir ni una media query.
auto-fill vs auto-fit, la duda de siempre: si solo tienes 2 tarjetas en una pantalla donde caben 5, auto-fill deja las 3 columnas vacías ahí (tus tarjetas se quedan angostitas) y auto-fit colapsa las vacías y tus 2 tarjetas se estiran a todo el ancho. Para catálogos uso auto-fill, para cosas tipo "3 features de la landing" uso auto-fit.
3. El layout de la app: grid con áreas
.layout {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
min-height: 100dvh;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }
@media (max-width: 768px) {
.layout {
grid-template-columns: 1fr;
grid-template-areas:
"header"
"main"
"footer";
}
.sidebar { display: none; }
}
Lo bonito de grid-template-areas es que el CSS se lee como un dibujito del layout. Cuando entra alguien nuevo al equipo lo entiende en 5 segundos.
4. Centrar algo: grid, dos líneas
.centro {
display: grid;
place-items: center;
}
Sí, ya sé que con flex también se puede. Esto es más corto y ya.
5. El bug que te va a pasar con flex (a todos nos pasó)
Tienes una fila con un ícono y un texto larguísimo con text-overflow: ellipsis y... no se corta, se sale del contenedor. Es porque los hijos de flex tienen min-width: auto por defecto, o sea, no se encogen más que su contenido. La solución:
.fila { display: flex; gap: .5rem; }
.fila .texto {
min-width: 0; /* ahora sí se puede encoger */
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
Esa línea de min-width: 0 me ha salvado más veces que el café de olla.
¿Dudas? Pregunten aquí, nadie se va a burlar. Para eso abrimos esta comunidad 💜
Written by
Sofía Ramírez
Frontend dev 💜 React, TypeScript y mucho café de olla. Trabajo remoto para una empresa gringa desde Guadalajara. Fundé codigo_en_espanol porque todo está en inglés y ya me cansé jaja
Get the best of #codigo_en_espanol weekly
One email each Monday with the most useful posts. No spam; unsubscribe in one click.
Comments
Sign in to join the conversation.
Sign in to comment