Skip to content

8. Grid Layout

CSS Grid Layout es un sistema de diseño bidimensional que permite crear layouts complejos con filas y columnas de manera simple y poderosa.


CSS Grid permite:

  • ✅ Crear layouts bidimensionales (filas y columnas)
  • ✅ Controlar el tamaño y posición de elementos
  • ✅ Crear diseños responsivos sin media queries
  • ✅ Superponer elementos fácilmente
  • ✅ Alinear contenido en ambos ejes
.contenedor {
display: grid; /* Activa Grid */
}
/* O en línea */
.contenedor-inline {
display: inline-grid; /* Grid inline */
}

📐 Grid Template - Definir filas y columnas

Section titled “📐 Grid Template - Definir filas y columnas”

grid-template-columns - Define las columnas

Section titled “grid-template-columns - Define las columnas”

Controla el número y tamaño de las columnas.

.contenedor {
display: grid;
grid-template-columns: 200px 200px 200px; /* 3 columnas de 200px */
grid-template-columns: 1fr 1fr 1fr; /* 3 columnas iguales */
grid-template-columns: 1fr 2fr 1fr; /* Columna central más ancha */
grid-template-columns: repeat(3, 1fr); /* 3 columnas iguales (shorthand) */
}
.grid {
display: grid;
grid-template-columns: 200px 300px 200px; /* Píxeles fijos */
}

Características:

  • ✅ Tamaño fijo en píxeles
  • ❌ No se adapta al contenedor
  • 📱 Puede causar overflow en pantallas pequeñas

Controla el número y tamaño de las filas.

.contenedor {
display: grid;
grid-template-rows: 100px 200px 100px; /* 3 filas de diferentes alturas */
grid-template-rows: repeat(3, 150px); /* 3 filas de 150px */
grid-template-rows: auto 1fr auto; /* Primera y última auto, media flexible */
}
.grid {
display: grid;
grid-template-rows: 100px 200px 100px;
}
/* Características:
✅ Define la altura de cada fila
✅ Funciona igual que grid-template-columns
✅ Puede usar px, fr, auto, %, etc.
✅ Se puede combinar con grid-template-columns
*/

Controla el espaciado entre grid items (antes se llamaba grid-gap).

.contenedor {
display: grid;
gap: 20px; /* 20px entre filas y columnas */
gap: 10px 20px; /* 10px filas, 20px columnas */
row-gap: 10px; /* Solo entre filas */
column-gap: 20px; /* Solo entre columnas */
}
.grid {
display: grid;
gap: 20px; /* Espacio entre items */
}
/* Características:
✅ Espacio entre elementos (no en los bordes)
✅ Más simple que usar margin
✅ No afecta los bordes externos
✅ Puede ser diferente para filas y columnas
✅ Funciona también en Flexbox
*/

justify-items - Alinea items en el eje horizontal (inline)

Section titled “justify-items - Alinea items en el eje horizontal (inline)”

Controla cómo se alinean los items dentro de sus celdas en el eje horizontal.

.contenedor {
display: grid;
justify-items: start; /* Al inicio (izquierda) */
justify-items: end; /* Al final (derecha) */
justify-items: center; /* Centrado */
justify-items: stretch; /* Estirar (default) */
}

align-items - Alinea items en el eje vertical (block)

Section titled “align-items - Alinea items en el eje vertical (block)”

Controla cómo se alinean los items dentro de sus celdas en el eje vertical.

.contenedor {
display: grid;
align-items: start; /* Al inicio (arriba) */
align-items: end; /* Al final (abajo) */
align-items: center; /* Centrado */
align-items: stretch; /* Estirar (default) */
}
.grid {
display: grid;
justify-items: center; /* Horizontal */
align-items: center; /* Vertical */
}
/* Características:
✅ justify-items: Alineación horizontal dentro de la celda
✅ align-items: Alineación vertical dentro de la celda
✅ Afecta a TODOS los items del grid
✅ Los items pueden usar justify-self y align-self para sobrescribir
*/

🗺️ Áreas de Grid (grid-template-areas)

Section titled “🗺️ Áreas de Grid (grid-template-areas)”

grid-template-areas - Define áreas con nombres

Section titled “grid-template-areas - Define áreas con nombres”

Permite crear layouts complejos usando nombres descriptivos para las áreas.

.contenedor {
display: grid;
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }
.grid {
display: grid;
grid-template-columns: 200px 1fr 1fr;
grid-template-rows: 80px 1fr 60px;
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
}
/* Características:
✅ Nombres descriptivos para áreas
✅ Visualización clara del layout en el código
✅ Fácil de reorganizar
✅ Usa "." para celdas vacías
✅ Perfecto para layouts complejos
*/

