Matheus Castiglioni

Criando Layouts Com Css Grid Layout

Imagine que um amigo, chegou em você e disse:

Eu preciso criar um layout com um cabeçalho, um menu lateral, o conteúdo principal e um rodapé

Se você já esta acostumado a criar páginas HTML5 com CSS3 já deve ter imáginado toda a estrutura, algo parecido com:

<header>Cabeçalho</header>
<aside>Menu lateral</aside>
<main>Conteúdo principal</main>
<footer>Rodapé</footer>

Até ai tudo bem, certo ? Certo, mas montar a estrutura das tags é a parte mais fácil, porém agora precisamos posiciona-las da seguinte maneira:

Com isso iremos ter o seguinte layout:

Layout do post

Para você que já esta pensando nos códigos e esta ancioso para começar a escrever seu .css, acredito que já deva estar imaginando diversas maneiras de chegar ao design que nosso amigo esta precisando:

Posso usar flexbox, talvez eu use float, se der na louca eu utilizo o position, etc…

Pois é, normalmente eu faria esse design com float ou flexbox, iria medir o tamanho de cada elemento, adicionar um pouco de margin e padding, porém, para esse post iremos utilizar a nova feature do CSS chamada “CSS Grid Layout”.

Conheçendo o CSS Grid Layout

Como criar layouts era uma tarefa comúm no dia-á-dia e as vezes um tanto quanto chata de se implementar, a galera pensou: “Não existe nada que podemos fazer para agilisar esse processo ?”, então criou-se o CSS Grid Layout.

Essa nova feature do CSS, nos permite “dizer” aos elementos onde queremos que eles fiquem, qual vai ser o tamanho deles, quanto de espaçamento vai existir, conseguimos criar “lacunas” ou “buracos” que serão preenchidos por nossas tags HTML.

Começando com nosso código

Chega de mais delongas e vamos começar a codificar e por em prática tudo isso, a primeira parte será definir o HTML da página:

<header class="o-header">Header</header>
<aside class="o-aside">Aside</aside>
<main class="o-main">Main</main>
<footer class="o-footer">Footer</footer>

Com isso, iremos ter o seguinte resultado:

Como podemos ver, tudo esta sem design, sem posicionamento e espaços.

Nosso primeiro passo será definir qual tag vai receber as “lacunas” para posteriormente adicionarmos nossos elementos. Bom, se tudo esta dentro de body, nenhum candidato poderia ser melhor:

body {
  display: grid;
}

Vejam que o display ganhou um novo valor chamado grid, com isso estamos dizendo: “Olha navegador a tag body vai receber um grid, assim posso informar onde cada tag vai ficar”, mas afinal, onde estamos dizendo e informando o posicionamento de cada tag ?

Posicionando nossas tags

Para posicionar nossas tags, devemos praticamente “desenhar” no CSS, onde elas irão estarem:

body {
  display: grid;
  grid-template-areas:
    "header header header"
    "aside main main"
    "footer footer footer";
}

Podemos ver o resultado:

Pera ai Matheus, que maluquisse é essa ? O que é “header header header” ? Calma, vamos por partes, vou explicar as linhas que foram adicionadas.

Entendendo o Template Areas

Com a propriedade css-template-areas “desenhamos” nosso layout, assim conseguimos informar como e por quais elementos ele vai ser composto:

Assim conseguimos chegar no layout que nosso amigo estava precisando.

O header e footer foram declarados três vezes, porque estamos trabalhado com um layout de três colunas, isso deve-se ao fato da segunda linha do nosso template.

Mas por que três colunas ?

Sim, nossa segunda linha poderia ser com duas colunas “aside main” dessa forma, mas então por que repetimos o main duas vezes ? Repare no layout que precisamos chegar:

Layout do post

Veja que o main é um pouco maior do que o aside, mais precisamente, o main é duas vezes maior que o aside, por isso, tivemos que repetir o mesmo duas vezes, assim estamos dizendo para o template: “Olha template, aqui na segunda linha, vai ter um aside à esquerda e um main à direita, porém, o main deve ser duas vezes maior que o aside”.

Resultando em nosso layout de três colunas: “aside main main”, então por isso, na primeira e terceira linha devemos também ter três colunas.

Legal, agora eu entendi e tirei minhas dúvidas, vamos então dizer aos elementos que eles devem ficar naquelas “lacunas”.

Dizendo aos elementos onde devem ficar

Para dizer aos elementos onde eles devem ficar, ou seja, qual “lacuna” é de cada um, precisamos ir em um por um deles e informar:

.o-header {
  grid-area: header;
}

.o-aside {
  grid-area: aside;
}

.o-main {
  grid-area: main;
}

.o-footer {
  grid-area: footer;
}

Assim, teremos o seguinte resultado:

Veja que cada um esta em sua devida posição, repare também que o nome informado na propriedade grid-area deve ser exatamente igual aos nomes dados no grid-template-areas, seguindo nosso layout esta faltando apenas setar a cor dos elementos, certo ?

.o-header, .o-aside, .o-main, .o-footer {
  background: #BC20E2;
  color: #FDFDFD;
}

E novamente, nosso resultado:

Mas espera ai, nosso layout possuí espaçamentos e ocupam a página toda, até agora esta tudo junto e ocupando apenas o tamanho necessário.

Dando espaçamentos entre os elementos

Vamos então, informar o espaço que devem haver entre os elementos:

body {
	grid-gap: 1rem;
}

Com isso, os elementos já devem estar espaçados em 1rem que seria 16px:

Falta apenas eles ocuparem a página toda

Dizendo o tamanho dos elementos

Para dizer o tamanho que cada row(linha) ou column(coluna) devem ter, precisamos também dizer ao nosso template:

body {
  grid-template-columns: auto auto auto;
  grid-template-rows: auto 100vh auto;
}

Repare novamente que tanto nossas columns ou rows, estão sendo informadas três vezes, isso porque temos um layout de três colunas e três linhas, veja também que apenas para a segunda linha declaramos o valor 100vh que corresponde a altura total da viewport, as demais linhas serão automáticas.

Por padrão o valor será auto, mas apenas descrevi para você saber que pode estar mudando, para saber quais valores podem ser setados, consulte a documentação: grid-template-columns e grid-template-rows.

Com isso, devemos ter o seguinte resultado:

Bem próximo relacionado á necessidade de nosso amigo.

Dando os toques finais

Para sanar a necessidade de nosso amigo e entregar o layout para ele, vou fazer apenas algumas melhorias no design:

Pronto, agora já podemos realizar a entrega do projeto. Caso tenha necessidade o projeto pode ser baixado aqui.

Caso ainda tenha ficado alguma dúvida ou você prefere assistir em vez de ler, segue o vídeo gravado sobre o mesmo assunto em meu canal no youtube:

E ae, você já conhecia o CSS Grid Layout ? Não deixe de comentar.

Matheus Castiglioni

Matheus Castiglioni

Apaixonado pelo mundo dos códigos e um eterno estudante, gosto de aprender e saber um pouco de tudo, aquela curiosidade de saber como tudo funciona, tento compartilhar o máximo de conhecimentos adquiridos e ajudar todos aqueles que sou capaz.

comments powered by Disqus