Guia Visual de Fundamentos

Do zero ao olho de
designer

Cada seção abaixo demonstra na prática os conceitos das Fases 0–4. Inspecione com o DevTools enquanto lê.

Começar → Ver animações
Fase 0

Box Model

Todo elemento é uma caixa com content → padding → border → margin. O box-sizing: border-box faz padding e border entrarem na largura total.

margin
border
padding
content
margin — espaço fora do elemento, invisível, não tem background
border — borda que pode ter cor, estilo e radius
padding — espaço dentro do elemento, herda background
content — área de texto e filhos; largura/altura se aplicam aqui
displayblock, inline, flex, grid
Fase 0

Flexbox

Distribuição em uma dimensão (linha ou coluna). Controla alinhamento, ordem e crescimento dos filhos com propriedades do pai e do filho.

display: flex (row padrão)

A
B
C

justify-content: space-between

início
meio
fim

flex-grow: 1 no item do meio

fixo
cresce
fixo

flex-direction: column

topo
meio
base
Fase 0

CSS Grid

Distribuição em duas dimensões. Grid é a ferramenta certa quando você precisa controlar linhas e colunas ao mesmo tempo — layouts de página, cards, dashboards.

1. Sistema de 12 colunas

O padrão da indústria. Cada item declara quantas colunas ocupa com grid-column: span N. Fácil de escalar e de entender em equipe.

span 8grid-column: span 8
span 6metade exata
span 3
span 3
.grid { display: grid; grid-template-columns: repeat(12, 1fr); /* 12 colunas iguais */ gap: 12px; } .item-full { grid-column: span 12; } .item-two-thirds { grid-column: span 8; } .item-half { grid-column: span 6; } .item-quarter { grid-column: span 3; }

2. Placement explícito

Com grid-column: start / end e grid-row você posiciona cada item exatamente onde quer — inclusive sobrepondo células ou criando items que cruzam linhas e colunas.

A — col 1/3 · row 1
B — col 3/5 · row 1/3
C — col 1 · row 2
D — col 2 · row 2
E — col 1/5 · row 3
.grid { display: grid; grid-template-columns: repeat(4, 1fr); grid-template-rows: repeat(3, 60px); } .A { grid-column: 1 / 3; grid-row: 1; } .B { grid-column: 3 / 5; grid-row: 1 / 3; } /* ocupa 2 linhas */ .E { grid-column: 1 / -1; grid-row: 3; } /* -1 = última linha */

3. Named Areas

grid-template-areas mapeia o layout visualmente no CSS com nomes. Cada item recebe grid-area: nome. Facilita muito a leitura e a manutenção.

header
sidebar
main
.layout { display: grid; grid-template-columns: 200px 1fr; grid-template-rows: auto 1fr auto; grid-template-areas: "header header" "sidebar main" "footer footer"; } .header { grid-area: header; } .sidebar { grid-area: sidebar; } .main { grid-area: main; } .footer { grid-area: footer; }

4. auto-fill vs auto-fit

Ambos criam quantas colunas couberem no espaço. A diferença: auto-fill mantém colunas vazias; auto-fit colapsa colunas vazias e distribui o espaço entre os itens existentes.

auto-fill — colunas vazias persistem

1
2
3

auto-fit — itens crescem para preencher

1
2
3
/* auto-fill: mantém "slots" vazios */ grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); /* auto-fit: itens crescem e preenchem o espaço restante */ grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
Regra prática: use auto-fill quando você quer manter a grade consistente mesmo com poucos itens (ex: galeria com espaços reservados). Use auto-fit quando você quer que poucos itens se expandam para ocupar toda a largura disponível (ex: menu de navegação, cards de destaque).

5. Responsividade

Existem três abordagens principais para grids responsivos — cada uma resolve um problema diferente.

✦ Sem media query

O padrão mais poderoso: repeat(auto-fill, minmax(MIN, 1fr)). O grid calcula automaticamente quantas colunas cabem. Arraste a caixa abaixo para ver ao vivo.

grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));

← arraste para redimensionar

A
B
C
D
E
F

✦ Com media queries

Controle preciso por breakpoint. Você define exatamente o layout de cada tamanho de tela. Mais verboso, mas mais previsível para layouts complexos.

/* mobile first */ grid-template-columns: 1fr; /* tablet */ @media (min-width: 640px) { grid-template-columns: 1fr 1fr; } /* desktop */ @media (min-width: 1024px) { grid-template-columns: repeat(3, 1fr); }

✦ Named areas responsivas

Redefina grid-template-areas nos breakpoints para reorganizar o layout por completo — sem mover o HTML. A sidebar vai para baixo do main no mobile.

/* mobile: coluna única */ grid-template-areas: "header" "main" "sidebar" "footer"; @media (min-width: 768px) { grid-template-areas: "header header" "sidebar main" "footer footer"; grid-template-columns: 200px 1fr; }

✦ Container Queries (moderno)

Ao invés de responder à viewport, o grid responde ao tamanho do seu container pai. Perfeito para componentes reutilizáveis em contextos variados.

/* define o container */ .card-wrapper { container-type: inline-size; } /* responde ao container, não à tela */ @container (min-width: 500px) { .grid { grid-template-columns: 1fr 1fr; } }
Simulador de breakpoints

Clique num breakpoint para ver como o layout se reorganiza. Cada um troca o grid-template-columns e o grid-template-areas.

📱 Mobile
<640px
⬜ Tablet
640–1024
🖥 Desktop
1024–1440
⬛ Wide
>1440px
header
sidebar
main
aside
footer

1 coluna — todo conteúdo empilhado verticalmente

6. Boas práticas

