
CSS Grid: Construir layouts complejos sin adivinar
📷 Christina Morillo / PexelsCSS Grid: Construir layouts complejos sin adivinar
grid-template-columns, unidades fr, auto-fill vs auto-fit - construye layouts reales como galerias de fotos y paneles de control desde cero. Generador visual incluido.
Por que Grid me tomo tanto tiempo aprenderlo realmente
Evite CSS Grid por mas tiempo del que deberia. Flexbox cubria la mayor parte de lo que necesitaba, y cada vez que revisaba la documentacion de Grid me encontraba con terminologia como "pistas implicitas" y "lineas de cuadricula con nombre" y cerraba silenciosamente la pestana. Se sentia como un exceso.
Lo que cambio mi opinion fue intentar construir un layout de panel de control con Flexbox. Tenia una barra lateral, un encabezado, un area de contenido principal y un pie de pagina, y estaba anidando contenedores flex tres niveles de profundidad solo para que las cosas se alinearan. Funcionaba - apenas - pero cada vez que el diseno cambiaba tenia que reestructurar el HTML. Fue entonces cuando alguien me senalo Grid, y en aproximadamente una hora reescribi todo en 30 lineas de CSS. El HTML apenas cambio.
Eso es lo que Grid hace que Flexbox no puede: te permite definir el layout en dos dimensiones a la vez, desde el contenedor, sin preocuparte por el anidamiento de elementos. Defines la estructura, y los elementos simplemente se encajan.
Esta guia cubre todo lo que realmente necesitas para usar Grid dia a dia: las propiedades principales, las funciones raras pero utiles, y los patrones que he usado en proyectos reales. Si quieres experimentar visualmente mientras lees, el Generador CSS Grid en ToolBox Hubs te permite configurar columnas, filas y espacios y ver el CSS generado en tiempo real.
El modelo mental
Antes de cualquier codigo, aqui esta el modelo mental: CSS Grid te pide que pienses en el layout de la manera en que un disenador grafico piensa en una cuadricula de layout. Defines una serie de lineas horizontales y verticales, y esas lineas crean celdas. Luego colocas contenido en esas celdas, o dejas que el navegador lo haga automaticamente.
Esto es genuinamente diferente de Flexbox, donde el layout esta impulsado por los elementos en si mismos: estableces propiedades en los elementos que les dicen como crecer, encoger o alinearse. Grid invierte esto. El layout se define en el contenedor, y los elementos siguen.
Definir una cuadricula
Comienza con una propiedad:
.container {
display: grid;
}
Eso no hace mucho por si solo. Los elementos se apilaran en una sola columna por defecto. La parte interesante es definir pistas.
grid-template-columns y grid-template-rows
Estas definen los tamanos de tus columnas y filas. Los valores son una lista de tamanos de pistas separados por espacios.
.container {
display: grid;
grid-template-columns: 200px 400px 200px;
grid-template-rows: 100px auto 60px;
}
Esto crea tres columnas (200px, 400px, 200px) y tres filas (100px, la altura que el contenido necesite, 60px). Los elementos se colocan en celdas de izquierda a derecha, de arriba a abajo.
Puedes usar cualquier unidad de longitud CSS: px, em, rem, %, vw. Pero la unidad mas util que Grid introdujo es completamente nueva.
La unidad fr
La unidad fr significa fraccion. Representa una parte del espacio libre disponible en el contenedor de cuadricula. Por que es mucho mejor que los porcentajes:
/* Enfoque de porcentaje - tienes que hacer los calculos */
.container {
display: grid;
grid-template-columns: 25% 50% 25%;
}
/* Enfoque fr - solo describes las proporciones */
.container {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
}
Ambos crean el mismo layout, pero fr maneja los espacios correctamente. Si agreas un gap entre columnas y estas usando porcentajes, el ancho total supera el 100% y obtienes desbordamiento. Con fr, el navegador calcula el espacio libre despues de restar los espacios y luego lo distribuye. Mucho menos matematicas.
.container {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
gap: 24px;
/* El navegador resta primero los dos espacios de 24px,
luego divide el resto en proporcion 1:2:1 */
}
Tambien puedes mezclar anchos fijos con unidades fr, que es como funciona la mayoria de los layouts reales:
.layout {
display: grid;
grid-template-columns: 280px 1fr;
/* la barra lateral siempre tiene 280px, el contenido toma todo lo demas */
}
Ese patron: barra lateral fija, contenido flexible, es uno que uso constantemente.
La funcion repeat()
Cuando tienes muchas columnas de igual ancho, escribirlas manualmente se vuelve tedioso. repeat() es la abreviatura:
/* Sin repeat */
.grid {
grid-template-columns: 1fr 1fr 1fr 1fr;
}
/* Con repeat */
.grid {
grid-template-columns: repeat(4, 1fr);
}
repeat(4, 1fr) significa "cuatro pistas, cada una de 1fr de ancho". Tambien puedes repetir patrones complejos:
.grid {
grid-template-columns: repeat(3, 100px 1fr);
/* Crea: 100px 1fr 100px 1fr 100px 1fr */
}
Pero la version realmente poderosa combina repeat() con dos palabras clave especiales.
auto-fill y auto-fit
Aqui es donde Grid pasa de "util" a "casi magico". En lugar de especificar un numero exacto de columnas, puedes decirle al navegador que cree tantas columnas como quepan:
.grid {
display: grid;
grid-template-columns: repeat(auto-fill, 200px);
gap: 16px;
}
Esto crea una cuadricula que ajusta automaticamente el numero de columnas segun el ancho del contenedor. En una pantalla ancha podrias obtener 5 columnas, en una pantalla estrecha obtienes 2. No se necesitan media queries.
La diferencia entre auto-fill y auto-fit es sutil pero significativa:
auto-fill crea tantas pistas como quepan, incluyendo las vacias. Si solo tienes 3 elementos pero la cuadricula podria caber 6 columnas, obtienes 6 columnas: las ultimas 3 estan vacias pero ocupan espacio.
auto-fit tambien crea tantas pistas como quepan, pero colapsa las pistas vacias a ancho cero. Si tienes 3 elementos en una cuadricula que podria caber 6, las pistas vacias se colapsan y tus 3 elementos se estiran para llenar el espacio disponible.
/* auto-fill: las columnas vacias preservan el espacio */
.fill-grid {
grid-template-columns: repeat(auto-fill, 200px);
}
/* auto-fit: los elementos se expanden para llenar el contenedor */
.fit-grid {
grid-template-columns: repeat(auto-fit, 200px);
}
Cual usar depende del diseno. Para una galeria de fotos donde quieres que los elementos mantengan un tamano consistente, auto-fill es generalmente mejor. Para una cuadricula de tarjetas donde quieres que los elementos llenen la fila, auto-fit es la opcion correcta.
minmax()
La ultima pieza del rompecabezas es minmax(), que define un rango de tamano para una pista en lugar de un tamano fijo. Toma dos argumentos: un tamano minimo y un tamano maximo.
.grid {
display: grid;
grid-template-columns: repeat(3, minmax(200px, 1fr));
}
Esto crea tres columnas de al menos 200px de ancho y como maximo 1fr del espacio disponible. En una pantalla ancha se expanden. En una pantalla estrecha nunca se hacen mas pequenas que 200px.
La combinacion de repeat(), auto-fill o auto-fit, y minmax() es tan comun que se ha convertido en el patron canonico de cuadricula responsiva:
.responsive-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 24px;
}
Lee esto como: "crea tantas columnas como quepan, cada una de al menos 240px de ancho, cada una creciendo igualmente para llenar el espacio disponible." Los elementos se envuelven automaticamente. Sin media queries. Sin JavaScript. Este es el patron que uso cuando necesito una cuadricula de tarjetas responsiva rapidamente.
Ejemplo del mundo real: Galeria de fotos
Vamos a construir una galeria de fotos desde cero para mostrar como se desarrolla esto.
<div class="gallery">
<img src="photo-1.jpg" alt="...">
<img src="photo-2.jpg" alt="...">
<!-- more photos -->
</div>
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 8px;
}
.gallery img {
width: 100%;
aspect-ratio: 1 / 1;
object-fit: cover;
display: block;
}
Eso es todo. La cuadricula calcula automaticamente cuantas columnas caben en el contenedor. Las imagenes mantienen una proporcion de aspecto cuadrada usando aspect-ratio y object-fit: cover maneja el recorte. En movil podrias obtener 2 columnas, en un escritorio ancho podrias obtener 6. El layout es responsivo por naturaleza, no mediante una lista de puntos de ruptura.
Si quieres destacar ciertas fotos, puedes extenderlas a traves de multiples celdas:
.gallery img:first-child {
grid-column: span 2;
grid-row: span 2;
}
Eso hace que la primera foto ocupe un bloque 2x2 mientras todo lo demas fluye alrededor. Sin trucos de posicion, sin flotantes: solo colocacion de Grid.
Ejemplo del mundo real: Layout de panel de control
Este es el caso de uso que me convenció de Grid. Un panel de control con una barra lateral, encabezado, contenido principal y pie de pagina.
<div class="dashboard">
<header class="dash-header">Header</header>
<nav class="dash-sidebar">Sidebar</nav>
<main class="dash-main">Main Content</main>
<footer class="dash-footer">Footer</footer>
</div>
.dashboard {
display: grid;
grid-template-columns: 260px 1fr;
grid-template-rows: 60px 1fr 40px;
grid-template-areas:
'header header'
'sidebar main'
'footer footer';
min-height: 100vh;
gap: 0;
}
.dash-header { grid-area: header; }
.dash-sidebar { grid-area: sidebar; }
.dash-main { grid-area: main; }
.dash-footer { grid-area: footer; }
La propiedad grid-template-areas es lo que hace esto particularmente legible. Basicamente estas dibujando el layout en arte ASCII. El encabezado y el pie de pagina se extienden a traves de ambas columnas. La barra lateral es de 260px. El contenido principal llena todo lo demas.
Hacer esto responsivo es sencillo:
@media (max-width: 768px) {
.dashboard {
grid-template-columns: 1fr;
grid-template-rows: 60px auto 1fr 40px;
grid-template-areas:
'header'
'sidebar'
'main'
'footer';
}
}
En movil, todo se apila en una sola columna. La barra lateral colapsa debajo del encabezado. Limpio.
Grid vs Flexbox: La respuesta real
La gente trata esto como si tuvieras que elegir un bando. No tienes que hacerlo. Resuelven problemas diferentes.
Usa Grid cuando:
- Necesitas que filas y columnas se alineen entre si
- Estas construyendo estructura a nivel de pagina (encabezado, barra lateral, principal, pie de pagina)
- Necesitas que los elementos se extiendan por multiples filas o columnas
- Quieres definir el layout desde el contenedor, no los elementos
- Estas construyendo una cuadricula consistente de tarjetas con areas de contenido alineadas dentro de cada tarjeta
Usa Flexbox cuando:
- Tienes una sola fila o columna de elementos
- Los elementos necesitan dimensionarse segun su contenido
- Estas organizando enlaces de navegacion, botones o entradas de formulario en linea
- Los elementos necesitan ajustarse pero no te importa la alineacion entre filas
En la mayoria de los proyectos uso ambos. Grid maneja el esqueleto de la pagina. Flexbox maneja los componentes internos: la barra de navegacion, el grupo de botones dentro de una tarjeta, el layout del formulario. Son complementarios, no competidores.
La regla mas clara que he escuchado: "Grid es para layout. Flexbox es para alineacion." Es una simplificacion, pero te guiara correctamente la mayor parte del tiempo.
Usar el Generador CSS Grid
Si estas construyendo un layout de cuadricula y quieres ver el resultado antes de confirmarlo en codigo, el Generador CSS Grid en ToolBox Hubs vale la pena abrirlo. Puedes establecer el numero de columnas y filas, ajustar el espacio, configurar visualmente los tamanos de columnas y filas, y obtener exactamente el CSS para pegar en tu proyecto.
Es particularmente util cuando trabajas con grid-template-areas: visualizar que areas abarcan que celdas es mucho mas facil con una herramienta visual que mirando el codigo. Configuras el layout una vez, copias el CSS y lo insertas. Mas rapido que escribirlo a mano, y una buena forma de probar rapidamente una idea de layout antes de construirla.
Soporte de navegadores y advertencias reales
Grid tiene un fuerte soporte de navegadores: todos los navegadores modernos tienen soporte completo desde 2017. No necesitas prefijos de proveedor. No necesitas un polyfill. Escribelo y lanzalo.
La unica advertencia real: Internet Explorer 11. IE 11 tiene una implementacion Grid mas antigua (basada en un borrador de especificacion temprano) usando propiedades con prefijo -ms- que son en gran medida incompatibles con la sintaxis Grid moderna. Si tus analiticas muestran trafico IE 11 que te importa, el uso de Grid necesita consideracion cuidadosa o una solucion de respaldo.
Para todos los que no admiten IE 11: que honestamente somos la mayoria ahora: Grid esta listo para produccion sin advertencias.
Una propiedad a tener en cuenta: subgrid. Permite que las cuadriculas secundarias hereden y participen en las definiciones de pistas de la cuadricula principal, lo cual es util para alinear contenido anidado. Safari agrego soporte en 2023, Chrome a finales de 2023. A principios de 2026 el soporte es solido en todos los navegadores, pero si construyes en proyectos con navegadores mas antiguos en el alcance, verifica tus objetivos especificos.
Las propiedades que realmente usaras
Despues de trabajar con Grid en multiples proyectos, estas son las propiedades a las que recurro mas:
/* La definicion central */
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
grid-template-rows: auto;
/* Areas con nombre para layouts complejos */
grid-template-areas: 'header' 'sidebar main' 'footer';
/* Colocar elementos */
grid-column: span 2;
grid-row: span 2;
/* O colocacion explicita */
grid-column: 1 / 3; /* comienza en la linea 1, termina en la linea 3 */
grid-row: 2 / 4;
/* Espaciado */
gap: 24px;
column-gap: 24px;
row-gap: 16px;
Las propiedades de cuadricula implicitas (grid-auto-rows, grid-auto-columns) tambien valen la pena conocer. Cuando los elementos se colocan automaticamente en filas que no se definieron explicitamente, grid-auto-rows establece su altura:
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 200px; /* todas las filas colocadas automaticamente tienen 200px de alto */
}
Y si quieres que los elementos colocados automaticamente llenen columnas en lugar de filas, grid-auto-flow: column invierte la direccion de colocacion.
Lo que se aclaro para mi
El momento en que Grid dejo de sentirse intimidante fue cuando deje de intentar memorizar cada propiedad e interiorice tres cosas:
- Defines columnas y filas en el contenedor, no en los elementos.
- La unidad
frdistribuye el espacio libre proporcionalmente. repeat(auto-fill, minmax(min, 1fr))es el patron para cuadriculas responsivas.
Todo lo demas: areas con nombre, extension, colocacion explicita, puedes buscarlo segun sea necesario. Pero esos tres conceptos te llevan a traves del 80% del uso real de Grid.
CSS Grid es una de esas herramientas que parece hacer el trabajo por ti una vez que la entiendes. Un layout que habria requerido 50 lineas de flotantes o flexbox profundamente anidado en 2015 ahora toma 10 lineas de Grid. Esa es una mejora real en la calidad de vida, y despues de un tiempo te costara recordar como era el layout antes de el.