CSS Grid de um jeito fácil — Parte 2

Continuando a segunda parte, falarei de algo mais prático e palpável para mostrar como é possível utilizar o Grid Layout de maneira básica, mas com entendimento mais claro e simplificado.

Rafael Dantas
7 min readMay 25, 2018
#praCegoVer — Foto de uma cidade vista do alto. Foto por Cem Ersozlu no Unsplash

Definindo o que vamos fazer

Antes de começarmos a colocar a mão na massa, precisamos definir o que será feito, como não cobriremos nada muito complexo, tomei a liberdade de criar um layout bem simples, porém que atende boa parte dos casos de uso.

#praCegoVer — Imagem de um layout com um menu, uma barra lateral esquerda e uma barra lateral direita, além do conteúdo principal e um rodapé.

Não vou criar conteúdos internos de cada um dos componentes porque o objetivo aqui é falarmos de Grid Layout, em um outro momento falarei sobre como controlar os elementos internos utilizando Flexbox.

Por hora vamos focar em construir essa pequena página utilizando somente Grid Layout, sendo assim, vamos somente nos preocupar com o layout de forma geral.

Colocando a mão na massa

Antes de mais nada, precisamos definir um container para que seja possível determinar um comportamento de grid, então vamos criar uma div com um container.

Eu poderia definir o body com comportamento de Grid, porém, existem casos onde apenas uma parte da sua página vai se comportar como Grid, por isso seguirei com o container definido em uma div.

Ok, agora temos uma div com uma classe container, como pode ver na pen, já está definido o display: grid; na classe container.

Já temos o comportamento de Grid, com isso já podemos criar as outras marcações necessárias para que possamos posiciona-las.

Para facilitar o desenvolvimento

Uma dica, você pode utilizar o inspetor de Grid do Firefox, para verificar se há algum grid e o comportamento dos elementos internos, basta clicar na página com o botão direito do mouse, na aba inspector você encontrará sub abas, clique na aba layout, haverá uma seção chamada Grid, se houver algum container com grid, aparecerá ali, basta clicar na opção de ativar o inspetor e pronto, tudo certo!

#praCegoVer — Print do inspetor do Firefox.

Bom, agora que já temos nosso container definido, podemos criar as marcações com os elementos necessários que irão compor nosso layout, a pen abaixo já mostra os elementos na página

Agora temos as marcações necessárias para o nosso layout e as estilizações de cada um dos componentes, certo? Certo, nosso próximo passo é posicionar os nossos elementos dentro do nosso grid de forma a atender o layout que foi proposto logo acima.

Para isso, temos diversas formas para se fazer, eu vou adotar aqui neste tutorial algo chamado de Area Naming, onde cada um dos meus elementos recebe um determinado nome dentro da minha folha de estilos e através desses nomes será possível informar para o grid onde cada um dos elementos vai ficar posicionado e quanto de espaço cada um destes elementos vai ter.

Mas antes, precisamos definir qual será o tamanho do nosso grid, isso significa, definir a quantidade de colunas e linhas. Bom, então vamos analisar novamente o layout proposto.

#praCegoVer — Imagem de um layout com um menu, uma barra lateral esquerda e uma barra lateral direita, além do conteúdo principal e um rodapé.

Analisando o layout, é possível concluir que o grid precisará de três colunas e três linhas, ou seja, um Grid 3x3, totalizando 9 células (3 x 3 = 9).

Agora vai ficar mais fácil construir o Grid porque já sabemos o tamanho exato dele, nessa pen bacanuda eu mostro como.

Perceba que nós utilizamos duas propriedades novas, grid-template-columns e grid-template-rows, com essas duas propriedades eu posso definir a quantidade de colunas e linhas que eu desejo de maneira bem simples, basta informar o tamanho de cada linha/coluna que eu desejo.

Por exemplo, para criar 4 linhas, basta definir o tamanho de cada uma delas: grid-template-rows: 1fr 1fr 1fr 1fr;

Lembra da medida FR que abordei anteriormente? Pois é, de maneira fácil e sem necessidade de cálculos eu defino o tamanho da minha coluna e ele já calcula as margens e, caso exista, os meus grid-gap’s.

Além disso, temos uma função que trabalha em conjunto com essas propriedades, ela se chama repeat(), com ela eu defino quantas colunas/linhas eu quero e informo o tamanho dessas colunas de maneira bem mais simples, seguindo o exemplo anterior eu posso fazer da seguinte forma: grid-template-rows: repeat(4, 1fr);