Mobile first Comece pelo layout de menor tela (1 coluna) e adicione complexidade com min-width. O CSS base fica menor e a performance em mobile é melhor.
Prefira fr a % A unidade fr distribui o espaço disponível após o gap. Com % você precisa subtrair o gap manualmente — frágil e verboso.
Gap no grid, não margin Use gap para espaçamento interno da grade. Reserve margin para espaçamento externo do componente inteiro — mais limpo e sem efeitos colaterais.
subgrid (moderno) grid-template-columns: subgrid faz um filho participar da grade do avô. Perfeito para alinhar colunas de cards diferentes sem coordenação manual.
Fase 1

Tipografia

Pairing de fontes, hierarquia com clamp() e ritmo vertical via line-height e letter-spacing.

step-4 · Display
Título Hero
step-3 · H1
Seção Principal
step-2 · H2 italic
Subtítulo Serif
step-1 · H3
Cabeçalho de Card
step-0 · Body
Texto de parágrafo com line-height generoso para boa leitura.
step--1 · Label
Uppercase Label Tracking Wide

Playfair Display

Display serif com personalidade editorial. Perfeita para títulos que precisam de caráter e elegância clássica. Combine com uma sans limpa no corpo.

DM Sans

Sans-serif geométrica e legível. Funciona excelente em tamanhos pequenos e longos parágrafos. Traz modernidade ao par serif + sans.

Fase 2

Cor & CSS Avançado

Custom Properties com modelo HSL, gradientes linear, radial e conic, pseudo-elementos ::before / ::after e aspect-ratio.

Guia Completo

Gradients

CSS tem três funções de gradient nativos — linear-gradient, radial-gradient e conic-gradient — além das variantes repeating-*. Todos podem ser combinados em camadas.

1. linear-gradient

Cria uma transição em linha reta. Você define o ângulo (ou direção) e os color stops.

Direção com palavra-chave

Use to right, to bottom, to top left etc. para direções simples.

background: linear-gradient( to right, hsl(220, 80%, 40%), hsl(280, 80%, 60%) );

Ângulo em graus

0deg = de baixo pra cima. 90deg = da esquerda pra direita. 135deg = diagonal.

background: linear-gradient( 135deg, hsl(38, 90%, 50%) 0%, hsl(8, 80%, 45%) 50%, hsl(330,70%, 40%) 100% );

Hard stops (sem transição)

Quando dois stops têm a mesma posição, a transição é instantânea — útil para padrões e listras.

background: linear-gradient( 90deg, hsl(220,80%,50%) 0% 33%, hsl(280,80%,50%) 33% 66%, hsl(340,80%,50%) 66% 100% );
Referência de ângulos
0deg
45deg
90deg
135deg
180deg
225deg
270deg
315deg

2. radial-gradient

Irradia a partir de um ponto de origem. Pode ser círculo ou elipse, e o centro é configurável.

Círculo centralizado

A forma padrão quando largura ≠ altura é ellipse. Use circle para forçar proporção igual.

background: radial-gradient( circle, hsl(38, 90%, 60%), hsl(8, 80%, 30%) );

Elipse com posição customizada

at X% Y% move o centro do gradiente. Ótimo para efeitos de luz vindos de um canto.

background: radial-gradient( ellipse 80% 50% at 30% 40%, hsl(220, 80%, 60%), hsl(260, 60%, 20%) );

Múltiplos radiais em camadas

Empilhe vários radial-gradient separados por vírgula. A primeira camada fica na frente.

background: radial-gradient(circle at 20% 50%, hsl(38,90%,55%,0.8), transparent 40%), radial-gradient(circle at 80% 50%, hsl(220,80%,55%,0.8), transparent 40%), hsl(220, 14%, 10%);

3. conic-gradient

Gira os stops em torno de um ângulo (como um relógio). Perfeito para gráficos de pizza e efeitos rotativos.

Roda de cores simples

Sem especificar graus, os stops se distribuem igualmente ao longo dos 360°.

background: conic-gradient( hsl(220,80%,50%), hsl(280,80%,50%), hsl(340,80%,50%), hsl(220,80%,50%) );

Gráfico de pizza

Defina os stops com valores em deg. Hard stops criam fatias sem transição.

background: conic-gradient( hsl(220,80%,55%) 0deg 120deg, hsl(38, 90%,55%) 120deg 220deg, hsl(140,60%,45%) 220deg 360deg );

from + at (ângulo e posição)

from Ndeg rotaciona o ponto de partida. at X% Y% move o centro.

background: conic-gradient( from 45deg at 30% 60%, hsl(280,70%,50%), hsl(220,80%,50%), hsl(180,70%,40%), hsl(280,70%,50%) );

4. repeating-*

Repete o padrão de stops infinitamente. Ideal para texturas, listras e grades.

repeating-linear-gradient

O padrão se repete automaticamente. O tamanho do ciclo é definido pela posição do último stop.

background: repeating-linear-gradient( 45deg, hsl(220,80%,20%) 0px 10px, hsl(220,80%,30%) 10px 20px );

repeating-radial-gradient

Cria anéis concêntricos. O raio do último stop define o espaçamento entre cada anel.

background: repeating-radial-gradient( circle at center, transparent 0px 12px, hsl(220,80%,30%,0.4) 12px 14px );

Composição em camadas

Qualquer combinação de gradients pode ser empilhada. Use transparent para deixar as camadas inferiores aparecerem.

background: linear-gradient(135deg, hsl(220,80%,50%,0.6), transparent 60%), radial-gradient(ellipse at 80% 20%, hsl(38,90%,55%,0.5), transparent 50%), hsl(220, 14%, 8%);
Experimente: color stops

Clique para ver como o número e posição dos stops afeta o gradient.

Dicas rápidas
Gradients são imagens CSS, não cores. Use background-image ou a shorthand background.
background-size e background-position funcionam em gradients normalmente.
Use hsl(H S% L% / alpha) para transparência sem precisar de rgba().
Gradient em texto: combine background-clip: text + -webkit-text-fill-color: transparent.
Referência

Unidades CSS

