Grid linename

<< Grid por áreas gap y alineación >>

¿Qué son los Nombres de Línea (linenames)?

En CSS Grid, las líneas que dividen las columnas y las filas se numeran automáticamente (empezando por 1). Los nombres de línea te permiten asignar un nombre descriptivo a cualquiera de estas líneas. Una vez que las líneas tienen un nombre, puedes usar ese nombre en las propiedades de posicionamiento (grid-column-start, grid-row-end, etc.) para colocar y extender tus elementos, en lugar de usar los números.

Para usar grid con nombres de línea debemos definir tu cuadrícula en el contenedor padre y asignar nombres a las líneas al mismo tiempo.

  • display: grid;: Convierte el contenedor en una cuadrícula.
  • grid-template-columns y grid-template-rows: Aquí es donde defines la estructura y colocas los nombres de las líneas entre corchetes ([]) antes o después de la definición del tamaño de la pista (columna o fila).

Vamos a hacer una versión más sencilla del modelo de antes, para este ejemplo quitaremos los dos cards que tenemos debajo del main, dejando por tanto 4 columnas y 3 filas.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="1.grid-linename.css">
</head>
<body>
        <div class="miGrid">
        <header class="item header">Header</header>
        <aside class="item aside">Aside</aside>
        <main class="item main-content">Main Content</main>
        <footer class="item footer">Footer</footer>
    </div>
</body>
</html>

Podemos indicar línea de inicio y línea de fin. Por ejemplo:

.miGrid{
    grid-template-columns: [col1-start]1fr [col1-end col2-start]1fr [col2-end col3-start]1fr [col3-end col4-start]1fr [col4-end];
}

¿Cómo podríamos conseguir lo mismo usando el método repeat?

Simplemente colocas el nombre de la línea dentro de los corchetes [] antes o después de la definición del tamaño de la pista. El navegador creará 3 col-start y 3 col-end. Y podremos acceder a ellos mediante el índice que ocupa. Por ejemplo, en el típico ejemplo de web HTML5, el header sería desde col-start 1 / col-end 3, el main desde el col-start 2 hasta el col-end 3 dejando el aside desde el col-start 1 / col-end 1.

.contenedor {
  display: grid;
  /* Repite 3 veces el patrón: (Línea 'col-start', 1fr, Línea 'col-end') */
  /* El resultado son 3 columnas y líneas nombradas: [col-start] 1fr [col-end col-start] 1fr [col-end col-start] 1fr [col-end] */
  grid-template-columns: repeat(3, [col-start] 1fr [col-end]);
}

/* Para posicionar un elemento en la segunda columna: */
.elemento {
  /* Empieza en la segunda línea 'col-start' y termina en la segunda línea 'col-end' */
  grid-column: col-start 2 / col-end 2; 
}

Esto en nuestro ejemplo sería:

* {
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
    margin: 0;
    padding: 0;
}

.miGrid {
    gap: 20px;
    /* Separación de cada celda del grid */
    width: 100%;
    max-width: 1200px;
    height: 100vh;
    display: grid;    
    grid-template-columns: repeat(4, [col-start] 1fr [col-end]);
    grid-template-rows: [header]100px [main]1fr [footer]100px;

    .item {
        /* Estilos comunes a todas las celdas */
        background-color: #ffffff;
        border-radius: 12px;
        box-shadow: 0 4px 15px rgba(0, 0, 0, 0.08);
        padding: 20px;
        color: #333;
        font-size: 1.2rem;
        display: grid;
        place-items: center;
    }

    .header {
        background-color: #4a90e2;
        color: white;
        grid-column: col-start 1 / col-end 4;
        grid-row: header;
    }

    .aside {
        background-color: #34495e;
        color: white;
        grid-column: col-start 1 / col-end 1;
        grid-row: main;
    }

    .main-content {
        background-color: #f5a623;
        grid-column: col-start 2 / col-end 4;
        grid-row: main;
    }

    .footer {
        background-color: #4a4a4a;
        color: white;
        grid-column: col-start 1 / col-end 4;
        grid-row: footer;
    }
}

¿Y cómo haríamos ahora para poner los cards esos?

Tenemos 2 opciones. La primera sería darle 3fr por ejemplo a la fila del main y 1fr a la fila del card. La otra opción sería hacer un grid anidado. Veamos los dos casos.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="2.linename-repeat.css">
</head>

<body>
    <div class="miGrid">
        <header class="item header">Header</header>
        <aside class="item aside">Aside</aside>
        <main class="item main-content">Main Content</main>
        <section class="item card-1">Section 1</section>
        <section class="item card-2">Section 2</section>
        <footer class="item footer">Footer</footer>
    </div>
</body>

</html>

Para el caso delo grid anidado, lo que hacemos es dividir el ítem del main-content en dos partes y así poder insertar esos section que teníamos.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="3.grid-completo.css">
</head>

<body>
    <div class="miGrid">
        <header class="item header">Header</header>
        <aside class="item aside">Aside</aside>
        <main class="item main-content">
            <article class="item subitems article">Main</article>
            <section class="item subitems card-1">Section 1</section>
            <section class="item subitems card-2">Section 2</section>
        </main>
        
        <footer class="item footer">Footer</footer>
    </div>
</body>

</html>

Grid usando nombres de línea vs áreas

Usa nombres de línea cuando necesites un control granular y preciso sobre los límites de tus elementos. Usa áreas cuando quieras una representación visual del layout y facilitar los cambios de estructura general.

<< Grid por áreas gap y alineación >>