¿Qué es CSS Grid y por qué es revolucionario?
CSS Grid Layout representa un cambio de paradigma en el diseño web. Antes de su llegada, crear layouts complejos requería hacks, floats o frameworks externos. Grid nos ofrece un sistema nativo y potente que maneja directamente el espacio bidimensional de nuestra página.
Conceptos fundamentales de CSS Grid
Grid Container e Grid Items
Todo comienza con dos elementos básicos:
- Grid Container: El elemento padre que contiene el grid. Se crea aplicando
display: gridodisplay: inline-grid. - Grid Items: Los elementos hijos directos del container que se colocan automáticamente en el grid.
.contenedor {
display: grid;
}
/* Los hijos-directos son grid-items automáticamente */
.contenedor > div {
/* Estilos para cada item */
}
Grid Lines, Tracks y Cells
| Concepto | Descripción |
|---|---|
| Grid Lines | Líneas horizontales y verticales que dividen el grid |
| Grid Track | El espacio entre dos líneas adyacentes (filas o columnas) |
| Grid Cell | La unidad más pequeña del grid, la intersección de fila y columna |
| Grid Area | Cualquier región rectangular compuesta por múltiples cells |
Definiendo el grid: filas y columnas
grid-template-columns y grid-template-rows definen la estructura del grid. Puedes usar unidades fijas, porcentuales, o la unidad fr (fracción del espacio disponible)..layout {
display: grid;
/* 3 columnas de igual ancho */
grid-template-columns: 1fr 1fr 1fr;
/* Equivalente usando repeat() */
grid-template-columns: repeat(3, 1fr);
/* Filas con diferentes tamaños */
grid-template-rows: auto 200px 100px;
/* Espaciado entre celdas */
gap: 20px;
}
repeat(auto-fill, minmax(250px, 1fr)) para crear grids responsivos automáticos sin media queries. El navegador calcula cuántas columnas caben según el espacio disponible.La unidad fr (fracción)
La unidad fr representa una fracción del espacio disponible después de reservar espacio para elementos fijos:
.ejemplo {
grid-template-columns: 200px 1fr 2fr;
/*
* 200px para primera columna
* Resto del espacio se divide en 3 partes
* Columna 2 ocupa 1/3
* Columna 3 ocupa 2/3
*/
}
Posicionando elementos en el grid
Líneas de cuadrícula
Cada línea tiene un número positivo (de izquierda a derecha, arriba abajo) y negativo (de derecha a izquierda, abajo arriba):
.item-especial {
/* Span desde línea 1 a línea 3 */
grid-column: 1 / 3;
grid-row: 1 / 2;
/* También puedes usar span */
grid-column: 1 / span 2;
}
- Identifica las líneas: Determina entre qué líneas quieres posicionar tu elemento.
- Usa las propiedades: grid-column y grid-row para definir el span.
- Ajusta el orden: La propiedad order funciona como en Flexbox para reordenar visualmente.
Auto-placement automático
Por defecto, los items se colocarán automáticamente siguiendo el orden del DOM:
.grid-auto {
display: grid;
grid-template-columns: repeat(3, 1fr);
/* Los items se colocan automáticamente en celdas vacías */
grid-auto-flow: row; /* Por defecto */
}
/* Cambiar a columnas cuando hay más items */
.grid-auto-dense {
grid-auto-flow: row dense;
}
Grid Areas: diseño declarativo
Las grid areas son mi característica favorita. Te permiten definir el layout visualmente usando nombres:
.layout-blog {
display: grid;
grid-template-columns: 250px 1fr 200px;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
min-height: 100vh;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.aside { grid-area: aside; }
.footer { grid-area: footer; }
.layout-responsivo {
display: grid;
grid-template-columns: 1fr;
grid-template-areas:
"header"
"main"
"sidebar"
"footer";
gap: 1rem;
}
@media (min-width: 768px) {
.layout-responsivo {
grid-template-columns: 250px 1fr;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
}
}
@media (min-width: 1024px) {
.layout-responsivo {
grid-template-columns: 250px 1fr 200px;
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
}
}
Alineación en CSS Grid
Grid ofrece control total sobre la alineación tanto del contenedor como de los items:
Alineación del contenedor
.grid-container {
display: grid;
grid-template-columns: repeat(3, 200px);
grid-template-rows: 200px 200px;
min-height: 500px;
/* Justificar contenido en el eje principal */
justify-content: center; /* start, end, center, space-between, space-around, space-evenly */
/* Alinear contenido en el eje secundario */
align-content: space-between; /* start, end, center, space-between, space-around, space-evenly */
}
Alineación de items
.grid-item {
/* Alinear un item específico */
justify-self: center; /* start, end, center, stretch */
align-self: end; /* start, end, center, stretch */
/* O aplicar a todos los items con place-items */
place-items: center; /* shorthand para align-items + justify-items */
}
.grid-container {
place-items: start center;
}
Ejemplo práctico: Dashboard moderno
Apliquemos todo lo aprendido creando un dashboard profesional:
.dashboard {
display: grid;
grid-template-columns: 260px 1fr;
grid-template-rows: 70px 1fr 60px;
grid-template-areas:
"nav nav"
"sidebar main"
"footer footer";
min-height: 100vh;
gap: 0;
}
.nav {
grid-area: nav;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
display: flex;
align-items: center;
padding: 0 2rem;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.sidebar {
grid-area: sidebar;
background: #1a1a2e;
padding: 2rem 1.5rem;
color: #eee;
}
.main-content {
grid-area: main;
padding: 2rem;
background: #f5f6fa;
overflow-y: auto;
}
.footer {
grid-area: footer;
background: #16213e;
color: #aaa;
display: flex;
align-items: center;
justify-content: center;
padding: 0 2rem;
}
/* Cards dentro del main */
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 1.5rem;
margin-bottom: 2rem;
}
.stat-card {
background: white;
padding: 1.5rem;
border-radius: 12px;
box-shadow: 0 4px 15px rgba(0,0,0,0.08);
transition: transform 0.2s, box-shadow 0.2s;
}
.stat-card:hover {
transform: translateY(-3px);
box-shadow: 0 8px 25px rgba(0,0,0,0.12);
}
content: size para que el navegador calcule tracks implícitos automáticamente. Para grids muy grandes, considera grid-template-columns: repeat(100, 1fr) y usa JavaScript para renderizado virtual.Grid vs Flexbox: ¿cuándo usar cada uno?
| Escenario | Recomendación |
|---|---|
| Layout principal de página | CSS Grid |
| Componentes pequeños (nav, cards) | Flexbox |
| Galería de imágenes uniforme | CSS Grid |
| Alinear un elemento en un espacio | Flexbox |
| Layouts de una dimensión | Flexbox |
| Layouts de dos dimensiones | CSS Grid |
| Distribuir espacio entre items | Ambos son válidos |
La mejor práctica es usar ambos sistemas en armonía. Grid para la estructura macro, Flexbox para componentes y detalles de alineación. No son competidores, son complementos.
Subgrid: el futuro es ahora
CSS Subgrid permite que elementos nested hereden las líneas del grid padre:
.card {
display: grid;
grid-row: span 4;
grid-template-rows: subgrid; /* Hereda las líneas del padre */
}
/* El header, body y footer del card se alinearán
perfectamente con los demás elementos del layout */
Errores comunes y cómo evitarlos
- Olvidar el contenedor: Sin
display: griden el padre, nada funciona. Es el error más frecuente. - Confundir justify y align: Recuerda: justify = inline (horizontal), align = block (vertical).
- Usar px para todo: Mezcla unidades:
frpara flexibilidad,pxpara fijos,autopara contenido. - Ignorar el gap en bordes: El gap no agrega espacio externo. Usa padding en el contenedor si necesitas márgenes externos.
- Sobreposicionar items: Grid placement puede solapar elementos. Verifica siempre visualmente.
¿Cuál es la diferencia principal entre grid-template-columns: 1fr 1fr y grid-template-columns: repeat(2, 1fr)?
- A) No hay diferencia, ambos crean dos columnas iguales
- B) 1fr 1fr es más rápido en renderizado
- C) repeat() permite usar funciones adicionales como auto-fill
- D) Son equivalentes pero 1fr 1fr tiene mejor soporte
Resumen y próximos pasos
CSS Grid transformó el desarrollo frontend moderno. Ahora puedes crear layouts que antes requerían JavaScript o frameworks pesados. Practica con proyectos reales:
- Crea un layout de blog con header, sidebar, main y footer
- Implementa una galería de productos responsive
- Diseña un dashboard con múltiples widgets
- Experimenta con grid anidado y subgrid