Escolher a unidade certa é tão importante quanto escolher o valor. Cada unidade tem um contexto ideal — misturá-las sem critério é uma das causas mais comuns de layouts quebrando em telas diferentes.

Unidade Nome Como funciona
Absolutas
px Pixel 1 pixel de tela (em telas retina, o browser escala internamente). Único valor verdadeiramente fixo — use para bordas, shadows e valores que nunca devem escalar.
Relativas à fonte
rem Root em Relativo ao font-size do elemento html (padrão: 16px). Prefira para tamanhos de fonte e espaçamentos — respeita as preferências de acessibilidade do usuário.
em Em Relativo ao font-size do elemento pai imediato. Pode cascatear e se multiplicar. Use com cuidado — útil para padding interno de botões que deve escalar junto com o texto.
ch Character Largura do caractere "0" na fonte atual. Excelente para definir a largura máxima de parágrafos: max-width: 65ch garante uma linha de leitura confortável em qualquer tamanho de fonte.
ex X-height Altura da letra "x" minúscula. Raramente usado diretamente, mas útil para alinhamentos tipográficos precisos.
Relativas à viewport
vw Viewport width 1% da largura da janela. 100vw = largura total. Use em títulos fluidos (font-size: 5vw) e seções full-width. Cuidado: inclui a barra de rolagem.
vh Viewport height 1% da altura da janela. 100vh em mobile pode incluir a barra de endereço do browser, causando overflow. Para telas mobile, prefira dvh.
dvh Dynamic viewport height Moderno. Atualiza dinamicamente quando a barra de endereço mobile aparece/some. Substitui vh em hero sections e layouts full-screen em mobile.
svh Small viewport height Sempre usa o menor valor possível da viewport (com barra de endereço visível). Garante que o conteúdo caiba sem overflow mesmo no pior caso.
lvh Large viewport height Sempre usa o maior valor possível (barra de endereço escondida). Bom para animações e overlays que precisam cobrir a tela inteira.
vmin Viewport min 1% do menor entre largura e altura. Útil para elementos que precisam ser proporcionais à menor dimensão da tela.
vmax Viewport max 1% do maior entre largura e altura. Menos comum, mas útil para backgrounds e overlays que precisam cobrir toda a tela independente da orientação.
Grid e flex
fr Fraction Distribui o espaço disponível após subtrair gaps e tamanhos fixos. 1fr 2fr divide em 1/3 e 2/3. Exclusiva de grid-template-columns/rows.
Relativas ao container
cqi Container query inline Moderno. 1% da largura do container pai (requer container-type). Parte das Container Queries — o futuro do design responsivo baseado em componente.
Funções que usam unidades
clamp() Min / ideal / max clamp(1rem, 2.5vw, 2rem) — define um valor mínimo, um ideal fluido e um máximo. Fundamental para tipografia e espaçamentos responsivos sem media queries.
min() / max() Mínimo / máximo width: min(100%, 600px) — o elemento nunca ultrapassa 600px mas é fluido em telas menores. Substitui muitos padrões de media query de largura máxima.
calc() Cálculo Mistura unidades diferentes: calc(100% - 2rem). Essencial quando você precisa subtrair padding fixo de uma largura fluida.
rem vs px — por que rem importa

Quando o usuário aumenta o tamanho de fonte padrão do browser (acessibilidade), rem escala junto. px fica fixo e pode quebrar layouts para pessoas com baixa visão.

16px
px — fixo
1rem
= 16px (padrão)
1rem
= 24px (se usuário definiu 24px)
16px
ainda 16px — ignora preferência
Regra prática: use px para bordas, shadows e detalhes que não precisam escalar. Use rem para fontes e espaçamentos. Use % ou fr para larguras de layout. Use dvh ao invés de vh em mobile.
Guia Completo

Texturas em CSS

Texturas podem ser criadas 100% em CSS usando background-image com gradients, padrões repetidos e SVG inline via data URI — sem nenhuma imagem externa.

Como funciona: texturas CSS são ilusões criadas com background-image + background-size + background-repeat. Você define um padrão pequeno e o browser o replica por toda a área. A chave é trabalhar com transparência (hsl(... / 0.X)) para que a textura se sobreponha ao fundo sem dominar.

Dots (bolinhas)

Um radial-gradient de 1–2px repetido cria uma grade de pontos. Muito usado em hero sections.

/* tile: 20×20px, ponto de 1.5px */ background-color: hsl(220, 14%, 8%); background-image: radial-gradient( circle, hsl(220,60%,55%, 0.5) 1.5px, transparent 1.5px ); background-size: 20px 20px;

Grid de linhas

Dois linear-gradient perpendiculares de 1px formam uma grade. Clássico em dashboards e backgrounds técnicos.

background-image: linear-gradient( hsl(220,50%,50%,0.15) 1px, transparent 1px), linear-gradient( 90deg, hsl(220,50%,50%,0.15) 1px, transparent 1px); background-size: 32px 32px;

Listras diagonais

repeating-linear-gradient com espaços transparentes entre as listras cria um padrão sutil de hachura.

background-image: repeating-linear-gradient( 45deg, transparent, transparent 6px, hsl(220,50%,50%,0.12) 6px, hsl(220,50%,50%,0.12) 7px );

Xadrez (checkerboard)

conic-gradient com quatro quadrantes alternados cria o padrão de xadrez — o jeito mais limpo em CSS moderno.

background-image: conic-gradient( hsl(220,50%,30%,0.3) 90deg, transparent 90deg 180deg, hsl(220,50%,30%,0.3) 180deg 270deg, transparent 270deg ); background-size: 24px 24px;

Pontos deslocados

Dois radial-gradient com background-position offset criam um padrão de pontos em quincôncio (offset grid).

