Sombras no CSS: box-shadow e text-shadow | Web Academy
Chegamos à conclusão triunfal do Módulo 2: O Box Model, Espaçamento & Tipografia! Nas interfaces digitais, a profundidade espacial é a ferramenta psicológica que comunica ao cérebro do usuário o que está em primeiro plano, o que é clicável e o que está sobreposto. No CSS, esse relevo é esculpido através das sombras no CSS com box-shadow e text-shadow. Nesta aula definitiva, você aprenderá a abandonar as sombras pretas pesadas e amadoras do passado, construindo elevações multicamadas suaves inspiradas na física da luz natural, sombras internas com a palavra-chave inset e efeitos de brilho luminoso (Glow / Neon).
📑 Índice do Conteúdo
1. A Anatomia do box-shadow: Os 6 Parâmetros da Luz
A propriedade box-shadow projeta uma ou mais sombras a partir da moldura de um elemento. Sua sintaxe completa aceita até seis valores:
box-shadow-syntax.css
/* Sintaxe Completa: */
box-shadow: [inset] <offset-x> <offset-y> <blur-radius> <spread-radius> <color>;
| Parâmetro | Tipo | O Que Faz na Geometria da Sombra? | Obrigatório? |
|---|---|---|---|
offset-x |
Comprimento (px, rem) | Desloca a sombra horizontalmente (+ para direita, – para esquerda). | Sim |
offset-y |
Comprimento (px, rem) | Desloca a sombra verticalmente (+ para baixo, – para cima). | Sim |
blur-radius |
Comprimento positivo | Suavização gaussiana da sombra (0 = borda dura; valores maiores = difusa). | Opcional (padrão é 0) |
spread-radius |
Comprimento (+ ou -) | Expande (+) ou encolhe (-) a área da sombra antes do desfoque. | Opcional (padrão é 0) |
color |
Valor de cor | Define a tonalidade da sombra (use sempre transparência alfa). | Opcional (padrão é currentColor) |
inset |
Palavra-chave | Inverte a projeção para DENTRO da caixa (efeito afundado). | Opcional |
2. A Arte das Sombras Multicamadas (Soft Elevation)
O erro clássico de desenvolvedores iniciantes é declarar uma única sombra escura e pesada:
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.5); ➔ O resultado parece uma mancha preta artificial e suja.
Na física do mundo real, a luz ambiente rebate nas paredes e no chão, gerando duas sombras simultâneas: uma sombra de contato fina e nítida bem rente à base do objeto, e uma sombra atmosférica ampla, suave e difusa.
Para replicar esse comportamento de alto nível (utilizado por Stripe, Apple e Tailwind CSS), declaramos múltiplas sombras separadas por vírgula, utilizando o spread-radius negativo para recolher as bordas:
soft-elevation.css
/* Elevação Profissional em 2 Camadas: Suave, Realista e Elegante */
.card-elevado-profissional {
background-color: #1e293b;
border: 1px solid #334155;
border-radius: 12px;
box-shadow:
0 1px 3px rgba(0, 0, 0, 0.08), /* Camada 1: Oclusão de contato fina */
0 20px 25px -5px rgba(0, 0, 0, 0.25), /* Camada 2: Difusão ampla com spread negativo */
0 8px 10px -6px rgba(0, 0, 0, 0.2); /* Camada 3: Amortecimento intermediário */
}
-5px na posição do spread. Esse valor negativo encolhe a silhueta da sombra antes de aplicar o blur, impedindo que a sombra “vaze” feia pelas laterais do card e concentrando o efeito suave exclusivamente na parte inferior!
3. Sombras Internas com a Palavra-Chave inset
Quando adicionamos a palavra-chave inset, a sombra deixa de ser projetada para fora e passa a ser desenhada dentro da caixa do elemento, por cima do background, mas por baixo do conteúdo textual.
inset-shadows.css
/* 1. Campo de texto com sensação de relevo afundado (Incut) */
.campo-input {
background-color: #0f172a;
border: 1px solid #334155;
padding: 0.75rem 1rem;
color: #ffffff;
border-radius: 8px;
/* Sombra interna sutil na parte superior */
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4);
}
/* 2. Botão no estado :active dando a sensação física de ser pressionado */
.btn-press:active {
transform: translateY(1px);
box-shadow: inset 0 3px 6px rgba(0, 0, 0, 0.35);
}
4. Sombras Coloridas e Efeito de Brilho (Ambient Glow)
Projetar sombras puramente pretas em botões coloridos gera uma borda acinzentada e “morta”. Nos sistemas de design mais modernos da web, botões de ação e cards premium utilizam sombras coloridas baseadas no próprio matiz da marca:
glow-effects.css
/* Botão Luminoso: A sombra utiliza a própria cor do botão com alta difusão */
.btn-glow {
background: linear-gradient(135deg, #0284c7, #38bdf8);
color: #ffffff;
border: none;
padding: 0.85rem 1.75rem;
font-weight: 600;
border-radius: 9999px;
cursor: pointer;
/* A sombra azul viva faz o botão parecer uma fonte de luz emitida! */
box-shadow: 0 10px 25px -3px rgba(2, 132, 199, 0.5);
transition: box-shadow 0.2s ease, transform 0.2s ease;
}
.btn-glow:hover {
transform: translateY(-2px);
box-shadow: 0 15px 30px -2px rgba(2, 132, 199, 0.7);
}
5. Sombras em Textos: text-shadow
A propriedade text-shadow aplica sombras diretamente aos contornos das letras e caracteres tipográficos.
Sintaxe: text-shadow: <offset-x> <offset-y> <blur-radius> <color>;
(Diferente do box-shadow, o text-shadow NÃO aceita spread-radius e NÃO aceita inset).
Os 2 Grandes Superpoderes do text-shadow:
text-shadow-examples.css
/* 1. Salva-Vidas de Contraste sobre Fotos Claras */
/* Garante que o texto branco seja 100% legível mesmo se a imagem de fundo tiver áreas claras! */
.titulo-banner {
color: #ffffff;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.8);
}
/* 2. Efeito Neon Futurista (Cyberpunk Glow) */
/* Empilhando múltiplos raios de desfoque sem nenhum deslocamento (offset 0 0) */
.texto-neon {
color: #ffffff;
text-shadow:
0 0 5px #38bdf8,
0 0 15px #38bdf8,
0 0 30px #0284c7,
0 0 60px #0284c7;
}
6. Laboratório Prático: Vitrine de Elevação (Flat, Card, Popover e Glow)
Neste laboratório de encerramento do Módulo 2, construiremos uma vitrine completa demonstrando os quatro níveis clássicos de elevação de sistemas de design corporativos:
elevation-showcase.html
<div class="elevation-grid">
<!-- Nível 1: Inset / Profundidade Afundada -->
<div class="elevation-card card-inset">
<span class="elevation-label">Nível 0 • Inset</span>
<h4>Sombra Interna</h4>
<p>Sensação de relevo rebaixado para campos e botões pressionados.</p>
</div>
<!-- Nível 2: Elevação Suave Padrão (Card) -->
<div class="elevation-card card-soft">
<span class="elevation-label">Nível 1 • Suave</span>
<h4>Elevação Multicamada</h4>
<p>Combinação de contato fino com difusão ampla e spread negativo.</p>
</div>
<!-- Nível 3: Elevação Alta (Hover / Modal) -->
<div class="elevation-card card-hover">
<span class="elevation-label">Nível 2 • Flutuante</span>
<h4>Popover / Dialog</h4>
<p>Destaque de primeiro plano para elementos que se destacam da tela.</p>
</div>
<!-- Nível 4: Brilho Neon Emitido (Glow) -->
<div class="elevation-card card-glow">
<span class="elevation-label">Nível 3 • Neon Glow</span>
<h4 class="neon-title">Luz Emitida</h4>
<p>Sombras coloridas na mesma tonalidade que criam estética futurista.</p>
</div>
</div>
elevation-showcase.css
/* Reset e base */
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background-color: #0b0f19;
color: #f8fafc;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
padding: 2.5rem 1.5rem;
}
.elevation-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 2rem;
max-width: 1080px;
width: 100%;
}
.elevation-card {
background-color: #1e293b;
border-radius: 14px;
padding: 2rem;
display: flex;
flex-direction: column;
justify-content: center;
transition: transform 0.25s ease, box-shadow 0.25s ease;
}
.elevation-label {
font-size: 0.75rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
color: #38bdf8;
margin-bottom: 0.5rem;
}
.elevation-card h4 {
font-size: 1.2rem;
color: #ffffff;
margin-bottom: 0.75rem;
}
.elevation-card p {
font-size: 0.85rem;
line-height: 1.6;
color: #94a3b8;
}
/* 1. Nível 0: Sombra Interna com inset */
.card-inset {
background-color: #0f172a;
border: 1px solid #1e293b;
box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.6);
}
/* 2. Nível 1: Elevação Suave Multicamada */
.card-soft {
border: 1px solid #334155;
box-shadow:
0 1px 3px rgba(0, 0, 0, 0.1),
0 12px 20px -5px rgba(0, 0, 0, 0.35);
}
/* 3. Nível 2: Card Flutuante com Hover Dinâmico */
.card-hover {
border: 1px solid #334155;
box-shadow:
0 4px 6px -1px rgba(0, 0, 0, 0.2),
0 20px 25px -5px rgba(0, 0, 0, 0.4);
}
.card-hover:hover {
transform: translateY(-5px);
box-shadow:
0 10px 15px -3px rgba(0, 0, 0, 0.3),
0 25px 35px -5px rgba(0, 0, 0, 0.5);
}
/* 4. Nível 3: Brilho Neon Luminous com box-shadow e text-shadow */
.card-glow {
border: 1px solid rgba(56, 189, 248, 0.4);
box-shadow:
0 0 15px rgba(56, 189, 248, 0.2),
0 10px 25px -5px rgba(2, 132, 199, 0.4);
}
.neon-title {
color: #ffffff;
text-shadow: 0 0 10px #38bdf8, 0 0 20px #0284c7;
}
7. Boas Práticas da Indústria & Dicas de Performance
-
✅ Use Sempre Cores com Alfa (RGBA/HSLA): Sombras pretas 100% sólidas (
#000000) nunca devem ser usadas sem canal de transparência. Mantenha opacidades entre0.05(muito suave) e0.35(escuro sutil). -
✅ Cuidado com o Custo de Repintura da GPU: Animar o
blur-radiusde umbox-shadowdurante o scroll ou com keyframes consome muitos recursos da placa de vídeo. Prefira animartransform: translateY()no hover para criar o efeito de elevação com fluidez de 60 FPS. -
✅ Utilize Spread Negativo para Sombras Elegantes: O spread negativo (ex:
-5px) limpa os cantos laterais do elemento, direcionando o peso da sombra exclusivamente para baixo.
8. 🎉 Conclusão do Módulo 2 & O Que Vem no Módulo 3!
Parabéns! Você acaba de concluir integralmente o Módulo 2: O Box Model, Espaçamento & Tipografia!
Completamos 20 lições de altíssimo nível técnico: dominamos a anatomia completa do Box Model, bordas e raios elípticos, o reset essencial de border-box, o colapso de margens com display: flow-root, áreas de toque para mobile WCAG, web fonts com WOFF2 e font-display: swap, a escala de unidades rem/em/clamp, line-height sem unidades, alinhamento e o sistema de sombras e elevação.
Na Lição 21: A Propriedade display: block, inline e inline-block, entraremos na engenharia de fluxo de página, descobrindo como transformar elementos em caixas de bloco, inline ou no híbrido inline-block antes de desbravarmos o poder do Flexbox moderno!
9. Referências Técnicas & Especificações Oficiais
- W3C CSS Backgrounds and Borders Module Level 3 — Box Shadow: Especificação técnica oficial sobre projeção de sombras em caixas.
- W3C CSS Text Decoration Module Level 3 — Text Shadow: Especificação formal sobre sombras tipográficas.
- MDN Web Docs (Mozilla): Guia definitivo sobre a propriedade box-shadow.