Apostila completa de Layout, Grade e Espaçamento
Layout é organizar o espaço para que o olho saiba onde olhar, o que pertence a quê e por onde seguir. Esta apostila cobre a percepção (Gestalt), os princípios de alinhamento e proximidade, a escala de espaçamento em base 4/8, sistemas de grade, hierarquia e composição, layout na web com Flexbox e Grid, responsivo com container queries e espaço fluido, telas densas de aplicação, e como tudo isso vira tokens e primitivas num design system.
O espaço como material e a Gestalt
Objetivo: enxergar o espaço em branco como um elemento de design ativo e conhecer as leis de percepção (Gestalt) que explicam por que um layout "funciona" ou "confunde".
1.1 O espaço em branco não é sobra
Iniciantes tratam o espaço vazio como área a preencher; profissionais o usam como ferramenta. O espaço agrupa (o que está perto pertence junto), separa (o que está longe é outra coisa), enfatiza (dar ar em volta de um elemento o destaca) e dá ritmo (a repetição de intervalos cria previsibilidade). Layout ruim quase nunca é falta de elementos — é falta de espaço distribuído com intenção.
Distância comunica relação. Se dois elementos se relacionam, aproxime-os e afaste-os do resto; se não se relacionam, separe-os claramente. Metade dos problemas de layout se resolve ajustando o que está perto de quê — antes de mexer em cor, borda ou tamanho.
1.2 As leis da Gestalt
| Lei | O que diz | Uso em layout |
|---|---|---|
| Proximidade | elementos próximos são vistos como um grupo | a alavanca nº 1 de agrupamento — rótulo junto do campo, não do campo de cima |
| Similaridade | elementos parecidos (forma, cor, tamanho) são vistos como relacionados | cards do mesmo tipo com o mesmo estilo; ações primárias todas iguais |
| Continuidade | o olho segue linhas e curvas | alinhamento cria "trilhos" invisíveis que guiam a leitura |
| Fechamento | completamos formas incompletas | um card pode ser sugerido por espaçamento e um leve fundo, sem borda fechada |
| Figura-fundo | separamos o objeto (figura) do fundo | contraste e espaço definem o que "está na frente"; ambiguidade cansa |
| Região comum | o que está dentro de uma mesma área delimitada é um grupo | um painel/fundo agrupa mais fortemente que só proximidade |
| Destino comum | o que se move junto pertence junto | itens que aparecem/somem juntos numa transição |
1.3 A ordem de força do agrupamento
Quando quiser dizer "estes elementos são um grupo", as ferramentas, da mais forte para a mais fraca: região comum (um fundo/painel) > proximidade (espaço) > similaridade (estilo compartilhado) > alinhamento. Combine-as com parcimônia — usar as quatro ao mesmo tempo para o mesmo grupo é redundante e pesado. Muitas vezes proximidade sozinha basta.
Perguntas de abertura: "O que é espaço em branco e para que serve?" (agrupar, separar, enfatizar, dar ritmo — não é sobra), "Cite leis da Gestalt e como você as usa" (proximidade para agrupar, similaridade para relacionar, região comum para grupos fortes), "Como você agruparia um rótulo e seu campo sem usar borda?" (proximidade: mais espaço acima do rótulo que entre rótulo e campo).
✏️ Exercício 1 — Leia o layout
Abra um formulário qualquer (checkout, cadastro) e identifique: (a) dois lugares onde a proximidade está errada (rótulo mais perto do campo errado, botão colado no conteúdo de outro grupo); (b) onde a similaridade está ajudando; (c) se há "região comum" (painéis) e se ela agrupa o que deveria.
Gabarito (modelo): "(a) O rótulo 'E-mail' está a igual distância do campo de cima e do de baixo — ambíguo; e o botão 'Aplicar cupom' está colado no campo de endereço, sugerindo que pertence a ele. (b) Todos os campos têm a mesma altura e estilo → lidos como uma série. (c) Há um painel cinza em volta do resumo do pedido (região comum) que o separa bem do formulário; mas os campos de entrega e de pagamento estão no mesmo painel sem subdivisão, então parecem um grupo só." Correções: aumentar o espaço acima de cada rótulo; separar o botão de cupom; subdividir entrega/pagamento com espaço ou subpainéis.
Alinhamento, proximidade, repetição, contraste
Objetivo: os quatro princípios que resolvem a maioria dos layouts (C.R.A.P.) e como aplicá-los com disciplina.
2.1 Alinhamento
- Nada deve ser colocado "a olho". Todo elemento tem uma relação de alinhamento com algum outro — mesma borda esquerda, mesmo eixo central, mesma linha de base.
- Prefira um só eixo forte. Texto alinhado à esquerda cria uma linha vertical nítida que o olho segue (continuidade). Centralizar tudo destrói esse trilho — use centralização para poucos elementos e por decisão, não por default.
- Alinhamento óptico > matemático. Ícones, aspas, itálicos e formas redondas às vezes precisam "vazar" um pouco da margem para parecerem alinhados.
2.2 Proximidade
Já vista no Módulo 1: o espaço dentro de um grupo deve ser menor que o espaço entre grupos. Um erro clássico é o espaçamento uniforme — tudo com a mesma margem — que apaga a estrutura. Defina pelo menos três níveis: dentro do componente, entre componentes de um grupo, entre grupos/seções.
2.3 Repetição
- Repetir espaçamentos, tamanhos, estilos e posições cria consistência e reduz a carga cognitiva — o usuário aprende o padrão uma vez.
- É o que uma escala de espaçamento (Módulo 3) e uma grade (Módulo 4) impõem automaticamente.
- Repetição também dá ritmo: intervalos previsíveis entre itens de uma lista, entre seções de uma página.
2.4 Contraste
- Contraste = diferença deliberada e forte. "Quase igual" lê como erro; para diferenciar, diferencie de verdade (tamanho bem maior, peso bem diferente, muito mais espaço).
- Contraste cria hierarquia e pontos de entrada — o olho pousa primeiro no que mais contrasta com o entorno.
- Em layout, o contraste mais útil costuma ser de escala e de espaço (um bloco com muito ar em volta salta), não de cor.
Passe linhas verticais e horizontais imaginárias (ou reais, no Figma) pelas bordas dos elementos. Quantos alinhamentos distintos existem na tela? Se forem muitos e quase-coincidentes (uma borda a 16px, outra a 19px, outra a 22px), há bagunça. Bons layouts têm poucos eixos de alinhamento, e quase tudo se encaixa neles.
Perguntas: "O que é o princípio C.R.A.P.?" (Contraste, Repetição, Alinhamento, Proximidade), "Por que espaçamento uniforme é ruim?" (apaga o agrupamento; precisa de níveis), "Qual a diferença entre alinhamento óptico e matemático?", "Como você cria hierarquia com layout, sem cor?" (escala + espaço + posição).
✏️ Exercício 2 — Aplique os quatro
Você recebe um card de produto "empilhado a olho": imagem, título, descrição, preço, botão, tudo com 12px de margem entre si e o texto centralizado. Reescreva a especificação de layout aplicando C.R.A.P.
Gabarito (uma boa resposta): Alinhamento: tudo à esquerda (um eixo forte), preço e botão podendo compartilhar uma linha de base. Proximidade: título colado à descrição (4–8px), esse bloco separado da imagem (16px) e do bloco preço+botão (16–24px) — três níveis, não um. Repetição: usar degraus da escala (4/8/16/24), o mesmo card replicado na grade com o mesmo gutter. Contraste: título bem maior/mais pesado que a descrição; botão com peso claro; o preço com destaque de tamanho. Resultado: hierarquia legível de relance, sem depender de centralização nem de bordas.
A escala de espaçamento
Objetivo: adotar uma escala de espaço em base 4/8, entender densidade, e os quatro tipos de espaçamento (inset, stack, inline, grid).
3.1 Por que uma escala
Se cada margem é escolhida na hora (13px aqui, 18px ali, 7px acolá), o resultado é inconsistente e impossível de manter. Uma escala — um conjunto pequeno de valores permitidos — força repetição, acelera decisões ("o próximo degrau, não +1px") e cria harmonia.
3.2 Base 4 e base 8
- Base 8 (0, 8, 16, 24, 32, 40, 48, 64…) é o padrão mais comum: divide bem, casa com densidades de tela, dá poucos degraus úteis.
- Base 4 (com meios-degraus: 4, 12, 20…) para ajustes finos, sobretudo em componentes densos e ícones. Muitos sistemas usam "base 4, preferindo múltiplos de 8".
- Degraus pequenos costumam ser lineares (4, 8, 12, 16); degraus grandes podem crescer mais rápido (24, 32, 48, 64, 96) — o olho não precisa de 40 e 48.
--space-0: 0; --space-1: 0.25rem; /* 4 */ --space-2: 0.5rem; /* 8 */ --space-3: 0.75rem; /* 12 */ --space-4: 1rem; /* 16 */ --space-5: 1.5rem; /* 24 */ --space-6: 2rem; /* 32 */ --space-7: 3rem; /* 48 */ --space-8: 4rem; /* 64 */ --space-9: 6rem; /* 96 */
Use rem para o espaço acompanhar a preferência de tamanho de fonte do usuário e o zoom (volta ao reflow da WCAG — Módulo 7).
3.3 Os quatro tipos de espaçamento
| Tipo | O que é | Em CSS |
|---|---|---|
| Inset | o "respiro" interno de um contêiner (o padding de um card, de um botão) | padding |
| Stack | espaço vertical entre elementos empilhados | margin-block ou gap num flex column |
| Inline | espaço horizontal entre elementos numa linha (ícone e rótulo, chips) | gap num flex row |
| Grid | o gutter entre colunas/linhas de uma grade | gap no grid |
Pensar nesses nomes ajuda a nomear tokens de espaçamento por uso quando necessário (--inset-card, --stack-section) e a padronizar componentes.
3.4 gap > margens
gap(em flex e grid) põe o espaço entre os filhos, sem "primeira/última margem" sobrando e sem margin collapse.- Padrão robusto: o contêiner controla o espaço entre filhos (
gap); o filho não traz margem própria. Isso torna os componentes recombináveis. - O "lobotomized owl" (
.flow > * + * { margin-block-start: var(--space-4) }) é a alternativa clássica quando você não pode usar flex/grid.
3.5 Densidade
A mesma escala pode ter modos de densidade (confortável / compacto) trocando o passo base — útil em tabelas e ferramentas onde caber mais dados importa. Faça isso via token (--density: 1 → multiplica os espaços), não reescrevendo componentes.
Espaçamento uniforme (sem níveis) que apaga o agrupamento. Valores fora da escala ("só mais 2px") que se multiplicam pelo projeto. Margens no filho e padding no pai empilhando espaço imprevisível. margin vertical sofrendo collapse e o layout "pulando". Espaço em px fixo que não escala com o zoom. Densidade tratada como CSS ad-hoc em vez de token.
Perguntas: "Por que base 8?" (divisível, casa com densidades, poucos degraus úteis), "gap ou margin, e por quê?" (gap: sem margem sobrando, sem collapse, componentes recombináveis), "O que é margin collapse?", "Como você suportaria um modo compacto?" (token de densidade multiplicando a escala).
✏️ Exercício 3 — Defina a escala e aplique
(a) Escreva uma escala de 8 degraus em rem a partir de base 8. (b) Para um card com imagem, título, texto e rodapé de ações, atribua um degrau a: inset do card, stack título↔texto, stack texto↔rodapé, inline entre os dois botões do rodapé. (c) Justifique por que o stack título↔texto é menor que texto↔rodapé.
Gabarito (uma boa resposta): (a) 0 / .25 / .5 / .75 / 1 / 1.5 / 2 / 3 rem. (b) inset do card = 1.5rem (24); título↔texto = .5rem (8) — mesmo grupo; texto↔rodapé = 1.5rem (24) — separa o conteúdo das ações; inline entre botões = .75rem (12). (c) título e texto são o mesmo bloco de conteúdo (proximidade forte); o rodapé de ações é outro grupo funcional, então precisa de mais espaço para não parecer parte do texto.
Sistemas de grade
Objetivo: montar e usar uma grade (colunas, gutter, margem), conhecer a de 12 colunas e a grade modular, e saber quando a grade ajuda e quando engessa.
4.1 Anatomia de uma grade de colunas
- Colunas: as faixas onde o conteúdo se encaixa.
- Gutter (medianiz): o espaço entre colunas — vem da escala de espaçamento.
- Margem: o espaço entre a grade e a borda da viewport/contêiner.
- Módulo: a interseção coluna × linha, numa grade modular.
- Largura máxima de conteúdo: a grade não precisa ocupar telas de 2560px — limite (ex.: 1200–1440px) e centralize.
4.2 A grade de 12 colunas (e alternativas)
- 12 é popular porque divide por 2, 3, 4 e 6 — acomoda layouts de 2, 3, 4 colunas de conteúdo.
- Não é obrigatória: 4/8 colunas no mobile, 6 em telas médias, grades de 16 em dashboards muito modulares.
- A grade de colunas é um guia de composição; no CSS moderno você raramente precisa de um "grid framework" —
display: gridresolve (Módulo 6).
4.3 Grade modular e baseline
- Grade modular: colunas + linhas horizontais, criando módulos retangulares — forte para conteúdo editorial e catálogos, onde blocos ocupam N módulos.
- Baseline grid: uma malha horizontal fina (ex.: 4px) à qual as linhas de base do texto se alinham. Excelente no impresso; na web é trabalhoso (métricas de fonte, imagens de altura arbitrária) — muitos times priorizam uma escala de espaçamento consistente e um
line-heightdisciplinado em vez de baseline estrito. Ver a apostila Tipografia.
4.4 Quando a grade ajuda — e quando atrapalha
| A grade ajuda | A grade atrapalha |
|---|---|
| Páginas com muitos blocos heterogêneos (marketing, editorial, catálogo) | Uma única coluna de leitura — aí o que importa é a medida (Tipografia), não colunas |
| Manter alinhamento entre seções muito diferentes | Forçar um componente pequeno a "encaixar em 12 colunas" quando ele só precisa de max-width |
| Coordenar trabalho de várias pessoas (contrato visual) | Tratar a grade como lei e impedir o quebrar deliberado (full-bleed, sobreposição) |
4.5 Quebrar a grade de propósito
Elementos full-bleed (sangram até a borda), imagens que ultrapassam uma coluna, sobreposições — quebras controladas dão energia e destaque. A diferença entre "quebrou a grade" e "não tem grade" é intenção: você sabe qual regra está quebrando e por quê.
Perguntas: "Anatomia de uma grade?" (colunas, gutter, margem, módulo, largura máx.), "Por que 12 colunas?" (divisibilidade), "Quando você não usaria grade de colunas?" (coluna única de leitura — usar medida), "Ainda faz sentido um grid framework?" (raramente; display: grid nativo).
✏️ Exercício 4 — Projete a grade
Para um site com home de marketing, um blog (artigos) e um painel de conta: defina a grade de cada um (número de colunas por breakpoint, gutter, margem, largura máxima) e diga onde a grade de colunas não deve mandar.
Gabarito (uma boa resposta): Home de marketing: 4 col (mobile) → 8 (tablet) → 12 (desktop), gutter 24px, margem 16→32px, largura máx. 1200–1280px; blocos ocupam 12/6/4 col. Blog: a página usa a grade para o cabeçalho e rodapé, mas o corpo do artigo ignora colunas e usa max-width: ~68ch centralizado (medida manda). Painel de conta: grade de 12 (desktop) com um sidebar fixo (ex.: 3 col) + conteúdo (9 col); em telas menores vira 1 coluna com o menu recolhido. Full-bleed permitido para heros e faixas, deliberadamente.
Hierarquia visual e composição
Objetivo: dirigir o olhar — ponto focal, fluxo de leitura, peso visual, agrupamento — e compor telas que se leem na ordem certa.
5.1 Peso visual
Cada elemento "puxa" o olhar com uma força que depende de tamanho, contraste, cor, densidade, isolamento (espaço em volta) e posição. Compor é equilibrar esses pesos: um título grande de um lado pede algo que o contrabalance do outro, ou muito espaço.
5.2 Ponto focal e ordem de leitura
- Toda tela precisa de um ponto de entrada claro — o elemento de maior contraste/peso. "Tudo em destaque" = nada em destaque.
- Padrões de varredura ocidentais: Z (páginas esparsas, landing), F (páginas com muito texto/listas), Gutenberg (a diagonal do canto superior esquerdo ao inferior direito, com "zonas mortas" nos outros cantos).
- Use posição + peso para que a ordem visual bata com a ordem de importância — e, idealmente, com a ordem no DOM (acessibilidade e leitura por teclado; ver Acessibilidade Digital & WCAG).
5.3 Agrupamento e "chunking"
- Quebre a tela em poucos grupos digeríveis (5–7), cada um com um rótulo/título claro e espaço em volta.
- Dentro de cada grupo, no máximo mais um nível de subdivisão. Hierarquia profunda demais (grupo dentro de grupo dentro de grupo) perde-se.
- Formulários longos: seções com títulos + espaço; ou passos (wizard).
5.4 Densidade da informação
Não existe "densidade certa" universal: um dashboard de operações quer alta densidade (comparar muitos números de relance); uma landing quer baixa (uma ideia por vez). Escolha conscientemente e seja consistente. Alta densidade exige alinhamento impecável e uma escala de espaçamento pequena e disciplinada (Módulo 8).
5.5 Simetria, assimetria e tensão
- Simetria transmite calma, formalidade, estabilidade — e pode ficar estática.
- Assimetria equilibrada (pesos diferentes que se contrabalançam) transmite dinamismo e é mais comum em UI real.
- Espaço negativo ativo — uma área vazia grande e intencional — cria foco e "respiro" premium.
Afaste-se da tela ou desfoque os olhos (ou aplique um blur no Figma). O que ainda salta? Deveria ser o ponto de entrada. A ordem em que os borrões chamam atenção é a ordem de leitura real — se ela não bate com a intenção, ajuste peso e espaço, não conteúdo.
Perguntas: "Como você cria um ponto focal?" (maior contraste de peso: tamanho + isolamento + posição), "O que são os padrões Z e F?", "Como decidir a densidade de uma tela?" (pela tarefa: comparar muitos dados vs absorver uma ideia), "Por que a ordem visual deve bater com a ordem no DOM?" (teclado, leitor de tela, coerência).
✏️ Exercício 5 — Redirija o olhar
Uma tela de detalhe de pedido tem: número do pedido pequeno no topo, um bloco enorme de itens no centro, o status (o que o usuário mais quer saber) discreto no canto, e três botões de ação com o mesmo peso. Descreva as mudanças de composição para que a ordem de leitura seja: status → itens → ações secundárias.
Gabarito (uma boa resposta): promover o status a ponto de entrada — maior, com espaço isolando-o, no topo à esquerda (zona forte), talvez com um selo. A lista de itens vira o segundo bloco, com título e a densidade adequada, mas sem competir em peso com o status. As ações: definir uma primária (peso claro) e rebaixar as outras duas a secundárias (menos peso), agrupadas e separadas do conteúdo por espaço. Conferir no teste de esguelha se o status realmente salta primeiro, depois os itens, depois a ação primária.
Layout na web: Flexbox e Grid
Objetivo: dominar o fluxo normal, Flexbox e CSS Grid — quando usar cada um, alinhamento e distribuição, e os padrões que cobrem 90% dos casos.
6.1 O fluxo normal
Antes de qualquer sistema: blocos empilham verticalmente, inline flui horizontalmente, o texto quebra sozinho. Muita coisa não precisa de flex nem grid — só de max-width, margin e um bom gap via "flow". Não alcance o Grid para empilhar três parágrafos.
6.2 Flexbox — para uma dimensão
.cluster{
display: flex;
flex-wrap: wrap;
gap: var(--space-3);
align-items: center; /* eixo cruzado */
justify-content: flex-start; /* eixo principal */
}
.barra{
display: flex;
justify-content: space-between; /* título à esquerda, ações à direita */
align-items: center;
gap: var(--space-4);
}
.item-que-estica{ flex: 1; } /* cresce e encolhe */
.item-fixo{ flex: 0 0 auto; }
- Use Flexbox quando os itens vivem numa linha OU numa coluna e você quer distribuí-los/alinhá-los: toolbars, grupos de botões, chips, um header.
gapfunciona em flex — dispense as "margens entre itens".flex-wrap: wrap+flex: 1 1 <base>dá um "grid responsivo pobre" sem media queries.
6.3 CSS Grid — para duas dimensões
.layout{
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: var(--space-5);
}
.conteudo{ grid-column: 1 / 9; }
.aside{ grid-column: 9 / 13; }
/* grade responsiva sem media query: quantas colunas couberem, mín. 16rem */
.cards{
display: grid;
grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
gap: var(--space-5);
}
/* áreas nomeadas — o layout "desenhado" no CSS */
.app{
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"sidebar header"
"sidebar main"
"sidebar footer";
}
.app > header{ grid-area: header; }
- Use Grid quando precisa alinhar em linhas E colunas ao mesmo tempo: o esqueleto da página, uma galeria, um formulário de rótulos alinhados, um dashboard.
minmax()+auto-fit/auto-fill= layouts fluidos que se reflowam sozinhos.frdistribui o espaço restante;minmax(0, 1fr)evita que conteúdo largo (uma tabela, um<pre>) estoure a coluna.
6.4 Alinhamento (vale para os dois)
| Propriedade | O quê |
|---|---|
justify-content | distribui as faixas no eixo inline (space-between, center…) |
align-content | idem no eixo block (quando há espaço sobrando) |
justify-items / align-items | alinha cada item dentro da sua célula/linha |
justify-self / align-self | sobrescreve para um item específico |
place-content / place-items | atalho para os dois eixos (place-items: center centraliza de verdade) |
6.5 Padrões que resolvem quase tudo
- Stack / Flow: filhos empilhados com
gapconsistente. - Cluster: grupo de itens que quebra linha com
gap(tags, ações). - Sidebar: uma faixa fixa + uma fluida que colapsam quando não cabem.
- Switcher: N colunas que viram 1 abaixo de um limite, sem media query.
- Cover: um elemento centralizado verticalmente com header/footer opcionais (hero).
- Grade auto-fit: cards responsivos com
minmax. - Estes são os "Every Layout" — vale conhecer a fonte (Módulo 10).
Usar Grid para tudo (inclusive uma linha de botões — é Flex). flex em vez de gap para espaçar (margens sobrando). Esquecer minmax(0, 1fr) e ver uma tabela estourar o layout. height: 100vh em mobile (a barra do navegador — use dvh). Aninhar cinco flex containers quando um Grid resolveria. Media queries por "tamanho de dispositivo" em vez de por onde o conteúdo quebra (Módulo 7).
Perguntas de front-end: "Flexbox ou Grid — como você decide?" (uma dimensão vs duas), "Como fazer uma grade de cards responsiva sem media query?" (repeat(auto-fit, minmax(...))), "O que fr faz e por que minmax(0,1fr)?", "Diferença entre align-items e align-content?", "Como centralizar um elemento?" (display:grid; place-items:center).
✏️ Exercício 6 — Escolha a ferramenta
Para cada caso, diga Flexbox, Grid ou fluxo normal, e por quê: (a) empilhar título, parágrafo e botão num card; (b) uma barra com logo à esquerda e menu à direita; (c) o esqueleto app com sidebar + header + main + footer; (d) uma galeria de imagens que se reorganiza conforme a largura; (e) uma linha de chips que quebra; (f) um formulário onde todos os rótulos alinham numa coluna e os campos noutra.
Gabarito: (a) fluxo normal + "flow" (margin/gap) — é só empilhar. (b) Flexbox, justify-content: space-between — uma dimensão. (c) Grid com grid-template-areas — duas dimensões, esqueleto. (d) Grid com repeat(auto-fit, minmax(...)) — reflow em 2D sem media query. (e) Flexbox com flex-wrap: wrap e gap — cluster de uma dimensão. (f) Grid de 2 colunas (auto 1fr) — alinhar rótulos e campos entre linhas exige 2D.
Responsivo de verdade
Objetivo: mobile-first, breakpoints ditados pelo conteúdo, container queries, espaço fluido com clamp(), layouts intrínsecos e as funções min()/max()/clamp().
7.1 Mobile-first e breakpoints por conteúdo
- Escreva o layout base para a tela estreita; adicione complexidade com
min-widthconforme o espaço permite. - Não use "tamanhos de iPhone/iPad". Aumente a janela até o layout quebrar (linha longa demais, elementos apertados) e ponha o breakpoint ali. São do seu conteúdo, não de dispositivos.
- Prefira
em/remnas media queries (respondem ao zoom de fonte).
7.2 Container queries
Media query pergunta o tamanho da viewport; container query pergunta o tamanho do contêiner do componente. Isso torna um componente verdadeiramente reutilizável: o mesmo card se adapta se está numa sidebar estreita ou numa área ampla, sem saber onde a página o colocou.
.card-wrap{ container-type: inline-size; container-name: card; }
.card{ display: grid; gap: var(--space-3); }
@container card (min-width: 28rem){
.card{ grid-template-columns: 12rem 1fr; } /* vira horizontal quando o CONTÊINER é largo */
}
7.3 Espaço e tamanho fluidos
/* interpola entre um mínimo e um máximo conforme a viewport, com trava */ --space-fluid-l: clamp(2rem, 1rem + 4vw, 4rem); section{ padding-block: var(--space-fluid-l); } h1{ font-size: clamp(1.75rem, 1.2rem + 2.5vw, 3rem); } .container{ width: min(100% - 2rem, 75rem); /* 75rem, mas nunca encostando na borda */ margin-inline: auto; }
clamp(MIN, IDEAL, MAX): useremnoMINe noMAX(acessibilidade/zoom) evw/%no meio.min()para "o menor entre" (largura máxima que respeita a margem);max()para pisos (ex.:max(1rem, 2vw)de padding que nunca some).- Espaço fluido reduz o número de breakpoints — a página "respira" continuamente.
7.4 Layouts intrínsecos
Em vez de "em 768px, mude para 2 colunas", deixe o layout reagir ao conteúdo e ao espaço: flex-wrap com flex-basis, grid com auto-fit/minmax, a "Sidebar" e o "Switcher" do Módulo 6. Menos media queries, menos telas para testar, menos quebras.
7.5 Unidades de viewport e safe areas
vhé traiçoeiro no mobile (a barra do navegador aparece/some). Usesvh/lvh/dvh(small/large/dynamic).env(safe-area-inset-*)para não colocar conteúdo sob o notch/barra de gestos.aspect-ratiopara mídia e placeholders sem "pulo" de layout (volta ao CLS — ver Tipografia).
7.6 Reflow (WCAG 1.4.10)
A 320px de largura equivalente (ou 400% de zoom), o conteúdo não pode exigir rolagem horizontal — deve refluir para uma coluna. Layouts intrínsecos e rem em tudo já entregam isso quase de graça. Tabelas largas são a exceção legítima (podem rolar dentro de um contêiner). Ver Acessibilidade Digital & WCAG.
Perguntas: "Como você decide onde colocar um breakpoint?" (onde o conteúdo quebra, não tamanhos de device), "Media query vs container query?", "O que clamp() resolve e por que rem nos limites?", "Por que 100vh dá problema no mobile?" (dvh), "O que é o critério de reflow da WCAG?".
✏️ Exercício 7 — Menos media queries
Um layout tem 5 media queries: 360, 480, 768, 1024, 1440px, cada uma reorganizando uma grade de cards e ajustando paddings de seção. Proponha como reduzir para no máximo uma, usando técnicas deste módulo.
Gabarito (uma boa resposta): a grade de cards vira grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)) — some todas as media queries dela. Os paddings de seção viram clamp(1.5rem, 1rem + 4vw, 4rem) — some as queries de padding. O container vira width: min(100% - 2rem, 75rem); margin-inline: auto. Componentes internos que mudam de orientação usam container queries, não a viewport. Resta, talvez, uma media query para uma mudança estrutural real (ex.: sidebar de navegação que vira drawer) — e só.
Ritmo, densidade e telas de aplicação
Objetivo: compor telas densas de produto (tabelas, dashboards, editores) — modos de densidade, ritmo vertical, sticky/scroll e as armadilhas de layout de app.
8.1 Densidade como decisão de sistema
- Ferramentas de trabalho (CRM, analytics, admin, editores) vivem de ver muito de relance — densidade alta é uma vantagem, não um defeito.
- Ofereça modos (confortável / compacto) via token de densidade que multiplica a escala de espaçamento e reduz alturas de linha de componentes — sem forks de componente.
- Densidade alta cobra alinhamento perfeito e tipografia com numerais tabulares (ver Tipografia) — senão vira ruído.
8.2 Ritmo vertical
- Uma página longa lê melhor com intervalos previsíveis entre seções — poucos valores de "espaço entre seções" (ex.: 48/64/96), aplicados com consistência.
- O padrão "flow" (
.flow > * + * { margin-block-start: 1em }, com exceções pontuais) dá ritmo ao conteúdo de texto sem margens ad-hoc. - Espaço antes de um título > espaço depois — o título deve grudar no conteúdo que ele nomeia.
8.3 Tabelas e grades de dados
- Alinhe números à direita (ou pelo decimal); texto à esquerda; cabeçalhos como o conteúdo.
- Zebra vs linhas divisórias vs só espaçamento: quanto mais densa a tabela, mais ajuda uma pista horizontal sutil; não use as três.
- Cabeçalho
position: sticky; primeira coluna sticky em tabelas largas; a tabela rola dentro de um contêiner comoverflow, sem quebrar o reflow da página. - Densidade de linha: confortável ~44–48px, compacto ~32–36px — alvo de toque vs volume de dados.
8.4 Layout de aplicação: esqueleto e regiões
- Esqueleto típico: topbar + sidebar (navegação) + main (às vezes com sub-header/toolbar e um painel de detalhe à direita). Grid com
grid-template-areas. - Regiões com scroll independente (a sidebar rola separada do main); cuidado com "scroll dentro de scroll".
- Sticky para toolbars e cabeçalhos de seção; teste com o teclado (o foco não pode ficar escondido atrás do sticky — use
scroll-margin-top). - Estados vazios, de carregamento (skeleton com a mesma métrica do conteúdo, para não "pular") e de erro são parte do layout, não uma reflexão tardia.
8.5 Alturas, overflow e o "z-index war"
- Evite alturas fixas em contêiner de conteúdo — deixe o conteúdo definir; use
min-height. overflow: hidden"conserta" um vazamento mas pode cortar foco, tooltips e sombras — descubra a causa.- Camadas (dropdown, modal, toast, popover) precisam de uma escala de z-index tokenizada (ex.: 100/1000/2000/3000) e, de preferência, portais +
:top-layer/<dialog>. Não inventez-index: 99999.
Um estado de carregamento só ajuda se ocupar exatamente o espaço do conteúdo que vai chegar (mesma altura de linha, mesmo número de linhas aproximado, mesma grade). Skeleton "genérico" que depois é substituído por algo de outro tamanho causa layout shift — o oposto do que ele deveria evitar.
Perguntas (product/design systems): "Como você suporta densidade compacta?" (token que multiplica a escala; sem fork de componente), "Como fazer uma tabela grande sem quebrar a página?" (scroll no contêiner, header sticky, reflow preservado), "Como você organiza z-index?" (escala tokenizada + top-layer), "Por que o skeleton precisa ter a métrica do conteúdo?".
✏️ Exercício 8 — Especifique a tela densa
Projete o layout de um painel de "pedidos" com: navegação lateral, uma toolbar de filtros, uma tabela de 8 colunas com muitas linhas, e um painel de detalhe que abre à direita ao clicar numa linha. Descreva o esqueleto (grid), o comportamento de scroll, o que é sticky, os modos de densidade e o estado de carregamento.
Gabarito (uma boa resposta): Grid grid-template-columns: 240px 1fr auto (sidebar / conteúdo / painel de detalhe que tem largura 0 ou ~360px). Sidebar com scroll próprio. Conteúdo: toolbar de filtros sticky top:0; a tabela rola dentro de um contêiner com overflow:auto, <thead> sticky, primeira coluna (nº do pedido) sticky à esquerda; a página em si não rola horizontalmente (reflow ok). Painel de detalhe: entra por container query/estado, empurra ou sobrepõe conforme a largura disponível; em telas estreitas vira tela cheia. Densidade: token --density confortável (linha 48px) / compacto (linha 34px) multiplicando insets. Carregamento: skeleton de linhas com a altura exata da linha e ~10–15 linhas; toolbar e header já renderizados.
Layout num design system
Objetivo: transformar espaçamento, grade e breakpoints em tokens; oferecer primitivas de layout reutilizáveis; e manter Figma e código em sincronia.
9.1 Tokens de espaçamento, grade e breakpoint
:root{
/* espaço — escala única, base 4/8 */
--space-1:.25rem; --space-2:.5rem; --space-3:.75rem; --space-4:1rem;
--space-5:1.5rem; --space-6:2rem; --space-7:3rem; --space-8:4rem; --space-9:6rem;
/* espaço fluido para respiros de seção */
--space-section: clamp(3rem, 2rem + 6vw, 8rem);
/* grade */
--grid-columns: 12;
--grid-gutter: var(--space-5);
--grid-margin: clamp(1rem, 5vw, 3rem);
--content-max: 75rem;
/* raios, para consistência de "forma" */
--radius-1:.25rem; --radius-2:.5rem; --radius-3:1rem; --radius-pill:999px;
/* z-index tokenizado */
--z-dropdown:1000; --z-sticky:1100; --z-modal:2000; --z-toast:3000;
}
/* breakpoints como custom media (via PostCSS) ou apenas documentados */
/* --bp-sm: 30rem; --bp-md: 48rem; --bp-lg: 64rem; --bp-xl: 80rem; */
- Componentes usam só tokens — nada de
margin: 13px. - Densidade:
--densitymultiplicando a escala, aplicado num escopo.
9.2 Primitivas de layout
Em vez de cada tela reinventar flex/grid, ofereça um punhado de componentes de layout sem estilo visual, só de composição:
| Primitiva | Faz |
|---|---|
| Stack | empilha filhos com gap de um token |
| Cluster | agrupa itens que quebram linha, com gap e alinhamento |
| Grid | auto-fit/minmax ou N colunas com gutter-token |
| Sidebar | faixa fixa + área fluida que colapsa |
| Cover | centra um conteúdo com header/footer opcionais |
| Frame | impõe aspect-ratio a mídia |
| Center / Container | max-width + margin-inline:auto + margem lateral |
Essas primitivas (a ideia vem do Every Layout) tornam telas novas rápidas de montar e consistentes por construção. Elas consomem os tokens; as telas consomem as primitivas.
9.3 Figma ↔ código
- Auto Layout do Figma = Flexbox: use os mesmos valores de
gap/padding da escala de tokens (variáveis de número no Figma). - Layout grids do Figma espelhando a grade de colunas/gutter/margem dos tokens, por breakpoint.
- Nomes de espaçamento iguais nos dois lados (
space-4, não "16" solto). Divergência Figma↔código é a fonte nº 1 de "no protótipo tava diferente". - Ver as apostilas Figma e Design Systems & Design Tokens.
9.4 Documentação e governança
- Página de layout no site do design system: a escala de espaço visualizada, a grade, as primitivas com exemplos, do's & don'ts.
- Lint: proibir valores de espaçamento fora da escala; proibir
z-indexliteral fora dos tokens. - Regra para adicionar um degrau à escala (quase nunca) e para criar uma primitiva nova (precisa aparecer em ≥ 3 telas).
- Teste de reflow/zoom no CI ou no checklist de PR.
Duas pessoas montam a mesma tela, separadamente, e o espaçamento sai igual — porque escolheram degraus da mesma escala e as mesmas primitivas. Se cada uma "sentiu" as margens, faltam tokens e primitivas. Um sistema de layout bom remove decisões de pixel do dia a dia.
Perguntas (design systems / front-end sénior): "Como você tokeniza espaçamento e grade?" (escala única em rem, gutter/margem/max como tokens, z-index tokenizado), "O que são primitivas de layout e por que usá-las?" (Stack/Cluster/Grid/Sidebar… — consistência por construção), "Como manter Figma e código alinhados no layout?" (Auto Layout = Flex, mesmos valores, layout grids espelhando tokens), "Como você impede espaçamento ad-hoc?" (lint).
✏️ Exercício 9 — Esboce o sistema de layout
Para um design system novo, especifique: (a) a escala de espaçamento (valores e quantos degraus); (b) 3 tokens de grade e 1 de espaço fluido; (c) 4 primitivas de layout que você entregaria primeiro e o que cada uma resolve; (d) 2 regras de lint.
Gabarito (uma boa resposta): (a) 9–10 degraus: 0, .25, .5, .75, 1, 1.5, 2, 3, 4, 6 rem (base 4/8, crescendo mais rápido no fim). (b) --grid-columns: 12, --grid-gutter: var(--space-5), --content-max: 75rem; fluido: --space-section: clamp(3rem, 2rem + 6vw, 8rem). (c) Stack (empilhar com gap-token — 90% dos casos), Cluster (grupos de botões/tags), Grid (auto-fit para cards e N-col para o esqueleto), Container/Center (largura máx. + margem). (d) proibir margin/padding com valor fora da escala; proibir z-index numérico literal fora dos tokens.
Mercado de trabalho: roadmap, entrevistas e portfólio
Objetivo: converter o conteúdo dos módulos em contratação — onde layout pesa, um plano de estudo, um banco de perguntas com respostas e projetos que geram entrevista.
10.1 Onde layout pesa
- Product / UI designer: composição de telas, densidade, responsivo, consistência de espaçamento — avaliado em todo teste de portfólio.
- Design systems: tokens de espaçamento/grade, primitivas de layout, breakpoints, documentação.
- Front-end / UI engineer: Flexbox, Grid, container queries, espaço fluido, reflow/zoom.
- Editorial / marketing: grades modulares, ritmo, composição de páginas ricas.
10.2 Roadmap de estudo (6–8 semanas)
| Semanas | Foco | Prática |
|---|---|---|
| 1 | Gestalt e C.R.A.P. (Módulos 1–2) | Auditar 5 telas: apontar proximidade errada, eixos de alinhamento, agrupamento |
| 2 | Escala de espaçamento (Módulo 3) | Refazer um card e um formulário usando só uma escala base 8, com 3 níveis de proximidade |
| 3 | Grades (Módulo 4) | Projetar a grade de 3 tipos de página; marcar onde a grade não deve mandar |
| 4 | Hierarquia e composição (Módulo 5) | Redirigir a ordem de leitura de 2 telas; validar com o teste de esguelha |
| 5 | Flexbox e Grid (Módulo 6) | Implementar os "Every Layout": Stack, Cluster, Sidebar, Switcher, Cover, Grid auto-fit |
| 6 | Responsivo (Módulo 7) | Pegar um layout com 5 media queries e reduzir para 1 com auto-fit, clamp e container queries |
| 7 | Telas densas e sistema (Módulos 8–9) | Montar um painel com tabela sticky + painel de detalhe + modos de densidade; tokenizar |
| 8 | Portfólio | Escrever os estudos de caso com o raciocínio (grade, escala, decisões de composição); publicar |
10.3 Banco de perguntas de entrevista (com a resposta que aprova)
Júnior/pleno — "Como o espaço em branco organiza um layout?"
Agrupando (proximidade), separando, enfatizando (isolamento) e dando ritmo (intervalos previsíveis). A regra prática: o espaço dentro de um grupo deve ser menor que o espaço entre grupos — e é preciso ter pelo menos três níveis de espaçamento, não um uniforme.
Pleno — "Por que uma escala de espaçamento, e por que base 8?"
Uma escala força repetição e consistência, acelera decisões e evita a bagunça de valores ad-hoc. Base 8 divide bem (2/4), casa com densidades de tela e dá poucos degraus úteis; base 4 entra para ajustes finos. Valores em rem para escalar com o zoom.
Pleno/front-end — "Flexbox ou Grid?"
Flexbox para uma dimensão (uma linha OU uma coluna de itens que você distribui/alinha: toolbars, clusters, headers). Grid para duas dimensões ao mesmo tempo (esqueleto de página, galerias, formulários de rótulos alinhados, dashboards). Fluxo normal + "flow" quando é só empilhar. gap nos dois, em vez de margens entre itens.
Pleno/front-end — "Grade de cards responsiva sem media query?"
display: grid; grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); gap: var(--space-5); — o navegador coloca quantas colunas couberem, cada uma com no mínimo 16rem, e distribui o resto. Reflow automático, zero breakpoints.
Sénior — "Media query vs container query?"
Media query responde ao tamanho da viewport; container query responde ao tamanho do contêiner do componente. Container queries tornam um componente reutilizável de verdade — o mesmo card se adapta numa sidebar estreita ou numa área ampla sem saber onde foi colocado. Menos acoplamento entre componente e página.
Sénior — "Como reduzir a quantidade de breakpoints?"
Layouts intrínsecos: auto-fit/minmax para grades, flex-wrap + flex-basis para clusters, clamp() para espaço e tipografia fluidos, min()/max() para larguras e paddings, container queries para componentes. Sobram só os breakpoints de mudança estrutural real (ex.: nav vira drawer). Breakpoints ditados pelo conteúdo quebrando, não por tamanhos de dispositivo.
Sénior — "Como você garante consistência de layout num time grande?"
Tokens de espaçamento/grade/z-index (componentes usam só tokens), primitivas de layout (Stack/Cluster/Grid/Sidebar…), Figma com Auto Layout e layout grids espelhando os mesmos valores, uma página de documentação de layout, e lint proibindo espaçamento e z-index ad-hoc.
Armadilha — "É só ir posicionando até ficar bom"
Sem uma escala e eixos de alinhamento definidos, "até ficar bom" produz inconsistência que ninguém consegue manter nem replicar. Layout profissional é sistema: poucos valores de espaço, poucos eixos, primitivas reutilizáveis — e então o "olho" entra só no ajuste fino.
10.4 Projetos de portfólio que geram entrevista
- Kit de primitivas de layout (âncora): Stack, Cluster, Grid, Sidebar, Cover, Center implementadas com tokens, documentadas, com exemplos de composição — o "esqueleto" de um design system.
- Redesign de espaçamento: pegue uma UI real inconsistente, aplique uma escala base 8 e três níveis de proximidade; antes/depois com a grade sobreposta.
- Menos media queries: um layout responsivo reescrito de N breakpoints para 1, com o raciocínio (auto-fit, clamp, container queries) e telas comparadas.
- Painel denso: uma tela de aplicação com tabela sticky, painel de detalhe, modos de densidade e estados (vazio/carregando/erro) — mostra layout de produto de verdade.
- Estudo de composição: a mesma tela em 3 hierarquias diferentes (mudando só peso e espaço), com o teste de esguelha de cada uma.
10.5 Fontes para continuar
- Livros: The Non-Designer's Design Book (Robin Williams — o C.R.A.P.); Grid Systems in Graphic Design (Josef Müller-Brockmann); Making and Breaking the Grid (Timothy Samara); Refactoring UI (espaçamento e hierarquia).
- Web: Every Layout (every-layout.dev — as primitivas); web.dev e MDN sobre Grid, Flexbox, container queries; Utopia (fluid space/type); 1linelayouts (Una Kravets); Inclusive Components.
- Referência: as seções de layout/espaçamento dos design systems públicos (Material, Primer, Polaris, Carbon, Atlassian).
- Nesta trilha: Tipografia, Cor, Design Systems & Design Tokens, Logótipos & Lettering; e CSS, CSS Avançado: Animações & SVG, Acessibilidade Digital & WCAG, Figma, Guia de Elementos de Interface.
Quatro ideias sustentam o layout: (1) distância comunica relação — proximidade e espaço em branco são a alavanca principal, antes de cor ou borda; (2) poucos eixos de alinhamento e uma escala de espaçamento (base 4/8, em rem) transformam "a olho" em sistema; (3) Flexbox para uma dimensão, Grid para duas, e layouts intrínsecos (auto-fit, clamp, container queries) no lugar de dezenas de media queries; (4) num sistema, tokens + primitivas de layout removem decisões de pixel e fazem telas novas nascerem consistentes.