background-image: radial-gradient(circle, hsl(38,80%,60%,0.4) 1px, transparent 1px), radial-gradient(circle, hsl(220,80%,60%,0.3) 1px, transparent 1px); background-size: 24px 24px, 24px 24px; background-position: 0 0, 12px 12px;

Ondas concêntricas

repeating-radial-gradient com origem no canto cria arcos que se repetem como ondas de água.

background-image: repeating-radial-gradient( circle at 0 100%, transparent 0, hsl(220,14%,8%) 10px, hsl(220,50%,40%,0.15) 10px 11px, transparent 11px 21px );

Grain / noise

SVG inline com feTurbulence gera ruído fotográfico. Aplicado com baixa opacidade sobre cores sólidas, cria a sensação de material físico.

/* SVG com feTurbulence via data URI */ background-image: url("data:image/svg+xml, <svg><filter id='n'> <feTurbulence baseFrequency='0.9' numOctaves='4'/> </filter> <rect filter='url(%23n)' opacity='0.12'/> </svg>"); background-size: 160px 160px;

Composição: grain + gradiente

A técnica profissional: camadas múltiplas de background-image. Grain na frente, gradiente atrás. O resultado parece pintado à mão.

background: url("data:image/svg+xml,..."), /* grain */ linear-gradient( 135deg, hsl(220,70%,20%), hsl(280,60%,25%) ); /* fundo */ background-size: 160px 160px, cover;

Padrão hexagonal

Dois radial-gradient com posições opostas e offset criam a ilusão de uma grade hexagonal — sem imagem alguma.

background-image: radial-gradient(circle at 0% 50%, transparent 24px, hsl(220,60%,40%,0.2) 25px, transparent 26px), radial-gradient(circle at 100% 50%, transparent 24px, hsl(220,60%,40%,0.2) 25px, transparent 26px); background-size: 50px 30px;
A chave: opacidade da textura

A mesma textura de dots com opacidades diferentes. Quanto mais sutil, mais profissional o resultado.

100%
70%
40%
20%
8%
Dicas de uso
background-size — controla o tamanho do tile. Tiles pequenos (16–32px) criam texturas densas; grandes (64–128px) criam padrões geométricos visíveis.
background-position — desloca o ponto de início do tile. Essencial para criar padrões offset como quincôncio e hex.
mix-blend-mode — aplicar a textura num ::before absoluto com mix-blend-mode: overlay ou multiply integra ela à cor de fundo de forma mais orgânica.
Performance — texturas CSS puras são renderizadas pela GPU e têm performance excelente. Prefira-as a imagens PNG quando possível.
Guia Completo

clip-path

clip-path recorta o elemento em qualquer forma — círculo, polígono, elipse ou inset com bordas arredondadas. Tudo fora da área definida fica invisível, mas o espaço original do elemento ainda é preservado no layout.

Como funciona: você define uma forma geométrica usando funções como circle(), ellipse(), polygon() ou inset(). O browser renderiza apenas o que estiver dentro dessa área. Por ser uma propriedade animável, transições entre shapes ficam fluidas com transition.
/* sintaxe de cada função */ clip-path: circle(raio at cx cy); clip-path: ellipse(rx ry at cx cy); clip-path: polygon(x1 y1, x2 y2, x3 y3, ...); clip-path: inset(top right bottom left round border-radius); clip-path: path('M ...'); /* SVG path — máxima liberdade */

circle()

O uso mais comum — avatares e imagens de perfil redondas sem precisar de border-radius: 50%. Aceita posição do centro.

clip-path: circle(50%); /* posição customizada */ clip-path: circle(40% at 30% 60%);

ellipse()

Como circle() mas com raios independentes para X e Y. Ótimo para banners com corte oval e efeitos de "bolha".

clip-path: ellipse(50% 35% at 50% 50%); /* rx ry at cx cy */

polygon() — triângulo

Cada par de valores é um vértice (x y). O browser liga os pontos em ordem e fecha a forma. Substitui o antigo truque de triângulo com border.

clip-path: polygon( 50% 0%, /* topo centro */ 0% 100%, /* base esquerda */ 100% 100% /* base direita */ );

polygon() — losango

Quatro pontos nos extremos formam um diamante. Muito usado em galerias e cards de destaque com visual geométrico.

clip-path: polygon( 50% 0%, 100% 50%, 50% 100%, 0% 50% );

polygon() — hexágono

Seis vértices calculados manualmente. Para formas regulares complexas, use uma ferramenta como Clippy para gerar as coordenadas.

clip-path: polygon( 25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50% );

polygon() — estrela

Dez vértices alternando picos externos e internos. Shapes assim são difíceis de calcular à mão — use Clippy ou Bennett Feely.

clip-path: polygon( 50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35% );

polygon() — seta

Uma seta apontando para a direita feita com 6 pontos. Útil para badges de etapas, breadcrumbs e indicadores de progresso.

clip-path: polygon( 0% 20%, 60% 20%, 60% 0%, 100% 50%, 60% 100%, 60% 80%, 0% 80% );

inset()

Recorta um retângulo interno ao elemento com offsets de cada lado. O round adiciona border-radius ao recorte.

clip-path: inset( 10px 20px 10px 20px /* top right bottom left */ round 12px /* border-radius */ );

polygon() — corte diagonal

Aplicado a uma seção inteira cria divisores inclinados entre seções — sem SVG de separador. O ponto 100% 80% controla o ângulo.

clip-path: polygon( 0 0, 100% 0, 100% 80%, 0 100% );

Morph no hover

Quando dois shapes têm o mesmo número de pontos, o browser consegue interpolar entre eles com transition. Passe o mouse no card para ver.

