Mercado
Preços
EntrarComeçar
Guia práticoCSS e web
CSS e web

CSS @property: animar gradientes e propriedades personalizadas

Gradientes se recusam a fazer transição porque o navegador não sabe misturar uma imagem em outra. Dê um tipo a uma propriedade personalizada e esse limite desaparece. Veja como o @property funciona, com código para colar.

GradientlyConta verificada do Gradiently·1 de outubro de 2026·6 min de leitura
Capa: Hollow Aria · GR·QW8R·QX

Resumindo

  • O CSS @property registra uma propriedade personalizada com uma sintaxe, uma regra de herança e um valor inicial, o que diz ao navegador que tipo de valor ela guarda.
  • Os navegadores não conseguem fazer transição de um gradiente diretamente, porque background-image não é interpolável, mas conseguem fazer transição de uma propriedade personalizada tipada usada dentro do gradiente.
  • Propriedades tipadas como <color>, <angle>, <percentage> e <length> animam suavemente; uma propriedade com a sintaxe universal * só salta entre valores.
  • A regra @property é suportada nas versões atuais do Chrome, Edge, Safari e Firefox, e os navegadores que a ignoram simplesmente mostram o gradiente sem movimento.
  • Animar uma propriedade personalizada dentro de um fundo repinta o elemento a cada quadro, então mantenha a área animada modesta e respeite prefers-reduced-motion.
Nesta página
Por que gradientes não fazem transição sozinhosA sintaxe do @propertyAnimar a cor de um gradiente no hoverGirar uma borda com gradiente cônicoMover uma parada de corRegistrar pelo JavaScriptSuporte dos navegadores, alternativas e desempenho

O CSS @property registra uma propriedade personalizada com um tipo, para que o navegador saiba que --angle guarda um ângulo ou que --tint guarda uma cor. Sabendo o tipo, ele consegue interpolar entre dois valores, o que significa que você pode fazer transição e animar coisas que o CSS normalmente se recusa a mover: cores de gradiente, ângulos de gradiente e a posição de uma parada de cor. Sem registro, uma propriedade personalizada é só uma string, e uma string só consegue pular de um valor para o próximo.

Por que gradientes não fazem transição sozinhos

Experimente transition: background 0.4s num botão cujo estado de hover troca um linear-gradient() por outro e nada suaviza: o novo gradiente entra de uma vez. Gradientes são imagens, e a especificação trata background-image como não interpolável, então o navegador não tem como misturar uma imagem numa outra diferente.

O contorno habitual é aumentar o fundo e deslizar background-position, que é como a maioria dos gradientes animados em CSS é feita. Funciona, mas só move um gradiente fixo de lugar. Você não consegue mudar uma cor, girar um ângulo ou empurrar uma parada. Propriedades registradas mudam isso, porque o que está sendo animado deixa de ser a imagem e passa a ser um número ou uma cor tipados dentro dela. O navegador recalcula o gradiente a cada quadro a partir do valor atual.

--tint não registrada

  • Guardada como uma string de tokens
  • Transições pulam na metade
  • Herda por padrão
  • Um valor inválido quebra a declaração no momento do cálculo

Registrada com @property

  • Interpretada como uma cor de verdade
  • Transições interpolam suavemente
  • A herança é escolha sua
  • Um valor inválido volta para o valor inicial

A sintaxe do @property

Uma regra @property tem três descritores. syntax diz que tipo de valor é permitido, inherits diz se os filhos recebem o valor e initial-value é usado quando nada mais o define. Os três são obrigatórios, exceto que initial-value pode ficar de fora quando a sintaxe é *. Se alguma parte obrigatória faltar ou estiver errada, o navegador ignora a regra inteira, em silêncio.

css
@property --tint {
  syntax: '<color>';
  inherits: false;
  initial-value: #7c3aed;
}

@property --angle {
  syntax: '<angle>';
  inherits: false;
  initial-value: 0deg;
}

@property --stop {
  syntax: '<percentage>';
  inherits: false;
  initial-value: 40%;
}
Três propriedades registradas: uma cor, um ângulo e uma posição de parada. Registre uma vez, no nível superior da folha de estilos.

O valor inicial precisa ser computacionalmente independente, o que na prática significa unidades absolutas: 0deg, 40%, 12px e cores hex funcionam, enquanto 2em ou var(--x) não. Definir inherits: false costuma ser o que você quer para animação, e poupa o navegador de propagar o valor pela árvore.

<color>

Anima suavemente

Sim

Bom para

Cores de gradiente, mudanças de tema
<angle>

Anima suavemente

Sim

Bom para

Ângulos lineares, rotação cônica
<percentage>

Anima suavemente

Sim

Bom para

Posições de paradas de cor, tamanhos
<length>

Anima suavemente

Sim

Bom para

Tamanhos radiais, deslocamentos
<number>

Anima suavemente

Sim

Bom para

Valores no estilo de opacidade, multiplicadores
<integer>

Anima suavemente

Sim, em passos inteiros

