Domine as duas ferramentas mais poderosas do CSS moderno para criação de layouts: Flexbox e Grid. Aprenda a organizar elementos de forma fluida e responsiva para criar interfaces complexas com facilidade.
Compreender como usar Flexbox para criar layouts unidimensionais flexíveis e dinâmicos.
Utilizar CSS Grid para construir layouts bidimensionais complexos com precisão.
Aprender quando e como usar cada sistema de layout para obter os melhores resultados.
Flexbox (Flexible Box Layout) é um modelo de layout unidimensional projetado para organizar elementos em uma única direção - em linha ou coluna. É ideal para componentes de interface como menus, cards, formulários e qualquer layout que precise se adaptar dinamicamente ao espaço disponível.
O Flexbox trabalha com dois eixos principais: o eixo principal (main axis) e o eixo cruzado (cross axis). A direção do eixo principal é determinada pela propriedade flex-direction
.
.container {
display: flex;
flex-direction: row; /* Valores: row, row-reverse, column, column-reverse */
justify-content: space-between; /* Alinhamento no eixo principal */
align-items: center; /* Alinhamento no eixo cruzado */
flex-wrap: wrap; /* Permite quebra de linha dos elementos */
gap: 20px; /* Espaçamento entre os elementos */
}
display: flex
Propriedade | Função | Valores Comuns |
---|---|---|
display | Define um container flex | flex, inline-flex |
flex-direction | Define a direção do eixo principal | row, column, row-reverse, column-reverse |
justify-content | Alinhamento no eixo principal | flex-start, flex-end, center, space-between, space-around |
align-items | Alinhamento no eixo cruzado | flex-start, flex-end, center, stretch, baseline |
flex-wrap | Controla quebra de linha | nowrap, wrap, wrap-reverse |
gap | Espaçamento entre itens | 10px, 1rem, etc. |
Propriedade | Função | Valores Comuns |
---|---|---|
flex-grow | Fator de crescimento | 0, 1, 2, etc. |
flex-shrink | Fator de redução | 0, 1, 2, etc. |
flex-basis | Tamanho inicial | auto, 0, 100px, etc. |
flex | Atalho para as três propriedades acima | flex: 1; (1 1 0%) |
order | Controla a ordem de exibição | 0, 1, -1, etc. |
align-self | Alinhamento individual no eixo cruzado | auto, flex-start, center, etc. |
A propriedade flex: 1;
é um atalho muito usado que equivale a flex: 1 1 0%;
fazendo com que o item cresça para ocupar o espaço disponível. É ideal para criar layouts fluidos.
CSS Grid Layout é um sistema de layout bidimensional que permite criar estruturas complexas de linhas e colunas simultaneamente. Diferente do Flexbox (unidimensional), o Grid oferece controle preciso sobre posicionamento em ambas as direções.
O Grid trabalha com linhas e colunas que criam células onde os elementos são posicionados. É possível definir áreas nomeadas para melhor organização do layout.
.container {
display: grid;
grid-template-columns: repeat(3, 1fr); /* Três colunas com tamanhos iguais */
grid-template-rows: auto 200px auto; /* Três linhas com alturas diferentes */
gap: 16px; /* Espaçamento entre as células */
grid-template-areas:
"header header header"
"sidebar content content"
"footer footer footer";
}
A unidade fr
representa uma fração do espaço disponível. Por exemplo, em grid-template-columns: 1fr 2fr
, a segunda coluna terá o dobro da largura da primeira.
Propriedade | Função | Exemplo |
---|---|---|
display | Define um container grid | grid, inline-grid |
grid-template-columns | Define colunas | 100px 1fr auto |
grid-template-rows | Define linhas | auto 200px 1fr |
gap | Espaçamento entre células | 10px, row-gap, column-gap |
grid-template-areas | Define áreas nomeadas | "header header" "side main" |
/* Posicionamento por área nomeada */
.header {
grid-area: header;
}
/* Posicionamento por linha/coluna */
.sidebar {
grid-column: 1 / 2; /* Início / Fim */
grid-row: 2 / 4; /* Ocupa da linha 2 até a 4 */
}
/* Atalho para posicionamento (linha-início / coluna-início / linha-fim / coluna-fim) */
.content {
grid-area: 2 / 2 / 3 / 4;
}
Ao usar números para posicionamento no grid, lembre-se que as linhas são numeradas começando do 1 (não do 0 como em arrays). A linha de término não é incluída no intervalo, similar a como funciona o slice()
em JavaScript.
Função | Uso | Exemplo |
---|---|---|
repeat() | Repete padrões de tamanho | repeat(3, 1fr) = 1fr 1fr 1fr |
minmax() | Define tamanho mínimo e máximo | minmax(100px, 1fr) |
auto-fill | Cria o máximo de tracks possíveis | repeat(auto-fill, minmax(200px, 1fr)) |
auto-fit | Similar ao auto-fill, mas colapsa tracks vazios | repeat(auto-fit, minmax(200px, 1fr)) |
Flexbox e Grid são complementares, não concorrentes. Saber quando usar cada um é crucial para um desenvolvimento eficiente.
Use Flexbox quando: | Use Grid quando: |
---|---|
- Precisar de um layout unidimensional (linha OU coluna) | - Precisar de layout bidimensional (linhas E colunas) |
- O design for baseado em conteúdo (content-first) | - O design for baseado em layout (layout-first) |
- Para pequenos componentes de UI (menus, barras de ferramentas) | - Para layouts complexos de página inteira |
- Para distribuição de espaço entre itens | - Para alinhamento preciso em duas dimensões |
Use Grid para o layout principal da página e Flexbox para componentes menores dentro dela. Essa combinação traz o melhor dos dois mundos.
/* Layout da página com Grid */
.page {
display: grid;
grid-template-columns: 1fr 3fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
min-height: 100vh;
}
/* Menu de navegação com Flexbox */
.nav-menu {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem;
}
/* Cards com Flexbox */
.card-container {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}
.card {
flex: 1 0 300px; /* Cresce, não encolhe, base 300px */
}
Crie um layout para uma página de blog com:
Certifique-se de que o layout seja responsivo e adapte-se a diferentes tamanhos de tela.
<div class="blog-page">
<header class="header">
<div class="logo">MeuBlog</div>
<nav class="menu">
<a href="#">Home</a>
<a href="#">Artigos</a>
<a href="#">Sobre</a>
<a href="#">Contato</a>
</nav>
</header>
<main class="content-area">
<aside class="sidebar">
<h3>Categorias</h3>
<ul>
<li><a href="#">CSS</a></li>
<li><a href="#">HTML</a></li>
<li><a href="#">JavaScript</a></li>
</ul>
</aside>
<section class="articles">
<h2>Artigos Recentes</h2>
<div class="card-container">
<article class="card">
<h3>Dominando Flexbox</h3>
<p>Aprenda todos os segredos do Flexbox...</p>
</article>
<article class="card">
<h3>CSS Grid na Prática</h3>
<p>Como criar layouts complexos...</p>
</article>
<article class="card">
<h3>Combinando os Dois</h3>
<p>A melhor estratégia para layouts modernos...</p>
</article>
</div>
</section>
</main>
<footer class="footer">
<div class="footer-section">
<h4>Sobre</h4>
<p>Blog dedicado ao CSS moderno</p>
</div>
<div class="footer-section">
<h4>Links</h4>
<ul>
<li><a href="#">Termos</a></li>
<li><a href="#">Privacidade</a></li>
</ul>
</div>
<div class="footer-section">
<h4>Contato</h4>
<p>email@exemplo.com</p>
</div>
</footer>
</div>
/* Layout da Página */
.blog-page {
display: grid;
grid-template-columns: 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header"
"main"
"footer";
min-height: 100vh;
}
/* Header com Flexbox */
.header {
grid-area: header;
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
background: #1976d2;
color: white;
}
.menu {
display: flex;
gap: 1.5rem;
}
.menu a {
color: white;
text-decoration: none;
}
/* Área de Conteúdo com Grid */
.content-area {
grid-area: main;
display: grid;
grid-template-columns: 250px 1fr;
gap: 2rem;
padding: 2rem;
}
/* Sidebar */
.sidebar {
background: #f5f5f5;
padding: 1.5rem;
border-radius: 8px;
}
/* Artigos com Flexbox */
.card-container {
display: flex;
flex-wrap: wrap;
gap: 1.5rem;
}
.card {
flex: 1 0 300px;
border: 1px solid #e0e0e0;
border-radius: 8px;
padding: 1.5rem;
background: white;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
/* Footer com Grid */
.footer {
grid-area: footer;
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 2rem;
background: #333;
color: white;
padding: 2rem;
}
/* Responsividade */
@media (max-width: 768px) {
.content-area {
grid-template-columns: 1fr;
}
.footer {
grid-template-columns: 1fr;
}
.header {
flex-direction: column;
gap: 1rem;
}
}