Jugant amb CSS Grid — àrees

Css temporada 1 capítol 5

Calidae Blog
Published in
5 min readOct 19, 2017

--

Aquest és el cinquè article d’una sèrie d’articles dedicats al CSS Grid:

  1. Introducció
  2. Gap
  3. Start/end
  4. Responsive
  5. Àrees
  6. Alineació

En articles anteriors hem utilitzat CSS Grid per crear el nostre propi grid estil Ui-Kit, Bootstrap o similar. Com ja us podeu imaginar, si la cosa del CSS Grid ha de servir per fer el mateix que ja existeix, no calia fer-ho. Per sort aporta algunes coses més del que hem fet fins ara, i per veure-les farem un Layout.

El concepte en el fons és el mateix de sempre: al cap i a la fi, la maquetació sempre es basa en blocs que conformen contenidors i els espais que deixem entre ells. Així que farem blocs!

Comencem amb una idea, un concepte, un sketch, digueu-li com volgueu, per no partir de zero….

Comencem amb tres layouts per tal d’intentar reproduir-los.

Un codi habitual seria crear quatres classes per cada element i provar d’ubicar-los, ja sigui amb posicions absolutes, flex o altres possibilitats.

En el cas de CSS Grid per crear el layout seria tant fàcil com fer:

.layout { 
display: grid;
grid-template-areas: “header header”
“menu content”
“footer footer”;
}

A part caldrà donar algunes propietats bàsiques si volem que el layout ocupi tota la finestra del navegador, que és el nostre cas.

html, body {
height: 100%;
}

.layotu {
height: 100%;
display: grid;
grid-template-areas: "header header"
"menu content"
"footer footer";
}

Voilà!

Ja tenim el layout fet. Opcionalment (quasi obligatori si volem quelcom coherent) podem definir mides a les columnes tal com hem vist en altres articles, i tractant-se de un layout també donarem mides a les files:

html, body {
height: 100%;
}
.layout {
height: 100%;
display:grid;
grid-template-columns: 300px auto;
grid-template-rows: 100px auto 100px;

grid-template-areas: "header header"
"menu content"
"footer footer";
}

Però… d’acord, no funciona!

Cal alguna cosa més, oi?

Doncs sí, cada element necessita que li diguin en quina àrea s’ha de posar, o en cas contrari es posicionarà per defecte al primer block de la àrea “header” i així successivament fins a omplir totes les àrea definides.

L’avantatge de tenir noms definits és que ja no cal dir a l’element quantes areas ha d’ocupar amb les propietats grid-column-start i grid-column-end, i tampoc amb grid-row-start i grid-row-end. Només cal indicar que l’element ocupa l’area “content” perquè sàpiga automàticament on s’ha de posicionar i l’espai que ha de ocupar.

.logo { 
grid-area: header;
}
.menu {
grid-area: menu;
}
.content {
grid-area: content;
}
.footer {
grid-area: footer;
}

El nostre codi html seria aquest:

<div class="layout-1">
<div class="content">Content</div>
<div class="footer">Footer</div>
<div class="header">Header</div>
<div class="menu">Menu</div>
</div>

Fixa’t que els elements ni tant sols estan per ordre, ho he fet expressament per a que vegis que no cal. El resultat aproximat és aquest:

Si ara volem reconvertir el nostre layout per un de diferent només cal modificar alguns detalls de la propietat grid-template-areas i…

html, body {
height: 100%;
}
.layout {
height: 100%;
display: grid;
grid-template-columns: 300px auto;
grid-template-rows: 100px auto 100px;
grid-template-areas: "header content"
"menu content"
"footer content";
}

…tatxan! Canviant només el nom de les àrea la màgia ha ocorregut!

I si volem afegir línies i treballar a una sola columna?

Ha de ser una mica diferent. Eliminem fins i tot la propietat grid-template-columns, afegim la mida de la nova fila, i els noms de les àrees passen a tenir només un nom per fila.

html, body {
height: 100%;
}
.layout {
height: 100%;
display:grid;
grid-template-rows: 100px 100px auto 100px;
grid-template-areas: "header"
"menu"
"content"
"footer";
}

Ara ja sabeu com fer un layout de forma fàcil i com modificar-lo per poder fer diferents versions. Això és ideal per a fer diferents layouts en funció del dispositiu, ja que en mòbil sovint mostrem continguts de forma diferent a una pantalla gran.

Amb CSS Grid no hauràs ni de tocar la posició dels elements en el HTML: pots resoldre-ho amb classes o breakpoints, canviant una propietat CSS.

Espais buits

En el cas que no vulguem definir un gap per a tot el grid, però si un espai entre el menú i el contingut, en comptes de fer margins o altres invents (rars i qüestionables) podem posar-hi una columna.

L’afegim a totes les files i en cadascuna li indiquem el nom de l’àrea a la que pertany, i com pots veure a l’exemple, a la segona fila el nom és un punt: aquesta àrea no pertany ni al menú ni al contingut i restarà sempre buida.

.layout {  
grid-template-columns: 300px 1em auto;
grid-template-rows: 100px auto 100px;
grid-template-areas: "header header header"
"menu . content"
"footer footer footer";
}

Avui hem vist una altra manera de treballar amb CSS Grid bastant diferent i que a més facilita molt la feina de crear diferents layouts, i segur que serà un aliat molt bo a l’hora de fer components.

La setmana que mirarem la resta de propietats del CSS Grid que no s’han utilitzat fins ara, a veure si en podem treure alguna cosa interessant.

--

--

Calidae Blog

Ser bona persona en aquest món ja és prou complicat com per aspirar a més coses, però no deixaré d’intentar-ho.