Free

CSS Grid desde cero

Activar audio

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?

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; o inline-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.

Recursos

Proyectos donde poner en práctica CSS Grid desde cero

Juan Andrés Núñez

Juan Andrés Núñez

Ingeniero Frontend Senior. Especialista en Vue.js. Speaker. Docente profesional. Estoico.