.shape { clip-path: circle(50%); transition: clip-path 0.5s cubic-bezier(0.34,1.56,0.64,1); } .shape:hover { clip-path: polygon(50% 0%,100% 50%,50% 100%,0% 50%); }
Dicas importantes
Mesmo nº de pontos para animar Para o morph funcionar com transition, ambos os shapes precisam ter o mesmo número de vértices. Se não tiver, o browser não sabe como interpolar.
Overflow é clipado junto clip-path corta tudo — incluindo box-shadow e bordas que ficarem fora da área. Se precisar de sombra, aplique num elemento pai.
Cliques fora são ignorados A área de clique acompanha o clip. Um botão recortado em triângulo só dispara eventos na área visível — ótimo às vezes, surpreendente outras.
path() para SVG avançado clip-path: path('M...') aceita qualquer path SVG — curvas Bézier, arcos, shapes orgânicas. Ideal para cortes ondulados entre seções.
✂️

Clippy — Bennett Feely

A ferramenta mais usada para gerar clip-path visualmente. Escolha um shape pré-definido ou arraste os pontos livremente — o código CSS é gerado em tempo real.

Guia Completo

::before & ::after

Pseudo-elementos inserem um filho virtual antes ou depois do conteúdo de qualquer elemento — sem tocar no HTML. A única regra obrigatória é que eles precisam de content para existir.

01 A regra obrigatória

Sem content o pseudo-elemento não renderiza. Para efeitos puramente visuais (sem texto), use string vazia.

content: ''; /* sempre necessário */

02 São filhos, não irmãos

O pai precisa de position: relative quando o pseudo for absolute. Eles herdam cor e fonte do pai normalmente.

position: relative; /* no pai */

03 content pode ser dinâmico

Use attr() para puxar o valor de um atributo HTML diretamente — ótimo para tooltips e labels.

content: attr(data-label);

04 São caixas completas

Aceitam width, height, background, border, transform, animation — tudo que um elemento normal aceita.

width: 100%; height: 2px;

Casos de uso na prática

Overlay no hover

Um ::before absoluto com background transparente que escurece no hover. Evita adicionar uma <div> extra no HTML.

.card { position: relative; } .card::before { content: ''; position: absolute; inset: 0; background: hsl(0 0% 0% / 0); transition: background 0.3s ease; } .card:hover::before { background: hsl(0 0% 0% / 0.6); }

Badge / contador

O clássico número vermelho em ícones de notificação — feito com ::after posicionado no canto superior direito do elemento pai.

.icon { position: relative; } .icon::after { content: '3'; position: absolute; top: -6px; right: -6px; width: 20px; height: 20px; background: hsl(38, 90%, 58%); border-radius: 50%; }
Título da Seção

Linha decorativa sob título

Um ::after com position: absolute e bottom: 0 desenha uma linha colorida sob o texto — sem <hr> no HTML.

h2 { position: relative; padding-bottom: 10px; } h2::after { content: ''; position: absolute; bottom: 0; left: 0; width: 40px; height: 3px; background: var(--accent); }
Design é inteligência tornada visível.

Aspas decorativas

O caractere \201C (aspas tipográficas) inserido com content num ::before grande cria um efeito editorial sem imagem.

blockquote::before { content: '\201C'; /* " */ position: absolute; left: 0; top: -8px; font-size: 3rem; color: var(--primary); line-height: 1; }
Passe o mouse aqui

Tooltip com attr()

content: attr(data-tip) lê o atributo HTML do elemento — o tooltip é 100% CSS, sem JavaScript.

[data-tip]::after { content: attr(data-tip); position: absolute; bottom: calc(100% + 10px); opacity: 0; transition: opacity 0.2s; } [data-tip]:hover::after { opacity: 1; }

Borda animada no hover

Dois pseudo-elementos (topo e base) com scaleX(0) que crescem no hover a partir de lados opostos — efeito "desenhar a borda".

.btn::before { /* topo */ transform-origin: left; transform: scaleX(0); } .btn::after { /* base */ transform-origin: right; transform: scaleX(0); } .btn:hover::before, .btn:hover::after { transform: scaleX(1); }
  1. Planejamento
  2. Desenvolvimento
  3. Deploy

Numeração com counter CSS

counter-reset no pai e counter-increment + content: counter() no filho criam numeração personalizada sem <ol> padrão.

.list { counter-reset: items; } li { counter-increment: items; } li::before { content: counter(items, decimal-leading-zero); color: var(--accent); }

Este é um texto longo que vai ser cortado suavemente com um gradiente de fade no final, evitando a quebra abrupta do conteúdo e criando um efeito "tem mais" natural sem JavaScript.

Fade de texto (read-more)

Um ::after com linear-gradient de transparente para o fundo cria o efeito de conteúdo "desaparecendo" — sem clipar o texto abruptamente.

.truncate { position: relative; height: 80px; overflow: hidden; } .truncate::after { content: ''; position: absolute; bottom: 0; left: 0; width: 100%; height: 60px; background: linear-gradient( transparent, var(--surface)); }
  • Hover para ver a animação
  • Setinhas com ::before
  • Zero imagem usada

Ícone em lista personalizada

Substitui o list-style padrão por qualquer caractere ou símbolo — aqui uma seta que anima no hover com transform: translateX.

li { padding-left: 22px; position: relative; } li::before { content: '→'; position: absolute; left: 0; transition: transform 0.2s ease; } li:hover::before { transform: translateX(4px); }
Quando NÃO usar pseudo-elementos: evite colocar conteúdo semântico importante (texto que o usuário precisa ler ou copiar) dentro de content: '' — leitores de tela podem ignorar. Para texto real, use HTML. Para efeitos visuais decorativos, pseudo-elementos são a escolha certa.
Referência

Propriedades‑chave

As propriedades CSS que você mais vai usar no dia a dia, organizadas por categoria — com descrição, valores aceitos e exemplo de código.

display Layout

Define o modelo de formatação do elemento e de seus filhos. É a propriedade mais fundamental do CSS — tudo começa aqui.

block inline inline-block flex grid none
display: flex; /* ativa flexbox */ display: grid; /* ativa grid */ display: none; /* oculta e remove do fluxo */
box-sizing Layout

