UC02651

Construir estilos em CSS

Layout moderno, responsividade e arquitectura

Curso profissional · 25h · TMM

Plano

  1. CSS fundamentos
  2. Layout moderno
  3. Responsive design
  4. CSS avançado
  5. Metodologias e organização
  6. Pré-processadores e ferramentas

Bloco 1 · CSS fundamentos

O que é CSS

CSS (Cascading Style Sheets) define a apresentação do HTML.

selector {
  propriedade: valor;
}
.titulo {
  color: #4F46E5;
  font-size: 2rem;
}

Separa conteúdo (HTML) de aparência (CSS).

Selectores

Selector Selecciona
.classe Por classe
#id Por id
tag Por elemento
a, b Vários
a b Descendente
a > b Filho directo
:hover Estado

As classes são a base de um CSS organizado.

Especificidade

A especificidade decide qual regra ganha em conflito:

inline (1000) > id (100) > classe (10) > tag (1)
  • #menu .item (110) vence .item (10).
  • !important força (evitar).

Manter especificidade baixa e plana facilita manutenção.

Box model

Cada elemento é uma caixa:

┌─ margin ───────────┐
│ ┌─ border ───────┐ │
│ │ ┌─ padding ──┐ │ │
│ │ │  content   │ │ │
│ │ └────────────┘ │ │
│ └────────────────┘ │
└────────────────────┘

box-sizing: border-box faz width incluir padding+border (recomendado).

Cascata e herança

  • Cascata: várias regras aplicam-se por ordem (origem, especificidade, ordem).
  • Herança: alguns valores passam aos filhos (ex: color, font).
body { font-family: sans-serif; }  /* herda para tudo */

Compreender ambas evita "porque é que isto não muda?".

Bloco 2 · Layout moderno

Flexbox

Flexbox alinha elementos numa direcção (linha ou coluna):

.barra {
  display: flex;
  justify-content: space-between; /* eixo principal */
  align-items: center;           /* eixo cruzado */
  gap: 1rem;
}

Ideal para componentes e alinhamentos 1D.

Propriedades flex

Propriedade Efeito
flex-direction row / column
justify-content alinhar no eixo principal
align-items alinhar no eixo cruzado
flex-wrap quebrar linha
gap espaço entre itens
flex: 1 crescer/encolher

Grid

Grid organiza em duas dimensões (linhas e colunas):

.galeria {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1rem;
}

Ideal para layouts de página e grelhas 2D.

Flexbox vs Grid

Usar Flexbox Usar Grid
Alinhar numa direcção Layout 2D
Componentes (barra, cards) Páginas, grelhas
Conteúdo manda o tamanho Layout manda

Costumam combinar-se: Grid para a página, Flex dentro dos blocos.

Bloco 3 · Responsive design

Mobile-first

Desenhar primeiro para o ecrã pequeno, depois acrescentar:

.card { width: 100%; }           /* mobile */

@media (min-width: 768px) {       /* tablet+ */
  .card { width: 50%; }
}

Base simples, melhorias progressivas.

Media queries

@media (min-width: 1024px) {
  .grelha { grid-template-columns: repeat(4, 1fr); }
}

Breakpoints típicos: ~480, 768, 1024, 1280 px. Definir conforme o conteúdo, não dispositivos específicos.

Unidades relativas

Unidade Relativa a
% Elemento pai
rem Raiz (html)
em Fonte do elemento
vw / vh Viewport

Preferir relativas a px para layouts flexíveis e acessíveis.

clamp() e fluidez

clamp(min, ideal, max) cria valores fluidos com limites:

.titulo {
  font-size: clamp(1.5rem, 4vw, 3rem);
}

Tipografia e espaçamentos que escalam sozinhos — menos media queries.

Bloco 4 · CSS avançado

Custom properties (variáveis)

:root {
  --cor-primaria: #4F46E5;
  --espaco: 1rem;
}
.botao {
  background: var(--cor-primaria);
  padding: var(--espaco);
}