Mais simples, não? Economizo tempo e deixo o código um pouco mais limpo, mas lembrando que devemos utilizar esta propriedade somente quando soubermos quantas colunas existem e se os tamanhos se repetem.

#praCegoVer — Gif de pessoas fazendo um sinal positivo

Continuando o desenvolvimento do nosso layout, vamos nomear os nossos elementos para que seja possível posiciona-los dentro do grid, para demonstrar isso, segue mais uma pen marota.

Para nomear os nossos elementos é bastante simples, basta usar a propriedade grid-area dentro do nosso elemento e dar o nome que desejamos, por exemplo, caso queira nomear o elemento que corresponde a barra de menu, basta definir dentro da classe .menu a propriedade grid-area: menu;

.menu { grid-area: menu; }

Talvez você ainda não tenha entendido como utilizar essas grid-areas, mas calma que vamos cobrir isso no próximo passo. E note que o nosso layout ficou bastante esquisito, isso é normal, pois quando eu dou um nome para cada um dos meus elementos, através do grid-area, mas não defino onde eles vão ficar, eles se comportam de modo estacado, ou seja, acabam ficando agrupados e sempre ficam na ultima célula, não se preocupe com o porquê disso agora, falaremos desses comportamentos “estranhos” em algum outro momento, por hora vamos focar somente no que de fato importa, construir nosso layout.

Como mencionado acima, vamos para o nosso próximo passo, vamos posicionar os nossos elementos no grid, segue aquela pen moralizadora para exemplificar isso:

Vamos destrinchar isso para deixar claro para todo mundo, então muita calma nessa hora.

Primeira coisa que eu fiz foi posicionar os nomes dos meus elementos ao centro pra facilitar e ficar mais fácil pra visualizar o conceito, nada complexo MESMO, apenas um text-align: center; no body e a questão foi resolvida.

Segundo, eu defini uma altura, mas por que? Eu explico, quando eu defini que minhas colunas e linhas teriam uma medida definida em fração (1fr ou 4fr) o navegador vai pegar essa medida e vai fazer um determinado calculo pra gente (lembra que eu comentei sobre os cálculos serem feitos de forma automática anteriormente?), pois bem, ele precisa ter uma base pra fazer o calculo, especialmente no caso da altura do meu container.

Isso significa que ele precisa de uma altura definida pra distribuir os elementos conforme as definições que passamos através do grid-template-columns e grid-template-rows.

Nesse caso ele vai pegar os meus 700px de altura e vai calcular sozinho o quanto que 1fr ou 4fr representam ali no container.

Dessa forma eu deixo bem claro o poder que temos com a medida Fr, sem dificuldade e sem quebrar muito a cabeça a gente consegue definir um determinado tamanho para as colunas e linhas e definindo uma altura ele já vai fazer todos os cálculos necessarios, independentemente do fato de termos ou não grid-gap ou de mudarmos o tamanho da altura do container.

E a terceira coisa que foi feita foi posicionar os nossos elementos com o grid-template-areas dentro do nosso container.

Através de aspas simples eu vou informando onde cada elemento vai ficar, exatamente como mostrado na pen, ou seja, se eu tiver 3 colunas definidas e quiser que minha barra de menu se estenda por todas as colunas, basta nomear cada célula com o nome da grid-area desejada, por exemplo, definimos um grid-template-areas e com uma string definimos onde começa e onde termina a ocupação do nosso elemento, por exemplo:

grid-template-areas: ‘menu menu menu’

Ele vai ocupar 3 colunas de 3 colunas disponíveis

grid-template-areas: ‘menu menu lateral-direita’

O menu ocupa duas colunas, lateral-direita ocupa uma coluna.

Simples, né?

Como você pôde ver na pen acima, nosso layout já está praticamente pronto, ele já está funcionando da maneira que queremos e com os elementos posicionados sem muita dificuldade.

Concluindo

O próximo passo é criar o comportamento responsivo para esse nosso layout, te garanto que é bem fácil, bem simples e bem rápido, pelo menos se compararmos como fazíamos antes.

Mas essa parte vou deixar para uma terceiro post, até porque esse aqui já está ficando grande demais e já temos muita coisa pra absorver até aqui, então no próximo a gente já cobre a parte responsiva, alguns outros pequenos pontos conceituais e fechamos essa pequena série, fechado?

Espero que esteja te ajudando a entender melhor o funcionamento do Grid, de maneira mais simplificada, como eu mencionei anteriormente, a ideia aqui é entender o poder do grid e abrir essa primeira porta para vocês explorarem essa propriedade tão legal que é o Grid Layout.

Te espero na próxima e qualquer duvida, só chamar! :)

Valeu!

--

--