Saltar al contenido
schedule 15 min CSS

Grid

Flexbox es genial para una dimensión (fila o columna). Pero cuando necesitas controlar filas y columnas a la vez — un dashboard, una galería de imágenes, un layout de página — Grid es imbatible. Es el sistema de layout más potente de CSS y en 2026 tiene superpoderes como subgrid y auto-fit.

Tu primer grid

.product-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);  /* 3 columnas iguales */
    gap: 1.5rem;
}

Con una sola línea de grid-template-columns tienes 3 columnas iguales. 1fr significa "una fracción del espacio disponible". Tres 1fr = tres partes iguales.

<div class="product-grid">
    <article class="card">Nike Air Max 90</article>
    <article class="card">Adidas Samba OG</article>
    <article class="card">New Balance 550</article>
    <article class="card">Puma Suede</article>
    <article class="card">Converse Chuck 70</article>
    <article class="card">Vans Old Skool</article>
</div>

Los 6 elementos se distribuyen automáticamente en 3 columnas y 2 filas. No necesitas filas explícitas — Grid las crea implícitamente.

Columnas: más allá de repeat

/* Columnas con tamaños diferentes */
.layout {
    display: grid;
    grid-template-columns: 280px 1fr;         /* Sidebar fija + contenido flexible */
}

/* Más variaciones */
.dashboard {
    grid-template-columns: 250px 1fr 300px;   /* Sidebar + Main + Panel lateral */
}

/* Mezclar unidades */
.pricing {
    grid-template-columns: repeat(3, minmax(250px, 1fr));  /* Mín 250px, máx 1fr */
}

auto-fit y auto-fill: grids responsivas sin media queries

Este es el truco más poderoso de Grid:

.card-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    gap: 1.5rem;
}

Esto crea un grid que:

  • Pone tantas columnas como quepan.
  • Cada columna tiene mínimo 280px y máximo 1fr.
  • Si la pantalla se estrecha, reduce columnas automáticamente.
  • Cero media queries. Es responsive por defecto.

La diferencia entre auto-fit y auto-fill: con pocos elementos, auto-fit estira las columnas para llenar el espacio, mientras que auto-fill deja columnas vacías. Casi siempre quieres auto-fit.

Grid template areas: layout visual

Puedes definir el layout con un mapa visual de nombres:

.page-layout {
    display: grid;
    grid-template-areas:
        "header  header"
        "sidebar main"
        "footer  footer";
    grid-template-columns: 280px 1fr;
    grid-template-rows: auto 1fr auto;
    min-height: 100dvh;
}

.header  { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main    { grid-area: main; }
.footer  { grid-area: footer; }
<div class="page-layout">
    <header class="header">Vinyl Paradise</header>
    <aside class="sidebar">Navegación</aside>
    <main class="main">Contenido principal</main>
    <footer class="footer">© 2026</footer>
</div>

Es como dibujar el layout en ASCII. Cada string es una fila, cada palabra es una celda. Los nombres que se repiten indican que ese área ocupa varias columnas.

Posicionar elementos en el grid

Puedes colocar elementos en posiciones específicas usando líneas de grid:

.featured-card {
    grid-column: 1 / 3;     /* Ocupa de la línea 1 a la 3 (2 columnas) */
    grid-row: 1 / 2;        /* Primera fila */
}

/* Shorthand con span */
.wide-card {
    grid-column: span 2;    /* Ocupa 2 columnas desde donde esté */
}

.tall-card {
    grid-row: span 2;       /* Ocupa 2 filas */
}

Filas implícitas y auto-rows

.gallery {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    grid-auto-rows: 200px;    /* Todas las filas generadas miden 200px */
    gap: 1rem;
}

/* Filas con tamaño mínimo pero flexibles */
.content-grid {
    grid-auto-rows: minmax(100px, auto);  /* Mín 100px, crece con el contenido */
}

Subgrid: heredar el grid del padre

Subgrid es relativamente nuevo y resuelve un problema real: que los hijos se alineen con el grid del abuelo.

.card-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 1.5rem;
}

.card {
    display: grid;
    grid-template-rows: subgrid;   /* Hereda las filas del padre */
    grid-row: span 3;              /* Ocupa 3 filas del grid padre */
}

/* Ahora el título, contenido y precio de todas las cards
   están alineados entre sí, aunque el texto tenga diferentes longitudes */

Sin subgrid, si una card tiene un título de 2 líneas y otra de 1, los precios quedan a diferentes alturas. Con subgrid, todo se alinea perfectamente.

Alinear contenido dentro del grid

.grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);

    /* Alinear todos los items */
    justify-items: center;    /* Horizontal dentro de cada celda */
    align-items: center;      /* Vertical dentro de cada celda */

    /* O ambos a la vez */
    place-items: center;
}

/* Alinear el grid entero dentro de su contenedor */
.grid {
    justify-content: center;  /* El grid como bloque, centrado horizontal */
    align-content: center;    /* El grid como bloque, centrado vertical */
    place-content: center;    /* Ambos */
}

¿Flexbox o Grid?

Usa Flexbox Usa Grid
Navbar (una dimensión) Layout de página (header, sidebar, main)
Botones en fila Galería de imágenes
Centrar un elemento Dashboard con paneles
Alinear items dentro de una card Cards alineadas con subgrid
El contenido define el tamaño El contenedor define el tamaño

En la práctica, los usas juntos constantemente. Grid para el layout general, flexbox para componentes internos.

code

Crea un dashboard con CSS Grid

Medio schedule 20 min

Construye el layout de un dashboard de analytics para una tienda online:

  • Un layout de página con grid-template-areas: header arriba (full width), sidebar a la izquierda, main a la derecha, footer abajo (full width)
  • Dentro de main, una grid de 4 cards de estadísticas con repeat(auto-fit, minmax(250px, 1fr))
  • Una card "destacada" que ocupe grid-column: span 2
  • Debajo, un grid de 3 gráficas (placeholder con background de color y altura fija) usando grid-template-columns: 2fr 1fr 1fr (la primera más ancha)
  • Usa gap en todo, nunca márgenes para separar elementos del grid
lightbulb Pistas

No necesitas gráficas reales — usa divs con un background de color y min-height: 200px como placeholder. Para el layout de página, grid-template-rows: auto 1fr auto hace que el main ocupe todo el espacio vertical disponible.

Newsletter

Recibe nuevos cursos, actualizaciones, artículos del blog y promociones en tu correo.