Reutilização, temas e manutenção num único ponto. Funcionam em tempo de execução (podem mudar com JS/media query).

calc()

Combina unidades diferentes em cálculos:

.coluna {
  width: calc(100% - 240px);  /* total menos sidebar */
}

Resolve layouts que misturam fixo e fluido.

Pseudo-elementos e pseudo-classes

.link::after { content: '→'; }     /* pseudo-elemento */
.item:hover { color: red; }        /* pseudo-classe */
.item:nth-child(2) { ... }

::before/::after criam conteúdo decorativo sem HTML extra.

Nesting

O CSS moderno suporta aninhamento nativo:

.card {
  padding: 1rem;
  & .titulo { font-weight: bold; }
  &:hover { box-shadow: 0 4px 12px #0002; }
}

Organiza regras relacionadas (como em Sass).

Bloco 5 · Metodologias e organização

Porquê metodologias

CSS cresce e fica caótico. As metodologias dão convenções para:

  • Nomes previsíveis.
  • Especificidade controlada.
  • Componentes reutilizáveis.

BEM

BEM = Block, Element, Modifier:

.card { }              /* Block */
.card__titulo { }      /* Element */
.card--destaque { }    /* Modifier */

Nomes auto-explicativos, especificidade plana, sem conflitos.

Utility-first (Tailwind)

Classes utilitárias compõem o estilo no HTML:

<div class="flex items-center gap-4 p-4 rounded-lg shadow">
  • Rápido, consistente, sem nomear tudo.
  • HTML mais "carregado".

Filosofia oposta ao BEM; ambas válidas.

Arquitectura escalável

  • Ordem: reset → base → layout → componentes → utilitários.
  • Um ficheiro/secção por componente.
  • Variáveis centralizadas.
  • Especificidade baixa e consistente.

Pensar em sistemas, não páginas isoladas.

Bloco 6 · Pré-processadores e ferramentas

Sass

Sass estende o CSS com funcionalidades:

$primaria: #4F46E5;

.botao {
  background: $primaria;
  &:hover { background: darken($primaria, 10%); }
}
  • Variáveis, nesting, mixins, funções.
  • Compila para CSS normal.

Mixins e funções

@mixin flex-centro {
  display: flex;
  justify-content: center;
  align-items: center;
}
.caixa { @include flex-centro; }

Reutilizar blocos de estilo — menos repetição (DRY).

PostCSS

PostCSS transforma CSS com plugins:

  • Autoprefixer: adiciona prefixos de browser.
  • Minificação.
  • Suporte a sintaxe futura.

Parte do build moderno de CSS.

DevTools

O inspector do browser é essencial:

  • Ver e editar CSS ao vivo.
  • Inspeccionar box model e cascata.
  • Depurar layout (grid/flex overlays).
  • Testar responsividade (device mode).

UC02651 · resumo

  • Fundamentos: selectores, especificidade, box model, cascata e herança.
  • Layout moderno: Flexbox (1D) e Grid (2D), combinados.
  • Responsive mobile-first com media queries, unidades relativas e clamp().
  • Avançado: custom properties, calc(), pseudo-elementos, nesting.
  • Organização: BEM, utility-first (Tailwind), arquitectura escalável.
  • Ferramentas: Sass (variáveis, mixins), PostCSS e DevTools.

NOTAS DO PROFESSOR 📖 CSS: separar conteúdo de aparência A ideia fundadora do CSS é a separação de responsabilidades: o HTML diz o que é, o CSS diz como aparece. A anatomia de uma regra — selector, propriedade, valor — é a gramática básica que tudo o resto reutiliza. Convém que os formandos interiorizem desde já que misturar estilo no HTML torna o código difícil de manter. 🗣️ Pontos a desenvolver oralmente • Decompor a sintaxe da regra com vocabulário correcto (selector, propriedade, valor). • Mostrar a mesma página com folhas de estilo diferentes para ilustrar a separação. • Avisar contra estilos inline no HTML como hábito a evitar.

NOTAS DO PROFESSOR 📖 Selectores: apontar ao elemento certo Dominar os selectores é o que dá precisão ao CSS. A mensagem prática é que as classes devem ser a base do trabalho: são reutilizáveis e mantêm a especificidade baixa, ao contrário dos ids. Os combinadores (descendente, filho directo) e os estados (`:hover`) ampliam o que se consegue fazer sem tocar no HTML. 🗣️ Pontos a desenvolver oralmente • Justificar porque preferir classes a ids no estilo do dia-a-dia. • Distinguir descendente (espaço) de filho directo (>). • Antecipar a ligação com a especificidade no slide seguinte.

NOTAS DO PROFESSOR 📖 Especificidade: porque é que o estilo "não pega" A especificidade é a fonte número um de frustração em CSS, e perceber o sistema de pontos resolve a maioria dos problemas. A mensagem central é manter a especificidade baixa e plana, usando classes, para que as regras sejam fáceis de sobrepor. O `!important` deve ser apresentado como um último recurso a evitar, não como solução. 🗣️ Pontos a desenvolver oralmente • Calcular em conjunto a especificidade de alguns selectores de exemplo. • Mostrar um caso real de regra que "não pega" por ser menos específica. • Explicar porque o !important cria uma espiral difícil de gerir.

NOTAS DO PROFESSOR 📖 Box model: tudo é uma caixa Compreender o modelo de caixa é pré-requisito para qualquer layout: cada elemento tem conteúdo, padding, border e margin, em camadas. O ponto que mais simplifica a vida é o `box-sizing: border-box`, que faz a largura incluir padding e border, evitando contas mentais constantes. Recomenda-se aplicá-lo globalmente no reset. 🗣️ Pontos a desenvolver oralmente • Inspeccionar o box model de um elemento no DevTools. • Demonstrar o problema de larguras com content-box vs border-box. • Sugerir o reset universal com box-sizing: border-box.

NOTAS DO PROFESSOR 📖 Cascata e herança: as forças invisíveis do CSS Estes dois mecanismos explicam grande parte dos comportamentos "estranhos" do CSS. A cascata decide qual regra ganha quando há conflito (por origem, especificidade e ordem); a herança faz certos valores passarem dos pais para os filhos. Definir a fonte no `body` e vê-la propagar é a demonstração perfeita da herança. 🗣️ Pontos a desenvolver oralmente • Separar bem cascata (resolver conflitos) de herança (passar valores aos filhos). • Dar exemplos de propriedades que herdam (color, font) e que não herdam (border). • Ligar à frustração comum de "porque é que isto não muda" como motivação.

NOTAS DO PROFESSOR 📖 Flexbox: alinhar numa direcção O Flexbox é a ferramenta para alinhar elementos ao longo de um eixo, ideal para componentes como barras de navegação e cartões. A chave conceptual é distinguir o eixo principal (controlado por `justify-content`) do eixo cruzado (controlado por `align-items`). O `gap` veio simplificar enormemente o espaçamento entre itens. 🗣️ Pontos a desenvolver oralmente • Clarificar a diferença entre eixo principal e eixo cruzado conforme a direcção. • Mostrar centrar vertical e horizontalmente como exemplo clássico. • Reforçar o uso de gap em vez de margens entre itens.

NOTAS DO PROFESSOR 📖 As propriedades que dão controlo ao Flexbox Esta tabela é o kit de ferramentas prático do Flexbox. Vale a pena experimentar cada propriedade ao vivo, porque o Flexbox aprende-se melhor a mexer do que a decorar. O `flex: 1` é particularmente útil: faz um item ocupar o espaço disponível, criando layouts elásticos sem larguras fixas. 🗣️ Pontos a desenvolver oralmente • Demonstrar flex-wrap a partir os itens em várias linhas quando falta espaço. • Mostrar o efeito de flex: 1 num item a "empurrar" os outros. • Reforçar gap como forma limpa de espaçar sem margens.

NOTAS DO PROFESSOR 📖 Grid: pensar em duas dimensões O Grid é a ferramenta certa quando se trabalha em linhas e colunas ao mesmo tempo, como na estrutura de uma página ou numa galeria. O `repeat(3, 1fr)` introduz a unidade `fr`, que distribui o espaço disponível em fracções — um conceito novo e poderoso. Convém deixar claro que Grid e Flexbox não competem, complementam-se. 🗣️ Pontos a desenvolver oralmente • Explicar a unidade fr e como divide o espaço disponível. • Mostrar uma galeria responsiva com repeat e minmax. • Antecipar o slide seguinte: quando escolher Grid vs Flexbox.

NOTAS DO PROFESSOR 📖 Não é Grid OU Flexbox — é Grid E Flexbox Os formandos costumam achar que têm de escolher um dos dois, quando a resposta profissional é combiná-los. A regra prática é simples: Flexbox para alinhar numa direcção (componentes), Grid para estruturas 2D (páginas). O padrão mais comum é Grid para a maquete da página e Flexbox dentro de cada bloco. 🗣️ Pontos a desenvolver oralmente • Desfazer a ideia de rivalidade entre as duas ferramentas. • Dar a regra prática: 1D Flexbox, 2D Grid. • Mostrar um layout real onde os dois coexistem (página em Grid, card em Flex).

NOTAS DO PROFESSOR 📖 Mobile-first: começar pelo ecrã pequeno A abordagem mobile-first não é só uma moda: começar pelo ecrã pequeno obriga a focar no essencial e depois acrescentar à medida que há espaço. Tecnicamente, usar `min-width` nas media queries acumula melhorias do pequeno para o grande, o que mantém o CSS mais limpo. Dado que a maioria do tráfego é móvel, faz todo o sentido. 🗣️ Pontos a desenvolver oralmente • Justificar mobile-first com dados de tráfego móvel. • Contrastar min-width (mobile-first) com max-width (desktop-first). • Reforçar a filosofia de melhoria progressiva.

NOTAS DO PROFESSOR 📖 Media queries: adaptar ao espaço disponível As media queries são o mecanismo que torna o layout responsivo, aplicando regras conforme a largura do ecrã. O conselho mais importante, e que distingue um bom profissional, é definir breakpoints pelo conteúdo — onde o layout "parte" — e não a perseguir tamanhos de telemóveis específicos, que mudam todos os anos. 🗣️ Pontos a desenvolver oralmente • Mostrar como redimensionar a janela revela onde o layout precisa de ajuste. • Avisar contra perseguir modelos de dispositivos concretos. • Apresentar os breakpoints típicos apenas como ponto de partida.

NOTAS DO PROFESSOR 📖 Unidades relativas: layouts que se adaptam As unidades relativas são a base de um design verdadeiramente flexível e acessível. O `rem`, relativo à raiz, é a recomendação para tipografia porque respeita as preferências de tamanho de fonte do utilizador — quem aumenta a fonte do browser vê o site adaptar-se. Fixar tudo em `px` quebra essa acessibilidade. 🗣️ Pontos a desenvolver oralmente • Distinguir rem (raiz) de em (elemento) com um exemplo de aninhamento. • Mostrar o impacto de rem na acessibilidade ao aumentar a fonte do browser. • Explicar vw/vh e cuidados (ex: vh em mobile com barras dinâmicas).

NOTAS DO PROFESSOR 📖 clamp(): fluidez com limites de segurança O `clamp()` é uma das adições mais úteis do CSS moderno: define um valor mínimo, um ideal fluido e um máximo, num único parâmetro. Aplicado à tipografia, faz o texto escalar suavemente com o ecrã sem nunca ficar pequeno demais nem gigante. O resultado é menos media queries e um design mais fluido. 🗣️ Pontos a desenvolver oralmente • Decompor os três argumentos do clamp (mínimo, ideal, máximo). • Demonstrar tipografia fluida a redimensionar a janela. • Contrastar com a abordagem antiga de vários breakpoints para a fonte.

NOTAS DO PROFESSOR 📖 Custom properties: variáveis nativas do CSS As variáveis CSS centralizam valores reutilizados — cores, espaçamentos — num único sítio, facilitando manutenção e temas. A grande diferença face às variáveis de Sass é que estas funcionam em tempo de execução: podem mudar com JavaScript ou dentro de uma media query, o que as torna perfeitas para temas claro/escuro. 🗣️ Pontos a desenvolver oralmente • Mostrar a definição em :root e o uso com var(). • Demonstrar a troca de tema mudando variáveis com uma classe ou JS. • Distinguir das variáveis Sass (compilação) face a estas (tempo de execução).

NOTAS DO PROFESSOR 📖 calc(): misturar unidades num cálculo O `calc()` resolve um problema concreto e frequente: combinar valores fixos com fluidos, como "todo o espaço menos a largura da sidebar". É a ferramenta certa quando uma percentagem pura não chega porque há um elemento de tamanho fixo a descontar. Funciona com qualquer combinação de unidades. 🗣️ Pontos a desenvolver oralmente • Ler o exemplo da coluna: 100% menos a sidebar fixa. • Avisar para os espaços obrigatórios à volta dos operadores. • Mostrar a combinação de calc com custom properties para layouts flexíveis.

NOTAS DO PROFESSOR 📖 Pseudo-elementos e pseudo-classes: estilo extra sem HTML A distinção a fixar é entre pseudo-classes (um estado, como `:hover` ou `:nth-child`) e pseudo-elementos (uma parte criada, como `::before`). O grande valor dos pseudo-elementos é adicionar decoração — ícones, setas, formas — sem poluir o HTML com elementos só para estilo. Mantêm a marcação semântica e limpa. 🗣️ Pontos a desenvolver oralmente • Clarificar a notação: dois pontos para pseudo-classe, dois pontos duplos para pseudo-elemento. • Mostrar :nth-child a estilizar elementos por posição. • Dar exemplos de ::before/::after para ícones e decoração sem HTML extra.

NOTAS DO PROFESSOR 📖 Nesting nativo: organização sem pré-processador O aninhamento, que durante anos só existia em Sass, é agora suportado nativamente no CSS. Permite agrupar regras relacionadas dentro do componente pai, aproximando o que se altera junto e melhorando a leitura. O cuidado a transmitir é não aninhar demasiado fundo, o que faz disparar a especificidade. 🗣️ Pontos a desenvolver oralmente • Mostrar o & a referir o selector pai dentro do bloco. • Avisar contra aninhamento excessivo e o seu efeito na especificidade. • Referir que isto reduz a necessidade de Sass só para nesting.

NOTAS DO PROFESSOR 📖 Porque o CSS precisa de convenções Sem disciplina, o CSS de um projecto cresce e torna-se um emaranhado impossível de manter. As metodologias existem para dar regras partilhadas pela equipa: nomes previsíveis, especificidade controlada e componentes reutilizáveis. Não há uma "certa" universal — há a que a equipa adopta e segue com consistência. 🗣️ Pontos a desenvolver oralmente • Descrever o problema do CSS que cresce sem regras (folha caótica). • Enquadrar metodologia como acordo de equipa, não dogma. • Antecipar BEM e utility-first como duas filosofias opostas válidas.

NOTAS DO PROFESSOR 📖 BEM: nomear com método O BEM dá uma convenção clara para nomear classes: o bloco é o componente, o elemento é uma parte dele, o modificador é uma variante. A vantagem prática é que cada classe é uma classe simples, mantendo a especificidade plana e evitando conflitos. Os nomes ficam longos mas auto-explicativos, o que ajuda quem lê o código depois. 🗣️ Pontos a desenvolver oralmente • Decompor o exemplo card / card__titulo / card--destaque. • Explicar como BEM mantém a especificidade baixa e previsível. • Reconhecer a crítica (nomes verbosos) e quando compensa.

NOTAS DO PROFESSOR 📖 Utility-first: compor estilo no HTML A abordagem utilitária, popularizada pelo Tailwind, inverte a lógica: em vez de nomear componentes, compõe-se o estilo com pequenas classes directamente no HTML. Ganha-se velocidade e consistência (os valores vêm de um sistema fixo), à custa de um HTML mais "carregado". É a filosofia oposta ao BEM, e ambas são defensáveis conforme o projecto e a equipa. 🗣️ Pontos a desenvolver oralmente • Ler a linha de classes do exemplo e traduzir cada utilitário. • Pesar prós (rápido, consistente) e contras (HTML verboso). • Posicionar como alternativa, não substituto absoluto, ao BEM.

NOTAS DO PROFESSOR 📖 Arquitectura: pensar em sistemas, não páginas Este slide eleva o olhar do detalhe para a estrutura: um CSS escalável organiza-se por camadas (reset, base, layout, componentes, utilitários) com uma ordem intencional. Variáveis centralizadas e especificidade consistente são o que permite o projecto crescer sem ruir. A mudança de mentalidade é deixar de pensar em páginas e começar a pensar em componentes reutilizáveis. 🗣️ Pontos a desenvolver oralmente • Explicar porque a ordem das camadas importa (a cascata). • Ligar à reutilização: um componente bem feito serve várias páginas. • Relacionar com design systems do mundo profissional.

NOTAS DO PROFESSOR 📖 Sass: superpoderes que compilam para CSS O Sass estende o CSS com funcionalidades de programação — variáveis, nesting, mixins, funções — e depois compila tudo para CSS normal que o browser entende. Convém enquadrar que, com a evolução do CSS nativo (variáveis, nesting), o Sass perdeu parte da relevância, mas continua útil em projectos grandes pelos mixins e funções como `darken()`. 🗣️ Pontos a desenvolver oralmente • Sublinhar o passo de compilação: o browser nunca vê Sass. • Mostrar funções de cor (darken/lighten) como vantagem face ao CSS puro. • Contextualizar o que já é nativo em CSS e o que ainda compensa em Sass.

NOTAS DO PROFESSOR 📖 Mixins: empacotar estilo reutilizável Os mixins são a resposta do Sass ao princípio DRY (não te repitas): empacota-se um conjunto de declarações e reutiliza-se com `@include` onde for preciso. O exemplo do centramento flex é perfeito porque é um padrão que se repete imensas vezes. Ao contrário das variáveis, um mixin pode conter regras inteiras e até receber parâmetros. 🗣️ Pontos a desenvolver oralmente • Distinguir mixin (bloco de regras) de variável (um valor). • Mostrar um mixin com parâmetros para o tornar flexível. • Ligar ao princípio DRY e à manutenção centralizada.

NOTAS DO PROFESSOR 📖 PostCSS: transformar CSS com plugins O PostCSS é uma ferramenta de processamento que aplica plugins ao CSS durante o build. O exemplo mais útil é o Autoprefixer, que adiciona automaticamente os prefixos de browser, libertando o developer de os escrever à mão. Não é um concorrente do Sass — muitas vezes correm juntos no mesmo pipeline. 🗣️ Pontos a desenvolver oralmente • Explicar o que são prefixos de browser e porque o Autoprefixer poupa trabalho. • Posicionar PostCSS como parte do build, transparente para quem escreve CSS. • Referir que Sass e PostCSS coexistem no fluxo moderno.

NOTAS DO PROFESSOR 📖 DevTools: o laboratório do CSS O inspector do browser é a ferramenta mais importante do dia-a-dia de quem escreve CSS, e muitos juniores subutilizam-no. Permite editar estilos ao vivo sem tocar nos ficheiros, ver o box model, perceber a cascata e até depurar grelhas e flex com overlays visuais. O device mode é essencial para testar responsividade sem trocar de equipamento. 🗣️ Pontos a desenvolver oralmente • Demonstrar a edição de CSS ao vivo no painel Styles. • Mostrar os overlays de grid/flex para depurar layout. • Usar o device mode para simular vários tamanhos de ecrã.