Duración estimada: 2 horas
Objetivos de aprendizaje
- Activar CSS Grid en un contenedor con display: grid
- Definir columnas y filas con grid-template-columns y grid-template-rows
- Usar la unidad fr para distribuciones proporcionales
- Colocar ítems en celdas específicas con grid-column y grid-row
- Entender la diferencia entre Grid y Flexbox y cuándo usar cada uno
Sesión 11 - Introducción a CSS Grid
Contenidos de la Sesión
En esta sesión se ha introducido CSS Grid Layout, el sistema de maquetación bidimensional de CSS. A diferencia de Flexbox (que trabaja en un solo eje a la vez), Grid permite controlar simultáneamente filas y columnas.
Se ha visto únicamente la declaración imperativa de la grid: definir explícitamente columnas y filas y posicionar los elementos con grid-column-start/end y grid-row-start/end.
Note
En la próxima sesión se verá la declaración declarativa: grid-template-areas y grid-area con nombres de área.
Los ejemplos comentados en clase se encuentran en la carpeta grid-examples/.
1. display: grid — Activar el modelo Grid
Aplicar display: grid a un contenedor convierte a todos sus hijos directos en grid items. El contenedor pasa a llamarse grid container.
.contenedor {
display: grid;
}
Por defecto, sin ninguna otra propiedad, los items se colocan uno debajo del otro en una sola columna (igual que el flujo normal de bloque).
2. grid-template-columns — Definir las columnas
grid-template-columns define el número y el tamaño de las columnas de la grid. Cada valor corresponde a una columna.
.contenedor {
display: grid;
grid-template-columns: 200px 200px 200px; /* 3 columnas de 200px */
}
La unidad fr (fracción)
La unidad fr representa una fracción del espacio disponible en el contenedor. Es la unidad más habitual en Grid porque crea layouts flexibles.
.contenedor {
grid-template-columns: 1fr 1fr 1fr; /* 3 columnas iguales */
}
.contenedor-mixto {
grid-template-columns: 1fr 3fr; /* col 1 ocupa 1/4, col 2 ocupa 3/4 */
}
La función repeat()
repeat() evita repetir el mismo valor varias veces.
/* estas dos declaraciones son equivalentes */
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-template-columns: repeat(4, 1fr);
repeat() también acepta un patrón como segundo argumento:
/* repite el patrón "1fr 3fr" dos veces: 1fr 3fr 1fr 3fr */
grid-template-columns: repeat(2, 1fr 3fr);
/* patrón complejo del ejemplo de clase */
grid-template-columns: repeat(2, 1fr 3fr) 0.5fr 1fr;
/* resultado: 1fr 3fr 1fr 3fr 0.5fr 1fr → 6 columnas */
3. grid-template-rows — Definir las filas
grid-template-rows funciona igual que grid-template-columns pero para las filas.
body {
display: grid;
grid-template-columns: 6fr 1fr;
grid-template-rows: 60px 1fr 60px; /* header 60px, main flexible, footer 60px */
}
Tip
Combinando grid-template-columns y grid-template-rows con valores en fr y px se puede crear el layout clásico de página (header, main + sidebar, footer) con muy pocas líneas de CSS.
4. grid-auto-rows — Altura de las filas implícitas
Cuando hay más items de los que caben en las filas definidas con grid-template-rows, Grid crea filas implícitas automáticamente. grid-auto-rows controla el tamaño de esas filas.
section {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-auto-rows: 200px; /* todas las filas implícitas tendrán 200px de alto */
}
5. gap — Espaciado entre celdas
gap (antes llamado grid-gap) define el espacio entre filas y columnas de la grid. Funciona igual que en Flexbox.
.contenedor {
gap: 1em; /* mismo espacio en filas y columnas */
gap: 1em 2em; /* row-gap: 1em, column-gap: 2em */
row-gap: 1em;
column-gap: 2em;
}
6. place-items — Alineación de los items en sus celdas
place-items es la propiedad shorthand que combina align-items (eje de bloque/vertical) y justify-items (eje en línea/horizontal).
.contenedor {
place-items: center; /* centra en ambos ejes */
place-items: stretch; /* estira para ocupar toda la celda (valor por defecto) */
place-items: start end; /* align-items: start, justify-items: end */
}
| Valor | Descripción |
|---|---|
stretch | El item ocupa toda la celda (valor por defecto) |
start | El item se alinea al inicio de la celda |
end | El item se alinea al final de la celda |
center | El item se centra en la celda |
7. Posicionamiento de items: grid-column-start / grid-column-end
Por defecto cada item ocupa una sola celda. Para que un item ocupe varias columnas se usan grid-column-start y grid-column-end. Los valores son números de línea (no de columna).
Important
Las líneas de la grid empiezan en 1 (no en 0). Una grid de 4 columnas tiene 5 líneas verticales (1 al 5).
/* ocupa desde la línea 1 hasta la línea 3 → 2 columnas */
.item {
grid-column-start: 1;
grid-column-end: 3;
}
Ejemplo del ejemplo de clase — imagen que ocupa las dos primeras columnas:
section img {
grid-column-start: 1;
grid-column-end: 3;
}
Valores negativos
El valor -1 hace referencia a la última línea de la grid (sea cual sea el número de columnas). Es muy útil para que un elemento ocupe toda la anchura.
header {
grid-column-start: 1;
grid-column-end: -1; /* llega hasta el final, sin importar cuántas columnas haya */
}
8. Posicionamiento de items: grid-row-start / grid-row-end
Funcionan igual que sus equivalentes de columna, pero para las filas.
.card.important {
grid-column-start: 1;
grid-column-end: 4;
grid-row-start: 5;
grid-row-end: 7;
}
9. La palabra clave span
En lugar de indicar la línea de fin, se puede usar span N para indicar cuántas pistas (columnas o filas) debe abarcar el item.
/* estas dos declaraciones son equivalentes */
.item {
grid-column-start: 4;
grid-column-end: 6;
}
.item {
grid-column-start: 4;
grid-column-end: span 2; /* abarca 2 columnas a partir de la línea 4 */
}
10. Shorthand grid-column y grid-row
Las propiedades start y end se pueden escribir de forma abreviada con una barra /:
/* longhand */
.item {
grid-column-start: 4;
grid-column-end: span 2;
}
/* shorthand equivalente */
.item {
grid-column: 4 / span 2;
}
/* otros ejemplos de shorthand */
header {
grid-column: 1 / -1; /* de la primera a la última línea */
}
footer {
grid-column: 1 / -1;
}
11. Shorthand grid-area (4 valores)
grid-area con 4 valores es la forma más compacta de posicionar un item. El orden es:
grid-area: row-start / column-start / row-end / column-end;
/* longhand */
.item {
grid-row-start: 1;
grid-column-start: 1;
grid-row-end: 2;
grid-column-end: -1;
}
/* shorthand equivalente */
.item {
grid-area: 1 / 1 / 2 / -1;
}
Note
En la próxima sesión veremos otro uso de grid-area: asignar un nombre a un elemento para colocarlo en un área definida con grid-template-areas.
12. Ejemplo: layout de página completa con Grid
El archivo pagina2.html muestra cómo usar Grid para el layout clásico de una página (header, main, aside, footer):
body {
height: 100vh;
display: grid;
grid-template-columns: 6fr 1fr; /* main ocupa 6 partes, aside 1 parte */
grid-template-rows: 60px 1fr 60px; /* header, contenido, footer */
}
header {
grid-column-start: 1;
grid-column-end: -1; /* el header ocupa toda la anchura */
}
footer {
grid-column-start: 1;
grid-column-end: -1; /* el footer también ocupa toda la anchura */
}
Resultado visual:
┌─────────────────────────────────────┐ ← header (full width)
├──────────────────────────┬──────────┤
│ main (6fr) │ aside(1fr)│ ← fila central (1fr)
├──────────────────────────┴──────────┤
│ footer (full width) │ ← footer (full width)
└─────────────────────────────────────┘
13. Estructura de los ejemplos de la sesión
grid-examples/
├── index.html — Grid con múltiples columnas, posicionamiento y span
├── style.css — Estilos del ejemplo principal
├── pagina2.html — Layout de página completa con Grid
├── style2.css — Estilos del layout de página
└── reset.css — Reset CSS compartido
Resumen
En esta sesión hemos introducido:
- ✅
display: gridpara activar el modelo Grid en un contenedor - ✅
grid-template-columnspara definir el número y tamaño de columnas - ✅ La unidad
fr(fracción del espacio disponible) - ✅ La función
repeat()para definir patrones de columnas de forma compacta - ✅
grid-template-rowspara definir filas de altura fija o flexible - ✅
grid-auto-rowspara controlar el tamaño de las filas implícitas - ✅
gappara el espaciado entre celdas de la grid - ✅
place-itemspara alinear los items dentro de sus celdas - ✅
grid-column-start/grid-column-endpara posicionar items en columnas - ✅
grid-row-start/grid-row-endpara posicionar items en filas - ✅ La palabra clave
spanpara indicar cuántas pistas debe abarcar un item - ✅ Los shorthands
grid-column,grid-rowygrid-area(4 valores) - ✅ Valores negativos de línea (
-1= última línea)
Lo más importante:
Important
- Los números de línea en Grid empiezan en 1, y el valor -1 representa la última línea
- La unidad
frreparte el espacio disponible de forma proporcional, comoflex-grow span Nindica cuántas columnas/filas abarca el item, sin necesidad de conocer la línea de fingrid-area: rs / cs / re / cees el shorthand de 4 valores para posicionar un item completamente- Con Grid se puede maquetar el layout completo de una página (header, main, sidebar, footer) con muy pocas líneas
Recursos Adicionales
- MDN - CSS Grid Layout
- MDN - grid-template-columns
- MDN - grid-template-rows
- MDN - grid-column
- MDN - grid-row
- MDN - grid-area
- CSS Tricks - A Complete Guide to CSS Grid
- Josh Comeau - An Interactive Guide to CSS Grid
- Grid Garden — Juego para practicar CSS Grid
- layoutit — Herramienta visual para diseñar grids
Ejercicios prácticos
-
1. Layout de revista
Diseña la portada de una revista con CSS Grid: titular grande arriba, tres columnas de noticias en el centro y un pie de página.
-
2. Galería fotográfica
Crea una galería con grid-template-columns: repeat(3, 1fr) donde algunas fotos ocupan dos columnas (grid-column: span 2).
Checklist final
Al terminar esta sesión deberías ser capaz de:
- Sé activar Grid con display: grid
- Puedo definir columnas con repeat() y la unidad fr
- Sé posicionar un ítem en una celda concreta con grid-column y grid-row
- Entiendo cuándo usar Grid (bidimensional) y cuándo Flexbox (unidimensional)
- Sé usar gap para añadir separación entre filas y columnas