Skip to content

CSS GRID Fundamentos

Aprende y descubre para qué es CSS Grid y cómo utilizarlo en tus próximos desarrollos web. Nunca fue tan genial maquetar layout con CSS nativo😍.

Objetivos

  • Comprender como trabajar con Grid.
  • Realizar una práctica para aterrizar lo aprendido.

Grid

  • Basic_Concepts mozilla
  • css-tricks
  • Con CSS grid vamos a poder crear cuadrículas, controlando la creación de columnas (colums) y filas (rows).
  • Tenemos propiedades para el contenedor (container) y sus elementos anidados (items).
  • Grid Lines: Nos servirán posteriormente para posicionar los elementos.

grid line by bluuweb

Fundamentos

  • Podemos diseñar la cuadrícula con las siguientes carácterísticas:
    • Tamaños fijos y flexibles.
    • Posicionar los elementos.
    • Control de alineación.
    • Control de contenido superpuesto.
  • Grid es una poderosa especificación que, cuando se combina con otras partes de CSS como flexbox, puede ayudarle a crear diseños que antes eran imposibles de construir en CSS. Todo comienza creando una cuadrícula en su contenedor de cuadrícula.
html
<main class="grid-container">
    <article class="grid-item">1</article>
    <article class="grid-item">2</article>
    <article class="grid-item">3</article>
    <article class="grid-item">4</article>
    <article class="grid-item">5</article>
    <article class="grid-item">6</article>
</main>
css
.grid-container {
  display: grid | inline-grid;
}

grid-template-[columns/rows]

css
.grid-container {
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 200px 200px;
}

Tamaños fijos y flexibles

  • Usted puede crear una cuadrícula con tamaños fijos, utilizando píxeles, por ejemplo.
  • También se puede crear una cuadrícula utilizando tamaños flexibles con porcentajes o con la nueva unidad de medida fr (fracción), diseñada para este propósito.
  • La nueva unidad fr representa una fracción del espacio disponible en el contenedor de la cuadrícula.
  • La siguiente definición de cuadrícula crearía tres vias con el mismo ancho, que se expanden y se encogen de acuerdo el espacio disponible.
css
.grid-container {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
}
  • También se puede mezclar con tamaños absolutos.
css
.grid-container {
    display: grid;
    grid-template-columns: 50px 1fr 1fr;
}

repeat

  • Las cuadrículas grandes con muchas vías o celdas pueden utilizar la función repeat().
  • Esta función puede ser usada en las propiedades CSS Grid grid-template-columns y grid-template-rows.
css
.grid-container {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
}

gap

  • Controla la separación entre columns y rows
css
.grid-container {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    row-gap: 10px;
    column-gap: 20px;
    /* gap: 10px 20px; */
}

Cuadrícula implícita y explícita

Siguiendo este ejemplo:

css
.grid-container {
    display: grid;
    gap: 10px 20px;
    grid-template-columns: repeat(3, 1fr);
    grid-template-rows: 100px;
}

vista grid implícito

  • La cuadrícula explícita, son las que nosotros definimos en grid-template-columns y grid-template-rows.
  • Debido a la cantidad de items, se necesitaba otra fila, por ende, dejamos que grid creará las siguientes filas. Estas filas se crean en la cuadrícula implícita.
  • Estas vías varían su tamaño automáticamente de forma predeterminada, así que ajustarán su tamaño basadas en el contenido dentro de ellas.
  • Por eso la segunda fila no se creó de 100px.

grid-auto-rows

  • También puede definir un tamaño para el conjunto de vías creadas en la cuadrícula implícita con las propiedades grid-auto-rows y grid-auto-columns.
css
.grid-container {
    display: grid;
    gap: 10px 20px;
    grid-template-columns: repeat(3, 1fr);
    grid-auto-rows: 100px;
}

minmax

Ahora si agregamos un texto:

html
<main class="grid-container">
    <article class="grid-item">1</article>
    <article class="grid-item">2</article>
    <article class="grid-item">3</article>
    <article class="grid-item">4</article>
    <article class="grid-item">
        Lorem ipsum dolor sit amet consectetur adipisicing elit. Maxime
        porro sint laudantium vero, doloribus vitae cumque dolorum
        dolores quisquam molestias a tempora consequuntur rerum illum?
        Debitis dolores optio nisi odio.
    </article>
    <article class="grid-item">6</article>
</main>

Podrá notar que este se desborda de su caja. Podemos solucionarlo con:

css
.grid-container {
    display: grid;
    gap: 10px 20px;
    grid-template-columns: repeat(3, 1fr);
    grid-auto-rows: minmax(100px, auto);
}
  • Las filas creadas automáticamente tendrán como mínimo de 100 píxeles de alto y un máximo de auto.
  • El uso de auto significa que el tamaño mirará el tamaño del contenido y se estirará para dar espacio al elemento más alto en una celda en esta fila.

