Dominando o Flexbox: Como o max-width no Container Pai Salvou o Meu Layout Responsivo
Construir interfaces fidedignas aos protótipos do Figma é uma das etapas mais enriquecedoras no aprendizado de Front-End — e também uma das que mais nos fazem "bater a cabeça". Recentemente, enfrentei um desafio interessante ao estruturar a seção de Categories Cards de um projeto web, e o processo me trouxe um aprendizado técnico valioso sobre CSS.
O Desafio e a Tentativa Inicial
Inicialmente, cometi um erro comum de abordagem: tentei replicar a estrutura dos cards de ofertas reutilizando a mesma marcação de componentes sem considerar as peculiaridades do fluxo dos novos elementos.
Após revisar a aula e comparar minuciosamente meu HTML e CSS com as medidas e regras do Figma, percebi que a quebra de layout não estava nos elementos filhos em si, mas em como o layout se comportava nas transições de viewports (de 768px para 1024px e, finalmente, para 1440px).
Foram dois dias de testes, pesquisas e refatoração, mas o resultado final valeu cada minuto.
O Ponto de Virada: A Abordagem Container-First
O grande aprendizado do dia foi compreender a responsabilidade do elemento pai (.categories-cards) na física do Flexbox.
Em vez de tentar engessar o comportamento de cada card individualmente em cada tamanho de tela, a chave foi aplicar uma trava no container pai utilizando a propriedade max-width.
1. A Matriz 2x2 em Viewports de 1024px
Para a tela de 1024px, os cards precisavam ter uma largura expandida de 430px. No entanto, se o container ocupasse 100% da largura, o Flexbox tentaria encaixar 3 cards na mesma linha antes de quebrar o layout, deixando a grade desproporcional (3 cards no topo e 1 isolado embaixo).
A solução foi limitar o container pai em max-width: 900px:
- Card 1: 430px
- Gap: 24px
- Card 2: 430px
- Soma da Linha: $430\text{px} + 24\text{px} + 430\text{px} = 884\text{px}$
Como $884\text{px} \le 900\text{px}$, apenas dois cards cabem perfeitamente por linha. O terceiro card estoura o limite do pai e desce automaticamente graças ao flex-wrap: wrap, formando a matriz 2x2 ideal.
2. A Transição para 1440px (Desktop Grande)
Quando a viewport atinge 1440px, o objetivo muda: os 4 cards devem se alinhar em uma única fileira horizontal com 281.25px cada (conforme especificado no Figma).
Para isso, bastou resetar a trava do container para max-width: 100% e redefinir a largura dos cards filhos.
O Código Final
.categories .section-title {
margin-top: 88px;
width: 312px;
height: 98px;
text-align: center;
margin-left: auto;
margin-right: auto;
}
.categories-cards {
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
margin-top: 32px;
}
.categories-cards a.card {
color: var(--text-primary-color);
background-color: var(--background-secondary-color);
width: 312px;
height: 220px;
box-sizing: border-box;
padding: 41px 16px;
border-radius: 8px;
text-align: center;
text-decoration: none;
}
.categories-cards a.card.pacotes-internacionais {
padding: 24px 16px;
}
.categories-cards a.card h3 {
font-size: 28px;
font-weight: var(--title-weight);
}
/* Tablet (>= 768px) */
@media screen and (min-width: 768px) {
.categories-cards {
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
}
}
/* Laptop / Desktop Intermediário (>= 1024px) */
@media screen and (min-width: 1024px) {
.categories-cards {
max-width: 900px; /* Trava o container pai para forçar 2 colunas */
margin-left: auto;
margin-right: auto;
}
.categories-cards a.card {
width: 430px;
}
}
/* Desktop Grande (>= 1440px) */
@media screen and (min-width: 1440px) {
.categories-cards {
max-width: 100%; /* Libera a largura total para 4 colunas em linha */
}
.categories-cards a.card {
width: 281.25px;
}
}