Define se width e height incluem padding e border. border-box é o padrão sensato — sempre use no reset global.

content-box border-box
/* reset global recomendado */ *, *::before, *::after { box-sizing: border-box; }
flex Layout

Shorthand para flex-grow, flex-shrink e flex-basis. Controla como um item flex cresce, encolhe e qual seu tamanho base.

1 0 0 auto 1 1 300px none
flex: 1; /* cresce e encolhe igualmente */ flex: 0 0 200px; /* fixo em 200px */ flex: 1 1 300px; /* base 300px, flexível */
grid-template-columns Layout

Define as colunas de um grid. A unidade fr distribui o espaço disponível. repeat() e minmax() tornam o grid responsivo.

repeat(3, 1fr) 200px 1fr auto-fill minmax()
grid-template-columns: repeat(12, 1fr); grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); grid-template-columns: 240px 1fr; /* sidebar + main */
gap Layout

Espaçamento entre itens em flex e grid. Substitui margins manuais entre filhos — mais limpo e sem o problema do margin na borda.

8px 1rem 16px 32px
gap: 1rem; /* igual em todos os lados */ gap: 16px 32px; /* row-gap column-gap */
align-items / justify-content Layout

justify-content alinha no eixo principal (horizontal em row). align-items alinha no eixo cruzado (vertical em row). Chave para centralizar qualquer coisa.

center flex-start space-between stretch
/* centralizar vertical e horizontalmente */ display: flex; align-items: center; justify-content: center;
aspect-ratio Layout

Mantém a proporção largura/altura automaticamente. Essencial para imagens, vídeos e cards que precisam ser consistentes independente do tamanho.

1 / 1 16 / 9 4 / 3 auto
aspect-ratio: 1 / 1; /* quadrado perfeito */ aspect-ratio: 16 / 9; /* proporção de vídeo */
background Visual

Shorthand para cor, imagem, posição, tamanho e repetição do fundo. Aceita múltiplas camadas separadas por vírgula — a primeira fica na frente.

color gradient url() múltiplas camadas
background: hsl(220, 14%, 8%); background: linear-gradient(135deg, #1a1a2e, #16213e); background: url(grain.svg), linear-gradient(...);
border-radius Visual

Arredonda os cantos. Pode receber um ou quatro valores (top-left, top-right, bottom-right, bottom-left). Com 50% em elemento quadrado vira círculo.

8px 50% 100px 0 8px 8px 0
border-radius: 8px; /* todos iguais */ border-radius: 50%; /* círculo */ border-radius: 100px; /* pílula */ border-radius: 0 8px 8px 0; /* só lado direito */
box-shadow Visual

Sombra projetada do elemento. Aceita múltiplos valores separados por vírgula. inset cria sombra interna. Blur alto com spread negativo = sombra suave realista.

x y blur color inset múltiplas
box-shadow: 0 4px 24px hsl(0 0% 0% / 0.3); box-shadow: inset 0 1px 0 hsl(0 0% 100% / 0.1); box-shadow: 0 0 0 3px var(--primary); /* ring/focus */
opacity Visual

Transparência do elemento inteiro (incluindo filhos). Diferente de background: hsl(... / 0.5), que afeta só o fundo. Use com cuidado — afeta toda a subárvore.

0 0.5 1
opacity: 0; /* invisível (ainda ocupa espaço) */ opacity: 0.5; /* semitransparente */ opacity: 1; /* totalmente visível */
overflow Visual

Controla o que acontece quando o conteúdo ultrapassa o elemento. hidden é muito usado para "clipar" filhos absolutos e para criar o efeito de border-radius nos filhos.

visible hidden scroll auto clip
overflow: hidden; /* clipa conteúdo e filhos */ overflow: auto; /* scroll só quando necessário */ overflow-x: hidden; /* só no eixo x */
backdrop-filter Visual

Aplica filtros ao conteúdo atrás do elemento. O efeito de "vidro fosco" (glassmorphism) usa blur() com fundo semitransparente.

blur(Npx) brightness() saturate()
/* glassmorphism */ background: hsl(0 0% 100% / 0.08); backdrop-filter: blur(12px); border: 1px solid hsl(0 0% 100% / 0.1);
font-size Tipografia

Tamanho da fonte. Prefira rem (relativo à raiz) para acessibilidade. Com clamp() cria tipografia fluida que escala com a viewport.

1rem clamp() 1.25em vw
font-size: 1rem; font-size: clamp(1rem, 0.9rem + 0.5vw, 1.25rem);
line-height Tipografia

Altura da linha. Valor sem unidade é multiplicador do font-size — prefira assim. Títulos pedem ~1.1–1.2; corpo de texto ~1.5–1.7.

1 1.5 1.65 normal
line-height: 1.15; /* títulos apertados */ line-height: 1.65; /* corpo confortável */
letter-spacing Tipografia

Espaçamento entre letras (kerning manual). Use em para que seja proporcional ao tamanho. Valores negativos em títulos grandes, positivos em labels uppercase.

-0.02em 0 0.06em 0.1em
letter-spacing: -0.02em; /* títulos grandes */ letter-spacing: 0.06em; /* labels uppercase */
text-overflow Tipografia

Controla o que aparece quando o texto ultrapassa. Requer overflow: hidden e white-space: nowrap para funcionar.

ellipsis clip
/* trio para truncar texto com "…" */ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
position Position

Define o esquema de posicionamento. relative cria contexto para filhos absolutos. sticky fixa ao rolar. fixed sai do fluxo e é relativo à viewport.

static relative absolute fixed sticky
position: sticky; /* nav que gruda no topo */ top: 0; z-index: 100;
inset Position

Shorthand para top, right, bottom, left. inset: 0 estica o elemento para cobrir completamente o pai — muito usado com position: absolute.

0 16px 0 auto
position: absolute; inset: 0; /* = top:0; right:0; bottom:0; left:0 */
z-index Position

Ordem de empilhamento no eixo Z. Só funciona em elementos com position diferente de static. Use valores com espaçamento (10, 20, 100) para ter margem de manobra.

0 1 10 100 -1
z-index: -1; /* atrás do pai */ z-index: 10; /* acima do fluxo */ z-index: 100; /* modais, tooltips */
transform Position

Move, rotaciona, escala ou distorce sem afetar o fluxo do documento. É processado pela GPU — prefira a top/left para animações performáticas.

translateX/Y() scale() rotate() skew()
transform: translateY(-4px); /* hover lift */ transform: scale(1.05); /* hover zoom */ transform: translate(-50%, -50%); /* centralizar */
transition Animação

Anima mudanças de propriedades. Recebe: propriedade, duração, easing e delay. Prefira especificar a propriedade ao invés de all para melhor performance.

prop duration easing cubic-bezier() all
transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); transition: opacity 0.2s ease, color 0.2s ease;
animation Animação

