Información del post ⇣

grid-template-areas

La propiedad CSS grid-template-areas especifica nombres para cada una de las grid areas.

De esta manera asociando un elemento a un area fijamos su posición dentro de la rejilla. Una ventaja importante es que nos permite ver y gestionar el posicionamiento de todos los elementos desde el padre, sin tener que navegar entre los elementos para gestionar su posicionamiento (grid-column, grid-row) de una manera bastante visual.

Asignamos áreas a los elementos hijos del contenedor.

blockquote {
  grid-area: blockquote;
}

header {
  grid-area: header;
}

aside {
  grid-area: aside;
}

main {
  grid-area: main;
}

footer {
  grid-area: footer;
}

Combinado con grid-template-columns y grid-template-rows controlamos el tamaño de las columnas y filas.

En el siguiente ejemplo tenemos el blockquote posicionado por debajo del <header> con grid-template-areas podemos modificar su posición para colocarlo por encima del <header>.

<div>
   <header>Header</header>
   <blockquote>Blockquote</blockquote>
   <main>Main</main>
   <aside>Sidebar</aside>
   <footer>Footer</footer>
</div>

Las filas se crean listando líneas de cadenas separadas, mientras que las columnas se reflejan en cada una de las celdas que aparecen en la cadena.

div {
  grid-template-areas:
     "blockquote blockquote"
     "header header"
     "aside main"
     "footer footer"
  ;
}

grid-template-areas y :has()

Con el recientemente llegado :has podemos controlar layouts dependiendo de si un elemento está presente o no.

En este caso si existe el elemento blockquote le reservamos su espacio en la rejilla y si no, lo obviamos de manera que no generamos las columnas y filas que necesitaría evitando problemas, como por ejemplo un gap no deseado.

.wrapper:has(blockquote)[data-variant="default"] {
  grid-template-areas:
     "blockquote blockquote"
     "header header"
     "aside main"
     "footer footer"
  ;
}   
   
.wrapper[data-variant="default"] {
  grid-template-areas:
     "header header"
     "aside main"
     "footer footer"
  ;
} 

Demo

He montado una demo en codepen.io con dos ejemplos, en el primero podéis modificar el posicionamiento del mensaje cambiando en el selector el atributo que tiene el padre y determina el template-grid-area en cada caso.

En el segundo ejemplo veréis la misma estructura que el primero pero sin el mensaje y como hago la excepción en la Css obviando el grid-area para el mensaje.


Links relacionados