Layouts avançados com o sistema de grade bidimensional.
lightbulb Não é um contra o outro! Use Grid para a estrutura da página e Flexbox para os componentes dentro dela.
.container {
display: grid;
/* 3 colunas de 200px */
grid-template-columns: 200px 200px 200px;
/* 2 linhas de 100px */
grid-template-rows: 100px 100px;
/* Espaço entre itens */
gap: 16px;
}
lightbulb Os itens se distribuem automaticamente nas células da grade.
/* Divide o espaço proporcionalmente */
.grid {
grid-template-columns: 1fr 2fr 1fr;
}
A coluna central recebe o dobro do espaço.
/* Atalho para repetir colunas */
.grid {
/* 4 colunas iguais */
grid-template-columns: repeat(4, 1fr);
}
/* Misturando fixo e flexível */
grid-template-columns: 250px repeat(3, 1fr);
.header {
grid-column: 1 / 4; /* da linha 1 até a 4 */
}
.sidebar {
grid-row: 2 / 4; /* da linha 2 até a 4 */
}
/* Atalho com span */
.banner {
grid-column: span 3; /* ocupa 3 colunas */
}
.layout {
display: grid;
grid-template-columns: 250px 1fr;
grid-template-rows: 60px 1fr 50px;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
gap: 8px;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }
lightbulb O layout fica visualmente claro como um "mapa" no código!
/* Tamanho mínimo e máximo */
.grid {
grid-template-columns:
repeat(3, minmax(150px, 1fr));
}
Cada coluna tem no mínimo 150px e cresce até preencher 1 fração.
.grid {
grid-template-columns:
repeat(auto-fit, minmax(200px, 1fr));
gap: 16px;
}
Os itens se reorganizam automaticamente conforme o espaço!
lightbulb
auto-fit cria quantas colunas couberem. auto-fill preserva espaços vazios.
/* Alinha horizontalmente */
justify-items: start | center | end | stretch;
/* Alinha verticalmente */
align-items: start | center | end | stretch;
/* Atalho para ambos */
place-items: center center;
/* Alinha horizontalmente */
justify-self: start | center | end | stretch;
/* Alinha verticalmente */
align-self: start | center | end | stretch;
/* Atalho para ambos */
place-self: center end;
/* Quando a grade é menor que o contêiner */
justify-content: center; /* grade no centro horizontal */
align-content: center; /* grade no centro vertical */
place-content: center center; /* atalho */
lightbulb Na prática, você vai usar ambos juntos: Grid para a macro-estrutura e Flexbox para os micro-componentes.
.page {
display: grid;
grid-template-columns: 250px 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
min-height: 100vh;
gap: 0;
}
/* Dentro do main, Flexbox para cards */
.cards {
display: flex;
flex-wrap: wrap;
gap: 16px;
}
grid-template-areas: header, sidebar, main e footer250px) e o main com 1frdisplay: grid e repeat(auto-fit, minmax(200px, 1fr))place-items: center para centralizar o conteúdo de um cardmin-height: 100vh para a página ocupar toda a telaResponsividade: media queries e mobile-first.
fr e repeat()
minmax() e auto-fit para grids responsivos