Bom para

Contadores, efeitos em degraus
*Não, ele salta

Bom para

Qualquer coisa que você nunca anima
SintaxeAnima suavementeBom para
<color>SimCores de gradiente, mudanças de tema
<angle>SimÂngulos lineares, rotação cônica
<percentage>SimPosições de paradas de cor, tamanhos
<length>SimTamanhos radiais, deslocamentos
<number>SimValores no estilo de opacidade, multiplicadores
<integer>Sim, em passos inteirosContadores, efeitos em degraus
*Não, ele saltaQualquer coisa que você nunca anima
As sintaxes que importam para trabalhar com gradientes. Você também pode aceitar várias, como '<length> | <percentage>', ou uma lista com +.

Animar a cor de um gradiente no hover

Este é o menor exemplo útil. O botão usa --tint como segunda cor, e o estado de hover só muda --tint. Como a propriedade está registrada como cor, a transição suaviza entre violeta e coral em vez de trocar de uma vez.

css
@property --tint {
  syntax: '<color>';
  inherits: false;
  initial-value: #7c3aed;
}

.button {
  background: linear-gradient(120deg, #1e1b4b 0%, var(--tint) 100%);
  transition: --tint 400ms ease;
}

.button:hover {
  --tint: #fb7185;
}
A transição nomeia a própria propriedade personalizada. Escrever transition: background não faria nada aqui.
Três quadros do mesmo botão. A cor do meio só existe porque o navegador consegue interpolar uma cor registrada.

Para mais formas de tratar botões, veja botões com gradiente em CSS e efeitos hover com gradiente em CSS.

Girar uma borda com gradiente cônico

Um uso favorito do @property é uma borda que parece percorrer o contorno de um card. Um gradiente cônico começa a partir de um ângulo, então registrar esse ângulo e animá-lo de 0deg a 360deg faz as cores girarem. Dois fundos fazem o trabalho: a cor do card recortada na padding box e o gradiente cônico recortado na border box.

css
@property --angle {
  syntax: '<angle>';
  inherits: false;
  initial-value: 0deg;
}

.card {
  border: 2px solid transparent;
  border-radius: 16px;
  background:
    linear-gradient(#0f0b1e, #0f0b1e) padding-box,
    conic-gradient(from var(--angle), #22d3ee, #7c3aed, #f472b6, #22d3ee) border-box;
  animation: spin 6s linear infinite;
}

@keyframes spin {
  to { --angle: 360deg; }
}

@media (prefers-reduced-motion: reduce) {
  .card { animation: none; }
}
Repita a primeira cor no final para que a emenda onde 360deg encontra 0deg desapareça.
O anel cônico em 0degconic-gradient(from 0deg, #22d3ee, #7c3aed, #f472b6, #22d3ee)
O mesmo gradiente que a borda usa. Conforme --angle cresce, este anel gira, e a faixa fina que você vê em volta do card viaja junto. Bordas com gradiente em CSS mostra a versão estática.

Mover uma parada de cor

Uma porcentagem registrada deixa uma parada deslizar. Use para o preenchimento de uma barra de progresso, um destaque que varre um título ou um horizonte que sobe com a rolagem. Aqui --stop move o ponto em que o gradiente passa do tinta para o verde-azulado.

css
@property --stop {
  syntax: '<percentage>';
  inherits: false;
  initial-value: 20%;
}

.meter {
  background: linear-gradient(90deg, #0d9488 0%, #0d9488 var(--stop), #0f172a var(--stop));
  transition: --stop 600ms ease-out;
}

.meter[data-done] {
  --stop: 100%;
}
Duas paradas na mesma posição criam uma borda seca, e a borda se move conforme --stop muda.

Registrar pelo JavaScript

CSS.registerProperty() faz o mesmo trabalho a partir de um script. É útil quando um design system registra suas propriedades em tempo de execução, ou quando um valor só é conhecido depois do carregamento. Registrar o mesmo nome duas vezes gera um erro, então proteja a chamada.

js
if ('registerProperty' in CSS) {
  try {
    CSS.registerProperty({
      name: '--angle',
      syntax: '<angle>',
      inherits: false,
      initialValue: '0deg',
    })
  } catch {
    // Already registered, which is fine.
  }
}
A forma em JavaScript usa initialValue em camel case. Todo o resto é igual à regra CSS.

Suporte dos navegadores, alternativas e desempenho

@property funciona nas versões atuais do Chrome, Edge, Safari e Firefox; o Firefox foi o último a adotá-lo, na versão 128. Consulte o caniuse se você atende dispositivos mais antigos. Um navegador que não entende a regra trata --angle como uma propriedade personalizada comum, então seu gradiente continua sendo desenhado no valor inicial e simplesmente não se move. É uma boa alternativa, desde que o quadro parado pareça acabado.

Cuidado com a repintura

Animar uma propriedade usada em background faz o navegador repintar aquele elemento a cada quadro. Uma borda ou um botão pequeno custam pouco; um hero de tela cheia animado para sempre gasta bateria. Desempenho de gradientes CSS mostra as medidas a acompanhar.

  1. 1

    Registre antes de usar

    Coloque cada regra @property no nível superior, fora de media queries, para que valha em todo lugar.

  2. 2

    Use sintaxes tipadas

    Escolha <color>, <angle> ou <percentage>. Evite * para qualquer coisa que pretenda animar.

  3. 3

    Faça a transição da propriedade

    Escreva transition: --tint 400ms, nomeando a propriedade personalizada em vez de background.

  4. 4

    Respeite o movimento reduzido

    Pare animações em loop sob prefers-reduced-motion: reduce, como descrito em prefers reduced motion.

  5. 5

    Confira o quadro parado

    Desligue a animação e garanta que o gradiente em repouso ainda pareça intencional.

Se o movimento que você quer vive em posts ou vídeos, e não numa página web, um Mark do Gradiently já carrega sua própria luz e movimento lento, e o Pro o exporta como MP4, WebM ou GIF onde o navegador permite gravar, sem escrever keyframes. Para tudo na web, @property é a ferramenta mais limpa que você tem. A referência da MDN lista todos os descritores.

Crie com um gradiente vivo

Posts, stories, slides e banners em todos os tamanhos, com texto sempre legível.

Começar a criar, grátis

Perguntas frequentes

O que o CSS @property faz?

Registra uma propriedade personalizada com um tipo, uma regra de herança e um valor inicial. Saber o tipo permite ao navegador validar o valor e interpolá-lo em transições e animações.

Dá para animar um gradiente CSS?

Não diretamente, porque background-image não é interpolável. Registre as cores, o ângulo ou as posições das paradas com @property, use-os dentro do gradiente e anime essas propriedades.

Por que minha animação com @property não funciona?

Geralmente falta um descritor, o valor inicial usa uma unidade relativa, a sintaxe é * ou a transição nomeia background em vez da propriedade personalizada. Qualquer descritor inválido faz o navegador ignorar a regra inteira.

O Firefox suporta @property?

Sim. O Firefox adotou o @property na versão 128, então agora ele funciona em todos os principais navegadores atuais.

inherits deve ser true ou false?

Use false para a maioria dos valores animados. Isso mantém o valor no elemento onde você o definiu e evita trabalho extra para o navegador.

Compartilhar este guia

Escrito pelo GradientlyConta verificada do Gradiently

A equipe por trás do Gradiently, uma ferramenta de design criada em torno dos Marks: gradientes vivos que fazem tudo o que você cria ter a sua cara.

Ver nosso perfil

Nesta página

Por que gradientes não fazem transição sozinhosA sintaxe do @propertyAnimar a cor de um gradiente no hoverGirar uma borda com gradiente cônicoMover uma parada de corRegistrar pelo JavaScriptSuporte dos navegadores, alternativas e desempenho

Compartilhar este guia

A seguir em CSS e web

Texto com degradê no Tailwind: classes, sintaxe da v4 e correções

Continue lendo

Todos os guias de CSS e web
CSS e web

Fundos com gradiente animado em CSS, do jeito certo

5 min de leitura

Gradientes não podem ser animados diretamente, mas tudo ao redor deles pode. Quatro técnicas, o que cada uma custa ao navegador e como manter o movimento calmo e opcional.

CSS e web

Gradiente cônico em CSS: círculos, gráficos de pizza e brilho

5 min de leitura

O conic-gradient() varre a cor em torno de um ponto como o ponteiro de um relógio. Essa única ideia desenha círculos de cores, gráficos de pizza e de rosca, brilho metálico e explosões de raios.

CSS e web

Borda com gradiente em CSS: quatro jeitos de desenhar uma

5 min de leitura

O border-color não aceita gradiente, então todo contorno com gradiente é uma solução alternativa. Aqui estão as quatro que importam, o que cada uma pode e não pode fazer e qual escolher.

Encontre o visual que é só seu.

Cada Mark é um fundo vivo com um único dono. Experimente um Mark ainda disponível e reserve o seu quando sentir que é ele.

Começar a criar

Verificar um certificado

Digite o número de um certificado ou o código de um Mark para ver quem é o dono.

Funciona com ChatGPT e Claude

Peça um design à sua IA. Ela cria no seu Mark, pronto para editar.

ChatGPTClaude
Como conectar

Produto

  • Mercado
  • Explorar
  • Preços
  • Certificados

Aprender

  • Guia prático
  • Central de ajuda
  • Novidades

Desenvolvedores

  • Visão geral
  • ChatGPT e Claude
  • Referência da API
  • Chaves de API

Empresa

  • Sobre
  • Fale conosco
  • Entrar

Jurídico

  • Termos
  • Privacidade
  • Reembolsos
  • Proteção do Mark
  • Cookies
  • Todas as políticas
Passe pelas letras. Cada uma veste um Mark de verdade.Toque em uma letra para ver o Mark dela.Um nome. Dez Marks dentro dele.
© 2026 Gradiently