Posicionando elementos (items)

  • grid-colum: grid-colum-start / grid-column-end
css
.grid-container {
    display: grid;
    /* gap: 10px 20px; */
    grid-template-columns: repeat(3, 1fr);
    grid-auto-rows: minmax(100px, auto);
}

.grid-item:nth-child(1) {
    background-color: pink;
    /* grid-column-start: 2;
    grid-column-end: 3; */
    grid-column: 2 / 3;
    grid-row-start: 2;
}
  • span: cuantos items se extenderá
css
.grid-item:nth-child(1) {
    background-color: pink;
    grid-column: 1 / 4;
}

.grid-item:nth-child(5) {
    background-color: lightblue;
    grid-column: span 2;
}

shorthand

Recordar que: grid-column y grid-row es un shorthand:

css
section:nth-child(1) {
    /* grid-colum: 1 / 3; */
    grid-column-start: 1;
    grid-column-end: 3;
}

grid-auto-flow

  • grid-auto-flow: controla cómo funciona el algoritmo de colocación automática, especificando exactamente cómo los elementos colocados automáticamente fluyen hacia la cuadrícula.
  • dense: intenta llenar los agujeros.
  • row / column: Los artículos se colocan llenando cada fila / columna a su vez, agregando nuevas filas / columnas según sea necesario.
css
.grid-container {
    text-align: center;
    display: grid;
    /* gap: 10px 20px; */
    grid-template-columns: repeat(3, 1fr);
    /* grid-auto-rows: minmax(100px, auto); */
    grid-template-rows: 100px 100px;
    grid-auto-flow: column dense;
}

.grid-item:nth-child(1) {
    background-color: pink;
    grid-column: 3 / 4;
}

Práctica

Solución

html
<main class="grid-container">
    <section>1</section>
    <section>2</section>
    <section>3</section>
    <section>4</section>
    <section>5</section>
</main>
css
@import url("https://necolas.github.io/normalize.css/8.0.1/normalize.css");

html {
    box-sizing: border-box;
}
*,
*:before,
*:after {
    box-sizing: inherit;
}

.grid-container {
    width: 500px;
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 20px;
}

section {
    border-radius: 10px;
    padding: 10px;
    background-image: url("https://picsum.photos/1000/1000");
    background-repeat: no-repeat;
    background-size: cover;
    background-position: center;
    min-height: 300px;

    /* Bonus Flexbox */
    display: flex;
    justify-content: center;
    align-items: center;
}

section:nth-child(1) {
    grid-column: 1 / 3;
}
section:nth-child(2) {
    grid-column: 3 / 4;
}
section:nth-child(3) {
    grid-column: 4 / 5;
    grid-row: 1 / 3;
}
section:nth-child(4) {
    grid-column: 1 / 2;
}
section:nth-child(5) {
    grid-column: 2 / 4;
}

align-items y justify-content

  • Si estás familiarizado con flexbox Entonces ya habrás encontrado la forma en que los items flexibles pueden ser alineados correctamente dentro de un contendor flex.
  • La alineación de cajas (box alignment) en el diseño de cuadriculas (Grid Layout), tiene mucha similitud en cómo funcionan estás propiedades y valores en flexbox.
  • Debido a que la cuadrícula (grid) es bidimensional y flexbox es unidimensional, existen algunas pequeñas diferencias con las que debes tener cuidado.
  • Para más inforamción Box alignment in CSS Grid Layout

Siguiendo la práctica anterior ahora podemos posicionar todo el body:

css
body {
    min-height: 100vh;
    /* opción flexbox */
    /* display: flex;
    justify-content: center;
    align-items: center;*/

    /* opción grid */
    display: grid;
    align-items: center;
    justify-content: center;
}

Grid área

  • grid-template-areas
  • La propiedad CSS grid-template-areas especifica nombres para cada una de las grid areas.
css
.grid-container {
    width: 500px;
    display: grid;
    /* grid-template-columns: repeat(4, 1fr); */
    gap: 20px;
    grid-template-areas:
        "a a b c"
        "d e e c";
}

section:nth-child(1) {
    /* grid-column: 1 / 3; */
    grid-area: a;
}
section:nth-child(2) {
    /* grid-column: 3 / 4; */
    grid-area: b;
}
section:nth-child(3) {
    /* grid-column: 4 / 5;
    grid-row: 1 / 3; */
    grid-area: c;
}
section:nth-child(4) {
    /* grid-column: 1 / 2; */
    grid-area: d;
}
section:nth-child(5) {
    /* grid-column: 2 / 4; */
    grid-area: e;
}