Shorthand para animation-name, duration, easing, delay, iteration-count, direction, fill-mode. Usa @keyframes nomeados.

name duration infinite forwards both
animation: fadeUp 0.6s ease both; animation: pulse 2s ease-in-out infinite; animation-delay: 0.2s; /* stagger */
will-change Animação

Avisa o browser com antecedência quais propriedades vão mudar, permitindo otimização. Use com parcimônia — criar muitas camadas de composição prejudica a memória.

transform opacity auto
will-change: transform; /* antes de animar */ will-change: auto; /* depois de animar */
cursor Misc

Muda o cursor do mouse. Um detalhe pequeno que afeta muito a percepção de interatividade — links e botões devem ter pointer, áreas de drag grab.

pointer default grab not-allowed text
cursor: pointer; /* botões e links */ cursor: not-allowed; /* estado desabilitado */ cursor: grab; /* área arrastável */
pointer-events Misc

Controla se o elemento responde a eventos de mouse/toque. none é essencial em pseudo-elementos decorativos que não devem interferir nos cliques.

auto none
pointer-events: none; /* ::before decorativo */ pointer-events: auto; /* padrão */
user-select Misc

Controla se o usuário pode selecionar o texto do elemento. Use none em botões e elementos de UI para evitar a seleção acidental ao clicar rapidamente.

auto none text all
user-select: none; /* botões, ícones */ user-select: all; /* seleciona tudo ao clicar */
resize Misc

Permite que o usuário redimensione o elemento. Requer overflow diferente de visible. Comumente usado para <textarea>.

none both horizontal vertical
resize: none; /* bloqueia redimensionamento */ resize: vertical; /* só vertical (textarea) */
scroll-behavior Misc

Controla o comportamento de rolagem quando acionado por links âncora ou JavaScript. smooth adiciona animação sem precisar de JS.

auto smooth
/* no elemento html */ html { scroll-behavior: smooth; }
Fase 3 · Guia

@keyframes

Um @keyframes define os estados intermediários de uma animação CSS. Você nomeia a animação e descreve o que acontece em cada ponto do tempo — o browser cuida de interpolar entre eles.

Anatomia de um @keyframes: você define pelo menos um ponto de início (from ou 0%) e fim (to ou 100%). Pode adicionar quantos percentuais intermediários quiser. Depois aplica com a propriedade animation no elemento.
/* definição */ @keyframes nomeDaAnimacao { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } /* uso */ .elemento { animation: nomeDaAnimacao /* nome do @keyframes */ 0.6s /* duração */ ease /* easing */ 0.1s /* delay */ 1 /* iteration-count (infinite = loop) */ both; /* fill-mode */ }

Os principais

Passe o mouse em cada card para ver a animação ao vivo.

fadeUp

Sobe de baixo enquanto aparece. O reveal mais usado em landing pages — ativa com IntersectionObserver ao rolar.

@keyframes fadeUp { from { opacity: 0; transform: translateY(24px); } to { opacity: 1; transform: translateY(0); } }

fadeDown

Cai de cima enquanto aparece. Ideal para dropdowns, tooltips e modais que "caem" da barra de navegação.

@keyframes fadeDown { from { opacity: 0; transform: translateY(-24px); } to { opacity: 1; transform: translateY(0); } }

slideIn

Entra pela esquerda. Use para drawers laterais, notificações e conteúdo que aparece a partir de uma borda.

@keyframes slideIn { from { opacity: 0; transform: translateX(-30px); } to { opacity: 1; transform: translateX(0); } }

scaleIn

Cresce de um ponto central. Perfeito para modais, popovers e elementos que "aparecem" do nada na tela.

@keyframes scaleIn { from { opacity: 0; transform: scale(0.8); } to { opacity: 1; transform: scale(1); } }

pulse

Bate como um coração. Use em indicadores de status, badges de notificação e elementos que precisam chamar atenção de forma contínua.

@keyframes pulse { 0%, 100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.08); opacity: 0.7; } }

spin

Rotação contínua. O loader mais simples do CSS — combine com border-radius: 50% e uma borda parcial para um spinner clássico.

@keyframes spin { to { transform: rotate(360deg); } } /* sempre use linear aqui */ animation-timing-function: linear;

shake

Tremida horizontal para indicar erro. Use em formulários com campo inválido — dispare com animation-play-state ou re-adicionando a classe via JS.

@keyframes shake { 0%, 100% { transform: translateX(0); } 20% { transform: translateX(-8px); } 40% { transform: translateX(8px); } 60% { transform: translateX(-5px); } 80% { transform: translateX(5px); } }

bounce

Quica como uma bola. O segredo está nos dois animation-timing-function dentro do keyframe — um acelera na queda, outro desacelera na subida.

@keyframes bounce { 0%, 100% { transform: translateY(0); animation-timing-function: cubic-bezier(0.8,0,1,1); } 50% { transform: translateY(-20px); animation-timing-function: cubic-bezier(0,0,0.2,1); } }

