Identificação
- Duração: 2 horas
- Tipo: teoria aplicada e laboratório
- Entrega: landing page estilizada para celular e desktop
- Código de referência:
../exemplos/aula-1.2/index.html - Folha de estilos:
../exemplos/aula-1.2/assets/styles.css
Introdução
O que é CSS?
CSS significa Cascading Style Sheets, ou Folhas de Estilo em Cascata. É a linguagem utilizada para controlar apresentação, cores, fontes, espaçamento, tamanhos, posicionamento e layout dos elementos HTML.
HTML declara que um conteúdo é um botão. CSS define como esse botão será apresentado:
button {
color: white;
background: blue;
border-radius: 8px;
}
Por que o nome possui “cascata”?
Uma página pode receber regras de várias fontes. A cascata é o conjunto de critérios utilizado pelo navegador para decidir qual regra será aplicada quando mais de uma declaração tenta modificar a mesma propriedade.
Não se trata apenas de “a última regra sempre vence”. Origem, importância, especificidade e ordem participam da decisão.
O que é design responsivo?
É a capacidade da interface de se adaptar ao espaço disponível. A mesma página deve continuar utilizável em celular, tablet, notebook, monitor grande e situações de zoom.
Responsividade não significa diminuir tudo. Significa reorganizar conteúdo e controles de maneira apropriada:
Celular -> uma coluna, controles confortáveis, leitura vertical
Desktop -> mais colunas quando houver espaço e benefício
CSS funciona diretamente no navegador. Não é necessário utilizar um framework para criar uma página responsiva.
Objetivos
Ao final da aula, o aluno deverá conseguir:
- explicar cascata, herança e especificidade;
- utilizar seletores sem acoplar o CSS excessivamente ao HTML;
- criar um sistema visual com propriedades personalizadas;
- compreender o box model;
- construir layouts com Flexbox e Grid;
- aplicar a estratégia mobile first;
- criar estados acessíveis de foco e interação;
- respeitar preferências de redução de movimento;
- testar a interface em diferentes larguras.
Pré-requisitos
- conclusão das aulas 1.1 e 1.2;
- estrutura semântica da landing page;
- formulário com rótulos associados;
- navegação interna funcionando.
Pergunta orientadora
Como transformar uma estrutura semântica em uma interface agradável sem perder acessibilidade, clareza ou capacidade de manutenção?
Roteiro sugerido
| Etapa | Duração |
|---|---|
| Responsabilidades de HTML e CSS | 10 min |
| Cascata, herança e especificidade | 20 min |
| Box model e sistema visual | 20 min |
| Flexbox e Grid | 25 min |
| Responsividade mobile first | 20 min |
| Laboratório e validação | 25 min |
1. Conectando o CSS
Dentro do head:
<link rel="stylesheet" href="assets/styles.css">
O navegador realizará uma nova requisição para carregar a folha de estilos.
Crie:
knowledge-ai/
|-- index.html
`-- assets/
|-- fluxo-conhecimento.svg
`-- styles.css
2. Anatomia de uma regra
.hero__title {
max-width: 12ch;
color: #ffffff;
font-size: 4rem;
}
.hero__titleé o seletor;coloré uma propriedade;#ffffffé o valor;- cada combinação de propriedade e valor é uma declaração.
3. Cascata
Quando mais de uma regra afeta o mesmo elemento, o navegador precisa decidir qual será aplicada.
Essa decisão considera:
- origem e importância;
- especificidade;
- ordem de declaração.
Exemplo:
p {
color: #44546a;
}
.hero__description {
color: #d6deea;
}
O parágrafo que possui a classe hero__description recebe a segunda cor porque o seletor é mais específico.
Evite competir com o próprio CSS
/* Difícil de manter */
body main section#recursos article h3 {
color: blue !important;
}
Prefira:
.feature-card__title {
color: var(--color-primary);
}
4. Herança
Algumas propriedades, como color e font-family, normalmente passam do elemento pai para seus descendentes.
body {
color: #14213d;
font-family: system-ui, sans-serif;
}
Outras propriedades, como margin, border e width, não são herdadas normalmente.
Utilize o DevTools para observar quais regras foram herdadas e quais foram sobrescritas.
5. Box model
Todo elemento é representado como uma caixa:
margin
border
padding
conteúdo
Adote:
*,
*::before,
*::after {
box-sizing: border-box;
}
Com border-box, largura e altura incluem padding e borda, tornando o dimensionamento mais previsível.
6. Propriedades personalizadas
Defina os principais tokens visuais em :root:
:root {
--color-ink: #122033;
--color-muted: #647187;
--color-primary: #3156d8;
--color-accent: #32d5c8;
--color-surface: #ffffff;
--color-surface-soft: #f4f7fb;
--radius-card: 20px;
--content-width: 1120px;
}
Uso:
.button {
color: var(--color-surface);
background: var(--color-primary);
border-radius: var(--radius-card);
}
Benefícios
- consistência;
- manutenção;
- temas;
- menor repetição;
- decisões visuais explícitas.
7. Unidades
| Unidade | Uso comum |
|---|---|
px |
bordas, detalhes e limites específicos |
rem |
tipografia e espaçamento |
% |
dimensões relativas ao elemento pai |
vw e vh |
dimensões relativas à tela |
ch |
largura aproximada baseada em caracteres |
fr |
distribuição de espaço no Grid |
Exemplo de título fluido:
.hero h1 {
font-size: clamp(2.5rem, 7vw, 5rem);
}
clamp define valor mínimo, preferencial e máximo.
8. Container
Um container impede que o conteúdo fique excessivamente largo:
.container {
width: min(calc(100% - 2rem), 70rem);
margin-inline: auto;
}
100% - 2remcria espaço nas laterais;70remlimita a largura;margin-inline: autocentraliza.
9. Flexbox
Flexbox é adequado para organizar elementos em uma dimensão principal.
Exemplo no cabeçalho:
.site-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
}
Aplicações:
- cabeçalhos;
- navegações;
- grupos de botões;
- alinhamento de ícone e texto;
- linhas que podem quebrar.
10. Grid
Grid é adequado para linhas e colunas.
.feature-grid {
display: grid;
gap: 1rem;
}
@media (min-width: 48rem) {
.feature-grid {
grid-template-columns: repeat(3, 1fr);
}
}
No celular existe uma coluna. Em telas maiores, três colunas.
11. Mobile first
Mobile first significa escrever primeiro as regras para telas menores e adicionar melhorias conforme o espaço aumenta.
.hero__content {
display: grid;
gap: 2rem;
}
@media (min-width: 60rem) {
.hero__content {
grid-template-columns: 1.15fr 0.85fr;
align-items: center;
}
}
Isso não significa criar uma versão reduzida ou inferior. O conteúdo e os fluxos essenciais continuam disponíveis.
12. Imagens responsivas
img {
display: block;
max-width: 100%;
height: auto;
}
Os atributos width e height no HTML continuam úteis: ajudam o navegador a reservar espaço antes do arquivo terminar de carregar.
13. Estados interativos
Links, botões e campos precisam comunicar estados.
.button:hover {
background: var(--color-primary-dark);
}
.button:focus-visible {
outline: 3px solid var(--color-accent);
outline-offset: 3px;
}
input:invalid:not(:placeholder-shown) {
border-color: var(--color-danger);
}
Não dependa apenas de cor para comunicar uma informação importante.
Foco
Defina uma alternativa visível:
:focus-visible {
outline: 3px solid var(--color-accent);
outline-offset: 3px;
}
14. Contraste
O texto precisa se diferenciar do fundo.
Cuidados:
- cinza muito claro em fundo branco;
- texto sobre imagens;
- botões com texto sem contraste;
- placeholders usados como informação essencial;
- estados representados apenas por mudança sutil de cor.
Utilize as ferramentas do navegador para conferir o contraste das combinações principais.
15. Movimento
Animações devem ser sutis e opcionais.
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
*,
*::before,
*::after {
transition-duration: 0.01ms !important;
animation-duration: 0.01ms !important;
}
}
Essa preferência ajuda pessoas que sentem desconforto com movimento.
16. Laboratório guiado
Passo 1 - Reset mínimo
Adicione:
*,
*::before,
*::after {
box-sizing: border-box;
}
body {
margin: 0;
}
Passo 2 - Sistema visual
Defina:
- cores;
- largura máxima;
- raios;
- sombras;
- fonte;
- espaçamento.
Passo 3 - Cabeçalho
Utilize Flexbox para:
- alinhar marca e navegação;
- permitir quebra em telas pequenas;
- criar estados de hover e foco.
Passo 4 - Hero
No celular:
- texto acima da figura;
- botões com área confortável;
- título fluido.
No desktop:
- texto e figura em colunas;
- largura de leitura controlada.
Passo 5 - Como funciona e recursos
Utilize Grid:
- uma coluna no celular;
- três colunas em telas maiores;
- espaçamento uniforme;
- cartões com altura consistente.
Passo 6 - Formulário
Estilize:
- rótulos;
- ajuda;
- inputs;
- select;
- checkbox;
- botão;
- foco;
- campos inválidos.
Passo 7 - Rodapé
Organize contato e navegação sem reduzir demais o texto.
17. Testes de responsividade
Teste pelo menos:
| Largura | Cenário |
|---|---|
| 320 px | celular pequeno |
| 375 px | celular comum |
| 768 px | tablet |
| 1024 px | notebook |
| 1440 px | desktop |
Verifique:
- existe rolagem horizontal indesejada?
- textos estão cortados?
- botões permanecem utilizáveis?
- o formulário cabe na tela?
- a navegação quebra de forma compreensível?
- a ordem visual acompanha a ordem do documento?
Não escolha tamanhos com base em aparelhos específicos. Crie breakpoints quando o conteúdo precisar de outra organização.
18. Exercício de fixação
Crie uma variação visual utilizando apenas os tokens de :root.
Altere:
- cor primária;
- cor de destaque;
- fundo do hero;
- raio dos cartões;
- intensidade da sombra.
Nenhuma regra de componente deve ser alterada.
19. Desafio individual
Adicione uma seção de depoimento contendo:
- citação;
- nome;
- função;
- empresa fictícia;
- imagem decorativa ou avatar com texto alternativo adequado.
Critérios:
- deve funcionar entre 320 e 1440 pixels;
- a citação deve utilizar
blockquote; - não pode causar rolagem horizontal;
- precisa manter contraste adequado;
- deve respeitar o sistema de espaçamento existente.
20. Erros comuns
Utilizar largura fixa
/* Pode ultrapassar telas pequenas */
.card {
width: 600px;
}
Prefira limites flexíveis:
.card {
width: 100%;
max-width: 37.5rem;
}
Criar media queries para cada aparelho
Breakpoints devem responder ao conteúdo, não a uma lista de modelos de telefone.
Abusar de position: absolute
Elementos absolutos deixam o fluxo normal e podem sobrepor conteúdos.
Usar !important para corrigir conflitos
Primeiro revise cascata, especificidade e organização dos seletores.
Definir alturas fixas para conteúdo textual
Textos podem aumentar devido a tradução, zoom ou preferências do usuário.
Ocultar conteúdo essencial no celular
Responsividade reorganiza conteúdo; não deve eliminar informação necessária.
Remover foco
Nunca remova outline sem fornecer uma alternativa clara.
21. Lista de verificação de entrega
- O CSS está em arquivo externo.
-
box-sizing: border-boxfoi aplicado. - Cores e medidas recorrentes utilizam variáveis.
- A página possui largura de leitura controlada.
- O cabeçalho utiliza Flexbox.
- Os cartões utilizam Grid.
- Imagens são responsivas.
- O título utiliza tamanho fluido.
- O foco é visível.
- Hover não é o único estado disponível.
- O formulário pode ser utilizado em 320 px.
- Não existe rolagem horizontal.
- A interface respeita redução de movimento.
- O HTML continua semanticamente correto.
22. Critérios de aceite
A entrega será aceita quando:
- funcionar entre 320 e 1440 pixels;
- não apresentar rolagem horizontal;
- possuir hierarquia visual clara;
- manter o foco visível;
- utilizar Flexbox e Grid adequadamente;
- não depender de
!important, exceto no ajuste de redução de movimento; - utilizar um sistema de propriedades personalizadas;
- manter formulário e navegação acessíveis;
- não apresentar erros de carregamento ou console;
- o aluno explicar pelo menos uma decisão de breakpoint.
23. Perguntas para revisão
- O que a cascata resolve?
- Quais propriedades normalmente são herdadas?
- Como
border-boxmodifica o cálculo de largura? - Quando Flexbox é mais adequado?
- Quando Grid é mais adequado?
- O que significa mobile first?
- Por que não devemos definir breakpoints por aparelho?
- Para que serve
clamp? - Por que o foco precisa permanecer visível?
- O que
prefers-reduced-motionrepresenta?
Próxima aula
Na Aula 1.4, JavaScript será utilizado para controlar o formulário, validar dados, apresentar retorno e atualizar a interface sem recarregar a página.