Aninhamento CSS
As variáveis deram nome aos seus valores. calc e companhia os calcularam. O nesting organiza os seletores que usam esses valores: mantenha o título, o botão e os estilos hover de um card dentro de .card em vez de repetir o nome do pai pelo arquivo inteiro.
Aninhe um seletor filho
Escreva uma regra dentro de outra. Um seletor de classe ou tipo aninhado junta-se como descendente do pai (combinador de espaço), a menos que você diga o contrário com &:
.card {
padding: 1.25rem;
border-radius: 0.75rem;
background: var(--surface, #fff);
.title {
margin: 0 0 0.5rem;
font-size: 1.25rem;
}
.body {
color: var(--muted, #444);
line-height: 1.5;
}
}
O navegador expande isso para .card .title e .card .body. Você continua com seletores descendentes comuns — nesting é açúcar para estrutura e localidade, não um novo modelo de correspondência.
O seletor pai &
Use & quando a regra aninhada precisar se prender ao mesmo elemento que o pai — pseudoclasses, pseudoelementos ou uma classe extra no pai:
.button {
display: inline-flex;
padding: 0.6rem 1.1rem;
border: 0;
border-radius: 0.5rem;
background: var(--brand, #2563eb);
color: #fff;
&:hover {
background: var(--brand-hover, #1d4ed8);
}
&:focus-visible {
outline: 2px solid var(--brand, #2563eb);
outline-offset: 2px;
}
&.is-primary {
background: var(--brand-strong, #1e40af);
}
}
&:hover significa .button:hover. &.is-primary significa .button.is-primary. Sem &, um :hover { } solto é nesting inválido em CSS nativo — o & deixa a ligação explícita.
Combinadores com &
Coloque o combinador depois de & quando quiser um filho, um irmão ou outro vínculo explícito — não o espaço descendente simples:
.nav {
display: flex;
gap: 0.75rem;
& > .item {
padding: 0.35rem 0.6rem;
}
& > .item + .item {
border-inline-start: 1px solid #ddd;
}
/* same as nesting .item without & — descendant */
.badge {
font-size: 0.75rem;
}
}
& > .item → .nav > .item. Um .badge aninhado sem & → .nav .badge. Escolha de propósito: descendentes profundos por acidente são um cheiro clássico de nesting.
Aninhe @media com o componente
Você pode aninhar at-rules como @media dentro de uma regra de estilo para que os breakpoints vivam ao lado do componente que alteram:
.hero {
padding: 2rem 1.25rem;
h1 {
font-size: clamp(1.75rem, 1.2rem + 2vw, 2.75rem);
}
@media (min-width: 48rem) {
padding: 3rem 2rem;
h1 {
max-width: 20ch;
}
}
}
Expandida, a media query ainda envolve as declarações de .hero (e .hero h1). Combine isso com tokens e clamp() das lições anteriores do Modern Toolkit — o nesting só reposiciona as regras.
Padrões de nesting em um relance
📊 Cola de nesting nativo
| Você escreve | Significa | Use quando |
|---|---|---|
.card { .title { } } |
.card .title |
Estilizar um descendente sob o componente |
.btn { &:hover { } } |
.btn:hover |
Pseudoclasse no mesmo elemento |
.btn { &.big { } } |
.btn.big |
Classe extra no mesmo elemento |
.nav { & > a { } } |
.nav > a |
Combinador filho explícito |
.box { @media (…) { } } |
Media query limitada aos seletores dessa regra | Manter breakpoints com o componente |
Mantenha os ninhos rasos
Dois ou três níveis costumam permanecer legíveis. Árvores mais profundas recriam o problema da «pirâmide de seletores» das equipes Sass: diffs difíceis, specificity maior e estilos que só fazem sentido dentro de um pai gigante. Prefira uma raiz de componente clara (.card, .nav) e aninhe estados e filhos próximos — não a página inteira.
Pacote de componente: tokens + nest + estados
Um trecho realista une as três últimas ideias do toolkit sem repetir as lições de calc ou variables:
.panel {
--panel-pad: 1rem;
padding: var(--panel-pad);
border: 1px solid #e5e7eb;
border-radius: 0.75rem;
.heading {
margin: 0 0 0.5rem;
font-weight: 600;
}
.actions {
display: flex;
gap: calc(var(--panel-pad) / 2);
margin-block-start: var(--panel-pad);
}
&.is-compact {
--panel-pad: 0.5rem;
}
@media (max-width: 36rem) {
.actions {
flex-direction: column;
}
}
}
Tokens continuam sendo custom properties; calc ainda deriva o espaçamento; o nesting mantém heading, actions, o estado compacto e o ajuste de tela pequena no mesmo lugar.
Experimente você mesmo
- Pegue regras planas
.card {},.card .title {},.card .meta {}e reescreva-as com nesting sob.card. - Adicione
&:hoverem um.linkpara que só o link (não um span aninhado) mude de cor. - Aninhe
@media (min-width: 40rem)dentro de.sidebarpara alargar o padding — confirme no DevTools os seletores expandidos. - Converta um
:hover { }aninhado por engano (sem&) em&:hover { }e note que passa a validar. - Limite um ninho bagunçado de três níveis a dois promovendo um bloco interno à própria classe.
Erros comuns
- Escrever
:hover { }aninhado sem&— inválido ou não era o que você queria; use&:hover - Esperar que
.childsolto signifique.parent.child— isso precisa de&.child - Copiar às cegas hacks Sass
&__elementde BEM — o nesting nativo segue a gramática de seletores CSS - Aninhar cinco níveis «porque dá» — legibilidade e specificity sofrem
- Achar que nesting substitui
var()oucalc()— só agrupa seletores e at-rules
Resumo
- Aninhe seletores filhos para manter os estilos do componente locais; por padrão expandem para descendentes
- Use
¶ estados do mesmo elemento (:hover,.is-active) e combinadores explícitos - Aninhe
@mediaao lado do componente que você está ajustando - Mantenha os ninhos rasos; nesting é estrutura, não token nem matemática
- Próximo no Modern Toolkit: container queries — estilos a partir do tamanho do pai, não só do viewport
🧠 Teste Seu Conhecimento
Teste Seu Conhecimento
Desafie-se com este questionário interativo e veja o quão bem você entende o tópico
📝 Instruções
- Leia cada pergunta cuidadosamente
- Selecione a melhor resposta para cada pergunta
- Você pode refazer o quiz quantas vezes quiser
- Seu progresso será mostrado no topo