Este manual explora os fundamentos e as técnicas avançadas do CSS para criar interfaces de usuário modernas, responsivas e visualmente atraentes.
O CSS (Cascading Style Sheets) é a linguagem utilizada para estilizar documentos HTML. Ele descreve como os elementos HTML devem ser exibidos.
Uma regra CSS consiste em um seletor e um bloco de declaração.
seletor {
propriedade: valor;
propriedade: valor;
}
p
, h1
,
.classe
, #id
).
color
, font-size
) e um
valor (como você quer mudar a propriedade, e.g.,
blue
, 16px
), separados por dois pontos
(:
). Cada declaração termina com um ponto e vírgula
(;
).
Exemplo:
p {
color: #333;
font-family: Arial, sans-serif;
font-size: 16px;
}
Existem três formas principais de incluir CSS em seu documento HTML:
.css
separado.
<head>
<link rel="stylesheet" href="style.css" />
</head>
<style>
no <head>
do HTML.
<head>
<style>
h1 {
color: navy;
}
</style>
</head>
style
.
<h2 style="color: green;">Este é um título verde</h2>
Desvantagem: Dificulta a manutenção e a reutilização do código.
p
, div
,
a
).
class
específico (e.g.,
.minha-classe
).
id
específico (e.g., #meu-id
). IDs devem
ser únicos por página.
*
).
[type="text"]
).
div p
).
ul > li
).
h1 + p
).
h1 ~ p
).
!important
pode
sobrescrever a especificidade, mas seu uso deve ser evitado devido à
dificuldade de manutenção.
Todos os elementos HTML são tratados como caixas pelo CSS. O modelo de caixa consiste em:
div {
width: 200px;
height: 100px;
padding: 20px; /* 20px em todos os lados */
border: 1px solid black;
margin: 10px; /* 10px em todos os lados */
/* Propriedades individuais */
padding-top: 10px;
padding-right: 15px;
padding-bottom: 20px;
padding-left: 25px;
/* Shorthand: top right bottom left */
margin: 10px 20px 30px 40px;
}
A propriedade box-sizing
é crucial:
content-box
(padrão): width
e
height
incluem apenas o conteúdo. Padding e borda
adicionam ao tamanho total.
border-box
: width
e height
incluem padding e borda. Mais intuitivo para layout.
* {
box-sizing: border-box; /* Recomendado para todos os elementos */
}
Flexbox e Grid são ferramentas poderosas para criar layouts complexos e responsivos.
Ideal para organizar itens em uma única dimensão (linha ou coluna).
.container {
display: flex; /* Transforma o elemento em um container flex */
flex-direction: row; /* Ou column, row-reverse, column-reverse */
justify-content: center; /* Alinha itens no eixo principal (horizontal por padrão) */
align-items: center; /* Alinha itens no eixo transversal (vertical por padrão) */
flex-wrap: wrap; /* Permite que os itens quebrem para a próxima linha */
gap: 10px; /* Espaço entre os itens */
}
.item {
flex-grow: 1; /* Permite que o item cresça para preencher o espaço disponível */
flex-shrink: 1; /* Permite que o item encolha se não houver espaço */
flex-basis: 100px; /* Tamanho inicial do item */
/* Shorthand: flex: grow shrink basis; */
align-self: flex-start; /* Alinha este item individualmente no eixo transversal */
order: 1; /* Define a ordem visual dos itens */
}
Ideal para organizar itens em duas dimensões (linhas e colunas), perfeito para layouts de página inteira.
.grid-container {
display: grid; /* Transforma o elemento em um container grid */
grid-template-columns: 1fr 2fr 1fr; /* Três colunas com larguras relativas */
/* Ou: repeat(3, 1fr); 100px auto 200px; */
grid-template-rows: auto 100px; /* Duas linhas */
gap: 15px; /* Espaço entre as células (linhas e colunas) */
grid-template-areas:
"header header header"
"nav main aside"
"footer footer footer"; /* Define áreas nomeadas para o layout */
}
.grid-item {
grid-column: 1 / 3; /* Ocupa da linha de coluna 1 até a 3 (exclusiva) */
grid-row: 2; /* Ocupa a linha 2 */
/* Ou usando áreas nomeadas: */
grid-area: main; /* Associa o item à área 'main' */
}
Aplicações web modernas precisam se adaptar a diferentes tamanhos de tela (desktops, tablets, celulares).
Essencial para a responsividade. Coloque no <head>
do HTML:
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
width=device-width
: Define a largura do viewport para a
largura do dispositivo.
initial-scale=1.0
: Define o nível de zoom inicial.
Permitem aplicar estilos CSS diferentes com base nas características do dispositivo (largura, altura, orientação, etc.).
/* Estilos padrão para telas grandes */
body {
font-size: 18px;
}
/* Estilos para telas com largura máxima de 768px (tablets e celulares) */
@media (max-width: 768px) {
body {
font-size: 16px;
}
.container {
flex-direction: column; /* Em colunas em telas menores */
}
}
/* Estilos para telas com largura mínima de 992px (desktops) */
@media (min-width: 992px) {
.hero-section {
padding: 100px 50px;
}
}
/* Para orientação paisagem em telas pequenas */
@media (max-width: 600px) and (orientation: landscape) {
/* ... */
}
Evite unidades fixas (pixels) para larguras e alturas. Use unidades relativas que se adaptam:
%
(Porcentagem): Relativa ao elemento
pai.
em
: Relativa ao font-size
do elemento pai.
rem
: Relativa ao
font-size
do elemento raiz (<html>
).
vw
(Viewport Width): 1vw é 1% da
largura do viewport.
vh
(Viewport Height): 1vh é 1% da
altura do viewport.
min()
/max()
/clamp()
: Funções CSS para definir valores com limites, muito úteis para
tipografia responsiva.
Exemplo de Tipografia Responsiva:
h1 {
font-size: clamp(2rem, 5vw + 1rem, 4rem); /* min, ideal, max */
}
max-width: 100%
e height: auto
:
Permite que a imagem encolha e expanda proporcionalmente.
img {
max-width: 100%;
height: auto;
display: block; /* Remove espaço extra abaixo da imagem */
}
<picture>
: Permite
servir diferentes versões de uma imagem com base nas media queries.
<picture>
<source srcset="large.jpg" media="(min-width: 900px)" />
<source srcset="medium.jpg" media="(min-width: 600px)" />
<img src="small.jpg" alt="Descrição da imagem" />
</picture>
A tipografia impacta diretamente a legibilidade e a estética da sua aplicação.
font-family
: Define a fonte (e.g.,
Arial, sans-serif
). Use fontes do Google Fonts ou web
fonts para mais opções.
font-size
: Tamanho da fonte (e.g.,
16px
, 1.2rem
, clamp()
).
font-weight
: Espessura da fonte (e.g.,
normal
, bold
, 400
,
700
).
line-height
: Espaçamento entre as
linhas (e.g., 1.5
para 150% do
font-size
).
text-align
: Alinhamento do texto
(e.g., left
, center
, right
,
justify
).
text-decoration
: Linhas no texto (e.g.,
none
, underline
,
line-through
).
letter-spacing
: Espaçamento entre as
letras.
word-spacing
: Espaçamento entre as
palavras.
text-transform
: Transforma o texto
(e.g., uppercase
, lowercase
,
capitalize
).
color
: Cor do texto.
As cores são fundamentais para a identidade visual.
Pode ser definido por:
red
, blue
,
green
.
rgb(255, 0, 0)
(Vermelho).
rgba(255, 0, 0, 0.5)
(Vermelho
com 50% de opacidade).
#FF0000
(Vermelho).
hsl(0, 100%, 50%)
(Vermelho).
hsla(0, 100%, 50%, 0.5)
(Vermelho
com 50% de opacidade).
background-color
: Cor de fundo.
background-image
: Imagem de fundo
(e.g., url('imagem.png')
).
background-repeat
: Como a imagem se
repete (e.g., no-repeat
, repeat-x
,
repeat-y
).
background-position
: Posição da imagem
(e.g., center
, top left
,
50% 50%
).
background-size
: Tamanho da imagem
(e.g., cover
, contain
,
100% auto
).
background-attachment
: Como a imagem se
comporta ao rolar (e.g., scroll
, fixed
,
local
).
Shorthand para Background:
div {
background: #f0f0f0 url('hero.jpg') no-repeat center center / cover;
}
Crie transições suaves entre cores.
linear-gradient()
:
div {
background: linear-gradient(to right, #ff7e5f, #feb47b);
}
radial-gradient()
:
div {
background: radial-gradient(circle at center, #7b4397, #dc2430);
}
Selecionam elementos com base em seu estado.
:hover
: Quando o mouse está sobre o
elemento.
:active
: Quando o elemento está sendo
clicado.
:focus
: Quando o elemento de formulário
está em foco.
:nth-child(n)
: Seleciona o n-ésimo
filho.
:first-child
/ :last-child
: Primeiro/último filho.
:root
: O elemento raiz do documento
(<html>
).
:not(seletor)
: Seleciona elementos que
não correspondem ao seletor.
Exemplo:
a:hover {
color: blue;
text-decoration: underline;
}
input:focus {
border-color: #007bff;
box-shadow: 0 0 5px rgba(0, 123, 255, 0.5);
}
li:nth-child(odd) {
background-color: #f9f9f9;
}
Selecionam e estilizam partes específicas de um elemento.
::before
/ ::after
:
Insere conteúdo antes/depois do elemento. Requer a propriedade
content
.
::first-letter
: A primeira letra de um
bloco de texto.
::first-line
: A primeira linha de um
bloco de texto.
::selection
: A parte do texto
selecionada pelo usuário.
Exemplo:
h2::before {
content: "✨ ";
}
p::first-letter {
font-size: 2em;
font-weight: bold;
float: left;
margin-right: 0.1em;
}
::selection {
background-color: #007bff;
color: white;
}
Essas propriedades são cruciais para adicionar "suavidade" e uma experiência profissional.
Permitem mudar gradualmente de um estado para outro.
.button {
background-color: #007bff;
color: white;
padding: 10px 20px;
border: none;
cursor: pointer;
transition:
background-color 0.3s ease-in-out,
color 0.3s ease-in-out; /* Quais propriedades transicionar e tempo */
}
.button:hover {
background-color: #0056b3;
color: #f8f9fa;
}
/* Propriedades da transição: */
/* transition-property: qual propriedade será transicionada (e.g., color, all) */
/* transition-duration: duração da transição (e.g., 0.5s, 300ms) */
/* transition-timing-function: curva de velocidade (e.g., ease, linear, ease-in, ease-out, ease-in-out, cubic-bezier(...)) */
/* transition-delay: atraso antes de iniciar a transição */
Permitem criar sequências de animação mais complexas com keyframes.
@keyframes
:
@keyframes slideIn {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.element {
animation-name: slideIn;
animation-duration: 0.8s;
animation-timing-function: ease-out;
animation-delay: 0.2s;
animation-iteration-count: 1; /* ou infinite */
animation-direction: normal; /* ou alternate */
animation-fill-mode: forwards; /* Mantém o estado final da animação */
}
/* Shorthand: */
.element {
animation: slideIn 0.8s ease-out 0.2s forwards;
}
Permitem manipular a forma e a posição dos elementos.
translate(x, y)
: Move o elemento.
rotate(angle)
: Gira o elemento.
scale(x, y)
: Redimensiona o elemento.
skew(x-angle, y-angle)
: Inclina o
elemento.
Exemplo:
.card:hover {
transform: rotate(5deg) scale(1.05);
}
Requerem a propriedade perspective
no elemento pai para
criar um espaço 3D.
translate3d(x, y, z)
: Move em 3 eixos.
rotateX(angle)
: Gira em torno do eixo
X.
rotateY(angle)
: Gira em torno do eixo
Y.
rotateZ(angle)
: Gira em torno do eixo
Z.
scale3d(x, y, z)
: Redimensiona em 3
eixos.
Exemplo:
.flip-container {
perspective: 1000px; /* Cria o espaço 3D */
}
.flipper {
transition: transform 0.6s;
transform-style: preserve-3d; /* Garante que os filhos são renderizados em 3D */
}
.flip-container:hover .flipper {
transform: rotateY(180deg);
}
Garantir que sua aplicação seja utilizável por todos.
<button>
, <a>
,
<input>
) tenham um estado de foco visível (e.g.,
outline
ou box-shadow
) para usuários de
teclado.
button:focus,
a:focus {
outline: 2px solid #007bff;
outline-offset: 2px;
}
<header>
, <nav>
,
<main>
, <footer>
, etc.) para
melhorar a navegação por leitores de tela.
alt
em imagens: Forneça texto
alternativo descritivo para todas as imagens.
Um CSS bem organizado é essencial para projetos grandes.
bloco__elemento--modificador
(e.g.,
.card__title--large
).
:root {
--primary-color: #007bff;
--secondary-color: #6c757d;
--font-stack: Arial, sans-serif;
}
body {
font-family: var(--font-stack);
color: var(--primary-color);
}
base.css
,
layout.css
, components.css
).
Use box-shadow
para dar profundidade aos elementos.
.card {
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* horizontal vertical blur spread color */
transition: box-shadow 0.3s ease;
}
.card:hover {
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
}
border-radius
: Arredonda os cantos.
.button {
border-radius: 5px;
}
.circle {
border-radius: 50%; /* Para um círculo perfeito */
}
clip-path
: Cria formas geométricas
complexas.
.diamond {
clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
}
opacity
: Controla a transparência de um
elemento (0 a 1).
filter
: Aplica efeitos visuais.
.blurred-background {
filter: blur(5px);
}
.faded-text {
opacity: 0.7;
}
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 2L2 7l10 5 10-5-10-5z"></path>
<path d="M2 17l10 5 10-5"></path>
<path d="M2 12l10 5 10-5"></path>
</svg>
<style>
svg {
color: #007bff;
}
svg:hover {
color: #0056b3;
transform: scale(1.1);
transition: all 0.2s ease-in-out;
}
</style>
.sticky-header {
position: sticky;
top: 0;
background-color: white;
z-index: 100;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
position: fixed
e
z-index
.
.modal-backdrop {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
}
Este manual oferece uma base sólida para você criar aplicações web incríveis. Lembre-se de praticar e experimentar com as propriedades para ver como elas se comportam.