Define un rango de tamaño para columnas o filas.

.contenedor {
display: grid;
grid-template-columns: minmax(200px, 1fr) minmax(300px, 2fr);
/* Mínimo 200px, máximo 1fr | Mínimo 300px, máximo 2fr */
}
.grid {
display: grid;
grid-template-columns: minmax(150px, 1fr) minmax(200px, 2fr);
}
/* Características:
✅ minmax(min, max) - Define rango de tamaño
✅ Evita que columnas sean muy pequeñas o muy grandes
✅ Perfecto para diseños responsivos
✅ Puede usar px, fr, %, auto, etc.
*/

auto-fit y auto-fill - Columnas automáticas

Section titled “auto-fit y auto-fill - Columnas automáticas”

Crean columnas automáticamente según el espacio disponible.

/* auto-fill: Crea todas las columnas posibles (incluso vacías) */
.grid-fill {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}
/* auto-fit: Crea solo las columnas necesarias y las expande */
.grid-fit {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
/* auto-fill: Mantiene columnas vacías */
.grid-fill {
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
/* Si hay espacio, crea columnas vacías */
}
/* auto-fit: Colapsa columnas vacías */
.grid-fit {
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
/* Si hay espacio, expande las columnas existentes */
}
/* Características:
✅ auto-fill: Crea todas las columnas posibles
✅ auto-fit: Solo columnas necesarias (más común)
✅ Perfecto para grids responsivos
✅ Se combina con minmax()
*/

Grid y Flexbox se complementan perfectamente. Usa Grid para el layout general y Flexbox para componentes internos.

🎨 Grid + Flexbox - Combinación perfecta
<div style="display: grid; grid-template-columns: 200px 1fr; grid-template-rows: 60px 1fr 50px; grid-template-areas: 'header header' 'sidebar main' 'footer footer'; gap: 10px; height: 350px; border: 2px solid purple; padding: 10px;">

<!-- Header con Flexbox -->
<div style="grid-area: header; background: #2c3e50; color: white; display: flex; justify-content: space-between; align-items: center; padding: 0 20px;">
  <strong>Logo</strong>
  <div style="display: flex; gap: 15px;">
    <span>Inicio</span>
    <span>Productos</span>
    <span>Contacto</span>
  </div>
</div>

<!-- Sidebar con Flexbox -->
<div style="grid-area: sidebar; background: #34495e; color: white; padding: 15px; display: flex; flex-direction: column; gap: 10px;">
  <div style="padding: 10px; background: rgba(255,255,255,0.1); border-radius: 4px;">📊 Dashboard</div>
  <div style="padding: 10px; background: rgba(255,255,255,0.1); border-radius: 4px;">📁 Archivos</div>
  <div style="padding: 10px; background: rgba(255,255,255,0.1); border-radius: 4px;">⚙️ Config</div>
</div>

<!-- Main con Grid interno -->
<div style="grid-area: main; background: #ecf0f1; padding: 15px; display: grid; grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); gap: 10px;">
  <div style="background: white; padding: 15px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); text-align: center;">
    <div style="font-size: 24px; font-weight: bold; color: #3498db;">42</div>
    <div style="font-size: 12px; color: #7f8c8d;">Users</div>
  </div>
  <div style="background: white; padding: 15px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); text-align: center;">
    <div style="font-size: 24px; font-weight: bold; color: #2ecc71;">128</div>
    <div style="font-size: 12px; color: #7f8c8d;">Sales</div>
  </div>
  <div style="background: white; padding: 15px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); text-align: center;">
    <div style="font-size: 24px; font-weight: bold; color: #e74c3c;">5</div>
    <div style="font-size: 12px; color: #7f8c8d;">Alerts</div>
  </div>
</div>

<!-- Footer con Flexbox -->
<div style="grid-area: footer; background: #2c3e50; color: white; display: flex; justify-content: center; align-items: center;">
  © 2024 - Todos los derechos reservados
</div>

</div>

<p><strong>🎯 Estrategia:</strong> Grid para layout principal, Flexbox para componentes internos.</p>


Ahora que dominas Grid Layout, puedes:

  • ✅ Crear layouts complejos sin frameworks
  • ✅ Diseños responsivos sin media queries
  • ✅ Combinar Grid y Flexbox eficientemente
  • ✅ Usar áreas nombradas para código más legible
🐝