ping

Expande e some como uma onda de radar. Muito usado como anel ao redor de um badge ou indicador de localização em mapas.

@keyframes ping { 0% { transform: scale(1); opacity: 1; } 75%, 100% { transform: scale(2); opacity: 0; } }

shimmer

Brilho que percorre da esquerda para direita. O efeito "skeleton loader" — indica que conteúdo está carregando sem um spinner intrusivo.

@keyframes shimmer { from { background-position: -200% 0; } to { background-position: 200% 0; } } /* exige background-size: 200% */ background: linear-gradient(90deg, #surface 25%, #highlight 50%, #surface 75%); background-size: 200% 100%;
Outros que você vai encontrar

Esses aparecem com frequência em bibliotecas e projetos — vale pesquisar quando precisar.

wiggle flipIn flipOut zoomIn zoomOut slideInRight slideInLeft fadeInLeft fadeInRight rotateIn rollIn heartBeat rubberBand jello tada wobble lightSpeedIn hinge
📖

MDN Web Docs — @keyframes

Documentação completa em português: sintaxe, valores aceitos, exemplos, compatibilidade de browser e propriedades relacionadas como animation-fill-mode, animation-play-state e muito mais.

Animate.css — biblioteca de referência

A biblioteca mais usada de animações CSS prontas. Ótima para estudar os @keyframes reais de efeitos como bounce, wobble, flipIn e os outros da lista acima.

Fase 3

Transitions & cubic-bezier

A propriedade transition anima mudanças de estado. O cubic-bezier define a curva de velocidade — o que separa uma animação mecânica de uma que parece natural.

/* sintaxe completa */ transition: propriedade duração easing delay; /* exemplos */ transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); transition: opacity 0.2s ease, color 0.2s ease; /* múltiplas */
cubic-bezier — passe o mouse em cada botão

Cada botão usa um cubic-bezier diferente no transition. A mesma propriedade (translateY), a mesma duração — só a curva muda.

Ferramenta: use cubic-bezier.com para visualizar e criar suas próprias curvas arrastando os pontos de controle.
Fase 4

Olho de Designer

Corre em paralelo a tudo. Hábitos que elevam o nível técnico e estético.

Deconstruct no DevTools

Abra sites que admira e inspecione cada elemento. Veja margins, paddings reais, qual fonte está sendo usada, como o grid foi montado.

Design Tokens primeiro

Antes de codar, defina suas --variables: cores, tamanhos, espaçamentos. Isso é design system thinking na prática.

Dribbble & Awwwards — 10 min/dia

Curadoria visual diária treina o olho. Você começa a reconhecer padrões, tendências e o que torna um layout memorável.

Clone sites que você admira

A melhor forma de aprender é replicar. Escolha uma seção de um site e tente reproduzir do zero — você vai descobrir técnicas que não imaginava.

Ritmo e consistência

Use múltiplos de 4 ou 8 para espaçamento. Um sistema de espaçamento consistente faz tudo parecer intencional e profissional.

O que vem depois

Próximos passos

Você cobriu os fundamentos. Abaixo estão os tópicos mais importantes para continuar evoluindo — sem aprofundamento aqui, mas cada um merece estudo dedicado.

🎨

filter & backdrop-filter

blur(), brightness(), contrast(), grayscale(), drop-shadow(). Efeitos visuais sem imagem. backdrop-filter aplica na camada atrás do elemento — base do glassmorphism.

filter: blur(8px)
📦

CSS Variables avançado

Fallback com var(--cor, red), herança pelo DOM, atualização via JavaScript, e o padrão de design tokens com escalas numéricas (--space-1 a --space-9).

var(--token, fallback)
📜

scroll-snap

Carrosséis e seções em tela cheia com scroll encaixado — sem JavaScript. scroll-snap-type no container, scroll-snap-align nos filhos.

scroll-snap-type: x mandatory
🌓

prefers-color-scheme

Media query que detecta se o usuário prefere tema claro ou escuro no sistema operacional. Combine com CSS variables para um dark mode sem JavaScript.

@media (prefers-color-scheme: dark)

prefers-reduced-motion

Detecta usuários que pedem menos animação (vestibular, epilepsia). Boas práticas de acessibilidade exigem desativar ou reduzir animações quando essa preferência está ativa.

@media (prefers-reduced-motion: reduce)
📱

Container Queries

O componente responde ao tamanho do seu container, não da viewport. Muda completamente como você pensa design responsivo — componentes verdadeiramente autônomos.

container-type: inline-size
🔀

mix-blend-mode

Como o elemento se mistura visualmente com o que está atrás. multiply, screen, overlay, difference. Muito usado em efeitos de textura e camadas fotográficas.

mix-blend-mode: multiply
✏️

CSS Shapes

shape-outside faz o texto fluir ao redor de formas não-retangulares. shape-inside (ainda draft) fará o texto fluir dentro de uma forma. Editorial avançado.

shape-outside: circle(50%)
🏗️

CSS Grid subgrid

Um item de grid pode expor a grade do avô para seus filhos. Resolve o problema clássico de alinhar conteúdo interno de cards diferentes sem JavaScript.

grid-template-columns: subgrid
🎭

@layer

Cascata explícita: você define a ordem de prioridade das camadas de CSS. Resolve conflitos de especificidade em projetos grandes e ao integrar bibliotecas externas.

@layer base, components, utilities
🔭

View Transitions API

Animações suaves entre estados de página ou componentes com uma linha de CSS e pouco JS. Antes exigia bibliotecas pesadas — agora é nativo no browser.

view-transition-name: hero
📐

Logical Properties

margin-inline, padding-block, inset-inline-start. Propriedades que respeitam a direção de leitura do documento — essencial para layouts internacionalizados (RTL).

margin-inline: auto