Pular para o conteúdo
Cursos

DevClub

LógicaFront-endBack-endMobile

IA Club

IA na prática
Estudar programaçãoEstudar IA
LiçãoIniciantecódigo testado

Variáveis no Sass: $cor, !default e quando usar var()

A diferença entre a variável que some na compilação e a custom property que chega no navegador, com o CSS gerado dos dois lados.

Rodolfo Mori5 min de leitura

Variável Sass começa com $ e existe somente enquanto o compilador trabalha. Custom property começa com --, atravessa o build e chega ao navegador. As duas guardam valores, mas vivem em momentos diferentes; escolher só pela aparência do nome produz tema que não muda ou CSS maior do que precisava.

Os exemplos foram enviados ao Dart Sass 1.103.1 com este formato de comando:

bash
npx --yes sass@1.103.1 --stdin --no-source-map --style=expanded

O comando não imprime um rótulo de sucesso: com entrada válida, o stdout contém somente o CSS compilado que aparece depois de cada exemplo.

Se o comando ainda não funciona, volte à aula de instalação do Sass. Se $ e -- parecem equivalentes, compare também com variáveis CSS.

A variável que desaparece na compilação

O compilador substitui cada referência pelo valor atual. Nem o nome $brand nem a declaração aparecem na saída:

css
$brand: #6d28d9;

