Grid

Você tem uma página com um cabeçalho no topo, uma barra lateral à esquerda, uma área de conteúdo principal e um rodapé. Você poderia aninhar uma pilha de containers e ajustar cada um em seu lugar, e funcionaria na maioria das vezes até o dia em que você precisar mudar a disposição. CSS grid foi construído exatamente para esse tipo de problema: distribuir uma página em linhas e colunas ao mesmo tempo. Uma vez que você consegue descrever um layout como um conjunto de tracks, a maior parte da bagunça com wrappers e floats desaparece.
O container grid
Você transforma qualquer elemento em um grid dando a ele display: grid. Esse elemento se torna o grid container, e seus filhos diretos se tornam itens que se encaixam em um grid que você define. Por si só, display: grid não faz muito, então você também precisa dizer quantas colunas e linhas deseja e qual o tamanho de cada uma.
Você descreve as colunas com grid-template-columns e as linhas com grid-template-rows. Cada valor na lista é um track, e um track é uma única coluna ou linha:
.layout {
display: grid;
grid-template-columns: 200px 1fr; /* duas colunas: uma fixa, depois o resto */
grid-template-rows: 80px 400px; /* duas linhas: uma curta, depois uma alta */
}display: grid a um elemento e ele se torna um grid container, com seus filhos diretos sentando dentro como items. Depois você diz quantas colunas e linhas deseja com grid-template-columns e grid-template-rows, um valor por track. Nada se alinha até que você defina esses tracks, então essa é sempre seu primeiro passo. Tracks flexíveis
Colunas de pixels fixos são boas, mas a maioria dos layouts quer colunas que compartilhem o espaço uniformemente e cresçam com a tela. Isso é para o que a unidade fr serve. Um fr significa uma parte do espaço restante, então três colunas de 1fr cada levam um terço do container:
.gallery {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* três colunas iguais */
}Digitar 1fr três vezes fica cansativo, então repeat() escreve por você. E gap define o espaço entre os tracks, então você não precisa recorrer a margins em cada item:
.gallery {
display: grid;
grid-template-columns: repeat(3, 1fr); /* as mesmas três colunas iguais */
gap: 16px; /* espaço entre linhas e colunas */
}fr é uma parte do espaço restante, então 1fr 1fr 1fr te dá três colunas iguais. Use repeat(3, 1fr) para que você não esteja digitando o mesmo valor repetidamente, e gap para o espaço entre tracks. Uma vez que fr clicou para mim, parei de recorrer a percentuais que nunca somavam corretamente. Posicionando items
Por padrão, cada item cai na próxima célula livre, um por célula, em ordem. Quando você quer que um item ocupe mais de uma célula, você diz assim com grid-column e grid-row. As linhas entre tracks são numeradas começando em 1, então grid-column: 1 / 3 significa "comece na linha 1, termine na linha 3", cobrindo duas colunas:
.featured {
grid-column: 1 / 3; /* estenda da linha de coluna 1 para a linha 3, duas colunas de largura */
}Se você não quer contar linhas, span diz quantas células cobrir a partir de onde o item cai:
.featured {
grid-column: span 2; /* cubra duas colunas, começando de onde este item se senta */
}grid-column ou grid-row. Números de linha começam em 1, então grid-column: 1 / 3 cobre duas colunas, ou use span 2 se você preferir não contar. Isso é o suficiente para construir a maioria dos layouts antes de você nomear uma única área. Grids responsivos sem media queries
Uma linha de cards deve mostrar três na largura, dois em um tablet, um em um telefone. Você pode fazer isso apenas com grid, sem breakpoints para escrever. O truque é uma linha:
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 16px;
}Leia de dentro para fora. minmax(200px, 1fr) significa que cada coluna é no mínimo 200px e no máximo uma parte do espaço. auto-fit então encaixa quantas dessas colunas o container tem espaço. Tela larga, mais colunas encaixam; tela estreita, menos encaixam, e os cards refluem por conta própria.
repeat(auto-fit, minmax(200px, 1fr)) faz cards refluxarem por conta própria, sem breakpoints necessários. Cada coluna é no mínimo 200px e no máximo uma parte do espaço, e auto-fit encaixa quantas couberem. Mude o 200px e você muda quantos cards ficam lado a lado. 
