CSS Grid desde cero
Aprende a crear diseños web avanzados con CSS Grid: un sistema de layout bidimensional que te permite controlar filas y columnas con precisión. Domina conceptos como fracciones, minmax, auto-fill, áreas de grid y líneas de colocación.
- ¿Qué es CSS Grid?
- ¿Cómo funciona CSS Grid?
- Conceptos clave: contenedor de grid & elemento de grid
- Propiedades del contenedor
- Propiedades de los elementos
- Unidad fr vs auto vs valor fijo
- Ejemplo básico
- Pistas implícitas vs explícitas
- auto-fill vs. auto-fit
- Demo: colocación con líneas de Grid
- Demo: uso de áreas de Grid
- Comparativa vs Flexbox
- Gotchas comunes
- Recursos
¿Qué es CSS Grid?
CSS Grid Layout es un sistema de diseño bidimensional en CSS que permite definir filas y columnas de forma explícita, ofreciendo control total del layout sin recurrir a hacks.
¿Cómo funciona CSS Grid?
Cuando aplicas display: grid; (o inline-grid) a un contenedor, sus hijos directos se convierten en elementos de grid que se sitúan en pistas explícitas o pistas implícitas según tus definiciones.
Conceptos clave: contenedor de grid & elemento de grid
- Contenedor de grid: elemento con
display: grid;oinline-grid. - Elemento de grid: hijo directo del contenedor.
- Ejes:
- El eje de filas (row axis) es horizontal.
- El eje de columnas (column axis) es vertical.
Propiedades del contenedor
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
gap: 16px;
grid-auto-flow: row;
}
-
repeat: repite una definición de pista un número de veces o de forma automática./* Equals to: 1fr 1fr 1fr */ grid-template-columns: repeat(3, 1fr); -
minmax: define el tamaño mínimo y máximo de una pista (track) grid./* 100px is the minimum size and 1 fraction is the maximum size: it will grow taking all the remaining space */ grid-template-columns: minmax(100px, 1fr); -
grid-template-columns/rows: define tamaños de tracks (px, fr, %, auto). -
grid-template-areas: nombre y colocación de regiones. -
gap: espacio unificado entre filas y columnas. -
grid-auto-flow: controla ubicación en pistas implícitas. -
justify-content: alinea el contenedor de pistas a lo largo del eje inline (horizontal en LTR). -
align-content: alinea el contenedor de pistas a lo largo del eje block (vertical).
Propiedades de los elementos
.item {
grid-column: 1 / span 2; /* span means take N tracks */
grid-row: 2 / 3;
justify-self: center;
align-self: start;
place-self: end stretch;
}
grid-column/grid-row: abreviatura de start/end.justify-self/align-self: alineación por elemento.place-self: shorthand para ambos.
Unidad fr vs auto vs valor fijo
En CSS Grid elige la unidad de tamaño según el comportamiento deseado:
fr(fractional unit): reparte el espacio sobrante en proporción. Ideal para diseños fluidos.auto: ajusta la pista al tamaño del contenido.- Valor fijo (
px,%,rem, etc.): tamaño rígido.
<div class="grid-fr-auto-fixed">
<div class="box">A</div>
<div class="box">B</div>
<div class="box">C</div>
</div>
.grid-fr-auto-fixed {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
grid-template-rows: auto 100px auto;
gap: 8px;
}
.box { background: #4a90e2; color: #fff; padding: 16px; text-align: center; }
Ejemplo básico
<div class="gallery">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
.gallery {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
gap: 12px;
}
.item {
background: #4a90e2;
color: #fff;
padding: 20px;
text-align: center;
}
Pistas implícitas vs explícitas
/* Container without define tracks */
.wrapper {
display: grid;
grid-auto-columns: 100px;
grid-auto-rows: 50px;
gap: 8px;
}
.wrapper > div {
/* Each new element creates a new track... */
}
- Explícitas: definimos con
grid-template-.... - Implícitas: generadas automáticamente según
grid-auto-....
auto-fill vs. auto-fit
Debes usar una combinación con minmax() y unidades flexibles, como fr o % y por, supuesto el escenario debe tener menos items que tracks disponibles.
auto-fill: crea tracks vacíos cuando sobra espacio.auto-fit: colapsa tracks vacíos y estira items.
.grid-fill {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
gap: 10px;
}
.grid-fit {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 10px;
}
Demo: colocación con líneas de Grid
<div class="layout-lines">
<header>Header</header>
<main>Main content</main>
<aside>Sidebar</aside>
<footer>Footer</footer>
</div>
.layout-lines {
border: 1px solid;
display: grid;
grid-template-columns: 200px 1fr;
grid-template-rows: auto 1fr auto;
gap: 12px;
padding: 1rem;
}
.layout-lines > * {
background-color: lightgray;
}
.layout-lines > header {
grid-column: 1 / -1;
}
.layout-lines > main {
grid-column: 1 / 2;
grid-row: 2 / 3;
}
.layout-lines > aside {
grid-column: 2 / 3;
grid-row: 2 / 3;
}
.layout-lines > footer {
grid-column: 1 / -1;
grid-row: 3 / 4;
}
Demo: uso de áreas de Grid
<div class="layout-areas">
<header>Header</header>
<nav>Navigation</nav>
<article>Article body</article>
<aside>Sidebar</aside>
<footer>Footer</footer>
</div>
.layout-areas {
border: 1px solid;
display: grid;
grid-template-columns: 1fr 3fr 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header header"
"nav article aside"
"footer footer footer";
gap: 16px;
padding: 1rem;
}
.layout-areas > * {
background-color: lightgray;
}
.layout-areas > header { grid-area: header; }
.layout-areas > nav { grid-area: nav; }
.layout-areas > article { grid-area: article; }
.layout-areas > aside { grid-area: aside; }
.layout-areas > footer { grid-area: footer; }
Comparativa vs Flexbox
| Característica | Flexbox | Grid |
|---|---|---|
| Dimensiones | Unidimensional (eje row o column) | Bidimensional (filas + columnas) |
| Especificación | Alineación y distribución de ítems | Definir explicitamente tracks y áreas |
| Control | Menos control en el otro eje | Control total en ambos ejes |
| Uso ideal | Layouts lineales (nav, botones) | Layouts complejos de página |
| Redimensionado | Items crecen con flex-grow |
Tracks flexibles con fr y minmax() |
Gotchas comunes
- Subgrid: solo Firefox soporta hoy.
- Margin collapse no aplica dentro de grids.