.button {
  background: $brand;
}
.button { background: #6d28d9; }

Isso é perfeito para uma decisão fechada no build: uma proporção, o número de colunas geradas ou um token que muda entre pacotes compilados. Também significa que JavaScript, atributos HTML e media queries do usuário não conseguem alterar $brand depois.

A custom property que chega ao navegador

Agora escreva o mesmo valor como propriedade CSS. Sass preserva a declaração e o var():

css
:root { --brand: #6d28d9; }
.button { background: var(--brand); }
:root { --brand: #6d28d9; }

.button { background: var(–brand); }

Como --brand participa da cascata, um elemento pode herdá-la e outro pode sobrescrevê-la. É a escolha natural para tema claro/escuro, marca recebida do servidor ou valor alterado em tempo de execução. O custo é manter a expressão no CSS e deixar a resolução para o navegador.

pergunta $variavel Sass --variavel CSS
quando resolve? no build no navegador
aparece no CSS final? não sim
muda por elemento? não sim, pela cascata
participa de operações Sass? diretamente só como texto CSS

Reatribuição: Sass é imperativo

Variáveis Sass seguem a ordem do arquivo. Uma regra já gerada não volta no tempo quando o valor muda:

css
$brand: #6d28d9;
.light { color: $brand; }

$brand: #a78bfa;
.dark { color: $brand; }
.light { color: #6d28d9; }

.dark { color: #a78bfa; }

Em CSS, uma custom property é declarativa: se duas declarações disputam o mesmo elemento, a cascata decide o valor usado por todas as referências. No Sass, cada referência é substituída durante a leitura sequencial.

!default: um padrão que aceita configuração

O marcador !default atribui apenas quando a variável ainda não existe ou vale null. Neste teste, a cor do consumidor venceu o padrão da biblioteca:

css
$brand: #0f766e;
$brand: #6d28d9 !default;

.button { color: $brand; }
.button { color: #0f766e; }

Em um módulo real, a configuração entra por @use "library" with ($brand: #0f766e). !default é parte da API do módulo: documente quais tokens podem ser configurados. Espalhá-lo em qualquer arquivo só esconde uma ordem de imports difícil de entender.

Escopo local e shadowing

Uma variável criada dentro de uma regra normalmente é local. Se ela tem o mesmo nome de uma global, ocorre shadowing: a local vence dentro do bloco sem alterar a global.

css
$brand: #6d28d9;

.card {
  $brand: #0f766e;
  color: $brand;
}

.button { color: $brand; }
.card { color: #0f766e; }

.button { color: #6d28d9; }

Esse isolamento impede que um componente mude acidentalmente um token global. Existe !global, mas o uso frequente é sinal de estado compartilhado demais; prefira retorno de função, parâmetro de mixin ou configuração de módulo.

O erro mais comum: variável fora do escopo

Aqui $local nasce dentro de .card e é lida depois do fechamento. O compilador aponta exatamente os seis caracteres desconhecidos:

css
.card {
  $local: #6d28d9;
  color: $local;
}

.button { color: $local; }
Error: Undefined variable. ╷ 5 │ .button { color: $local; } │ ^^^^^^ ╵ - 5:18 root stylesheet

Mover a declaração para o topo resolve se o valor realmente for global. Se não for, mantenha o uso no mesmo escopo. Não copie a variável para dois lugares: a duplicação elimina justamente o benefício do token.

Misturar Sass e custom properties com intenção

As ferramentas não são rivais. Sass pode escolher um valor inicial e publicá-lo como custom property. A interpolação #{} manda o compilador inserir o valor dentro da declaração CSS:

css
$brand: #6d28d9;

:root {
  --brand: #{$brand};
}
:root { --brand: #6d28d9; }

Depois, o navegador ainda pode sobrescrever --brand. Esse padrão funciona bem quando o pacote Sass distribui padrões, mas a aplicação oferece temas em runtime.

Uma regra prática para decidir

Faça uma pergunta: o valor precisa mudar sem recompilar? Se sim, escolha custom property. Se não, e o valor alimenta loops, maps, funções ou configuração de módulos, a variável Sass é adequada. Para simples constantes que aparecem uma única vez, talvez nenhuma variável seja necessária.

Há ainda uma decisão de manutenção: um token deve carregar significado, não a aparência acidental de hoje. $color-purple-600 descreve implementação; $action-primary descreve intenção. Se a marca trocar roxo por azul, o segundo nome continua correto. Para custom properties vale a mesma regra. Separe tokens primitivos, como --violet-600, dos semânticos, como --action-bg, e faça o componente consumir o semântico. Essa camada parece trabalho extra em quatro botões, mas evita trocar centenas de referências quando o sistema cresce.

Também não guarde tudo numa variável. Valores que aparecem uma vez e não têm significado compartilhado ficam mais claros escritos no lugar. O objetivo não é substituir números por nomes; é criar um contrato para decisões que realmente se repetem ou precisam ser configuradas.

Este pequeno contrato deixa a fronteira explícita:

css
$grid-columns: 12;
$asset-path: "/assets";

:root {
  --brand: #6d28d9;
  --space-fluid: clamp(1rem, 2vw, 2rem);
}
:root { --brand: #6d28d9; --space-fluid: clamp(1rem, 2vw, 2rem); }

Como $grid-columns e $asset-path não são usados, eles não geram declaração alguma. --brand e --space-fluid, por outro lado, permanecem no CSS.

Na próxima lição, essas variáveis entram em seletores aninhados. Antes de avançar, compile os exemplos e confira a saída: aprender Sass é sempre comparar o que você escreveu com o CSS que realmente chegou ao navegador. O mapa geral da linguagem está no guia completo de Sass.

  • sass
  • variáveis
  • custom properties
  • default
  • escopo
  • tema

Perguntas frequentes

Variável Sass deixa o CSS mais lento?
Não no navegador, porque ela desaparece durante a compilação. O valor resolvido ocupa o lugar da variável no CSS final.
Quando devo usar !default?
Em módulos configuráveis, quando o consumidor precisa substituir um valor antes que o módulo gere CSS. Não use como remendo para ordem confusa.
Posso usar variável Sass dentro de uma custom property?
Sim, com interpolação, como --brand: #{$brand}. Depois do build, a custom property permanece e contém o valor resolvido.

Dúvidas e comentários

Travou em algum passo? Pergunte aqui — a equipe e outros alunos respondem.

Todo o código deste artigo foi executado em Dart Sass 1.103.1 (dart2js 3.13.1), Node 26.3.0, macOS, e as saídas exibidas são as reais — como produzimos este conteúdo.

Fontes consultadas

  1. Sass — Variables — sass-lang.com
  2. Sass — Interpolation — sass-lang.com
  3. MDN — CSS custom properties — developer.mozilla.org

Continue por aqui