Mercado
Preços
Iniciar sessãoComeçar
Guia PráticoCSS e web
CSS e web

Efeito hover com gradiente CSS: quatro formas de o animar

Se escreveres um gradiente novo em :hover, ele salta em vez de suavizar. Os browsers não conseguem fazer transição de um gradiente para outro, mas conseguem movê-lo, esbatê-lo ou animar as cores lá dentro. Aqui fica cada método, com o código.

GradientlyConta Gradiently verificada·1 de outubro de 2026·5 min de leitura
Capa: Snow Sanctuary · GR·5830·QE

A versão curta

  • Um efeito hover com gradiente CSS não se faz com transition em background-image, porque os browsers trocam os gradientes instantaneamente em vez de os interpolar.
  • A técnica mais compatível é um gradiente sobredimensionado com transition em background-position, que desliza as novas cores para a vista.
  • Registar paragens de cor ou ângulos com @property permite ao browser fazer a transição suavemente, e funciona em todos os principais browsers atuais.
  • Esbater a opacidade de um segundo gradiente num pseudo-elemento é a técnica mais barata de renderizar, porque as mudanças de opacidade não obrigam a repintar.
  • Os efeitos hover devem estar dentro de uma media query de hover e respeitar prefers-reduced-motion.
Nesta página
Porque é que o transition não funciona em gradientesTécnica 1: deslizar um gradiente sobredimensionadoTécnica 2: animar paragens de cor com @propertyTécnica 3: fundir dois gradientesTécnica 4: um brilho que segue o cursorEscolher uma técnicaEcrãs táteis e movimento reduzido

Um efeito hover com gradiente CSS precisa de um truque, porque os browsers não fazem transition de background-image: muda o gradiente em :hover e ele salta. Quatro técnicas dão um resultado suave. Deslizar um gradiente sobredimensionado com background-position, animar paragens de cor registadas com @property, fundir um segundo gradiente num pseudo-elemento, ou mover um brilho radial com o cursor. Cada uma serve elementos diferentes, e todas estão abaixo com código.

Porque é que o transition não funciona em gradientes

Para o browser, um gradiente é uma imagem. Sabe interpolar um número ou uma cor, mas não uma imagem noutra, por isso background-image não é interpolado e o novo gradiente substitui o antigo de imediato. As propriedades personalizadas usadas dentro do gradiente comportam-se da mesma forma, a não ser que as registes, porque uma propriedade não registada é apenas texto.

css
/* This snaps, with no easing */
.btn {
  background-image: linear-gradient(135deg, #1e1b4b, #6d28d9);
  transition: background-image 400ms ease;
}
.btn:hover {
  background-image: linear-gradient(135deg, #6d28d9, #f472b6);
}
A linha transition é ignorada nos gradientes. Todas as técnicas abaixo contornam isto.
Os dois estados usados nos exemplos. O objetivo é uma viagem suave da amostra da esquerda para a da direita.

Técnica 1: deslizar um gradiente sobredimensionado

Faz o fundo maior do que o elemento, pinta lá dentro os dois estados e depois move-o. O background-position pode ter transition, por isso as novas cores deslizam para dentro. Funciona em todos os browsers e não precisa de registo.

css
.btn {
  background-image: linear-gradient(90deg, #1e1b4b 0%, #6d28d9 50%, #f472b6 100%);
  background-size: 200% 100%;
  background-position: 0% 50%;
  transition: background-position 500ms ease;
}

.btn:hover {
  background-position: 100% 50%;
}
Em repouso vês a metade esquerda, de índigo a violeta. Em hover, a metade direita, de violeta a rosa, desliza para o lugar.
A faixa completa a 200%linear-gradient(90deg, #1e1b4b 0%, #6d28d9 50%, #f472b6 100%)
Este é o fundo inteiro. O botão só mostra metade de cada vez.

O movimento lê-se como uma varredura, o que serve botões e ligações. É menos convincente em cartões grandes, onde se vê o gradiente a viajar. Animar background-position obriga a repintar, o que não é problema em elementos pequenos; para uma superfície grande, usa a técnica 3. Botões com gradiente em CSS tem mais padrões de botões construídos sobre isto.

Técnica 2: animar paragens de cor com @property

Regista as cores das paragens como propriedades personalizadas tipadas e o browser consegue interpolá-las. O gradiente muda então de cor no mesmo sítio, sem deslizar. O @property funciona em todos os principais browsers atuais; os mais antigos limitam-se a saltar, o que é um recurso aceitável para um hover. As regras de registo estão em CSS @property.

css
@property --stop-a {
  syntax: "<color>";
  inherits: false;
  initial-value: #1e1b4b;
}

@property --stop-b {
  syntax: "<color>";
  inherits: false;
  initial-value: #6d28d9;
}

.card {
  background-image: linear-gradient(135deg, var(--stop-a), var(--stop-b));
  transition: --stop-a 450ms ease, --stop-b 450ms ease;
}

.card:hover {
  --stop-a: #6d28d9;
  --stop-b: #f472b6;
}
Cada paragem suaviza-se de forma independente. Dá-lhes durações diferentes e a cor parece fluir de um canto para o outro.

O mesmo truque anima o ângulo. Regista --angle com syntax: "<angle>", usa-o em linear-gradient(var(--angle), ...) e muda-o no hover: um gradiente que roda de 135 para 225 graus quando o ponteiro chega é um toque subtil e cuidado para cartões e contornos com gradiente.

As duas técnicas até aqui também funcionam em texto com gradiente. O texto recortado com background-clip: text mostra o que o fundo fizer, por isso um deslize ou uma transição de paragens num título faz a cor correr pelas letras no hover. Mantém a mudança suave em títulos que as pessoas precisam de ler e garante que os dois estados têm contraste suficiente com a página.

Técnica 3: fundir dois gradientes

Põe o gradiente de hover num pseudo-elemento por cima da base e esbate a sua opacidade. As mudanças de opacidade são tratadas pelo compositor sem repintar, por isso esta é a escolha mais suave para cartões grandes, painéis de destaque e tudo o que esteja numa grelha longa.

css
.tile {
  position: relative;
  isolation: isolate;
  background-image: linear-gradient(135deg, #1e1b4b, #6d28d9);
}

.tile::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  border-radius: inherit;
  background-image: linear-gradient(135deg, #6d28d9, #f472b6);
  opacity: 0;
  transition: opacity 400ms ease;
}

.tile:hover::before {
  opacity: 1;
}
z-index: -1 com isolation: isolate mantém o pseudo-elemento atrás do texto do bloco, mas por cima do gradiente de base.

Técnica 4: um brilho que segue o cursor

Um gradiente radial posicionado com propriedades personalizadas consegue seguir o ponteiro. Define --x e --y a partir de um pequeno script e a luz acompanha a mão. Mantém-no suave e longe do texto: deve parecer luz sobre uma superfície, nunca um halo à volta das palavras.

css
.panel {
  background-image:
    radial-gradient(circle 220px at var(--x, 50%) var(--y, 50%), rgb(244 114 182 / 0.35), transparent 70%),
    linear-gradient(135deg, #1e1b4b, #312e81);
}

/* JavaScript:
   panel.addEventListener("pointermove", (e) => {
     const r = panel.getBoundingClientRect();
     panel.style.setProperty("--x", `${e.clientX - r.left}px`);
     panel.style.setProperty("--y", `${e.clientY - r.top}px`);
   });
*/
O brilho é uma camada de topo sobre uma base escura. Atualizar duas propriedades personalizadas é barato, mas cada movimento repinta, por isso usa-o em poucos painéis, não em todos os cartões de uma página.

Escolher uma técnica

Deslizar com background-position

Parece

Uma varredura de cor nova

Custo de renderização

Repinta durante a transição

Ideal para

Botões, ligações, etiquetas
Paragens de cor com @property

Parece

Cores a mudar no mesmo sítio

Custo de renderização

Repinta durante a transição

Ideal para

Cartões, emblemas, contornos
Fusão por opacidade

Parece

Um gradiente a dissolver-se noutro

Custo de renderização

Composto, sem repintar

Ideal para

Painéis grandes, grelhas longas
Brilho do cursor

Parece

Luz que segue o ponteiro

Custo de renderização

Repinta a cada movimento

Ideal para

Alguns painéis de destaque
TécnicaPareceCusto de renderizaçãoIdeal para
Deslizar com background-positionUma varredura de cor novaRepinta durante a transiçãoBotões, ligações, etiquetas
Paragens de cor com @propertyCores a mudar no mesmo sítioRepinta durante a transiçãoCartões, emblemas, contornos
Fusão por opacidadeUm gradiente a dissolver-se noutroComposto, sem repintarPainéis grandes, grelhas longas
Brilho do cursorLuz que segue o ponteiroRepinta a cada movimentoAlguns painéis de destaque
Na dúvida, funde por opacidade. É a mais barata e funciona em todo o lado.

Para gradientes que se movem sozinhos e não no hover, vê gradientes animados em CSS. Para uma visão mais ampla do que custa tempo de pintura, vê desempenho dos gradientes CSS.

Ecrãs táteis e movimento reduzido

Evita

  • Estilos de hover que ficam presos depois de um toque no telemóvel
  • Informação que só aparece no hover
  • Animações de hover longas e em ciclo
  • Ignorar a definição de movimento reduzido

Faz

  • Envolve as regras de hover em @media (hover: hover)
  • Mostra o mesmo estado em :active para toque
  • Mantém as transições entre 200 e 500 ms
  • Corta o movimento com prefers-reduced-motion e mantém a mudança de cor
css
@media (hover: hover) {
  .btn:hover { background-position: 100% 50%; }
}

@media (prefers-reduced-motion: reduce) {
  .btn { transition: none; }
}
A cor continua a mudar para todos; só o movimento é retirado a quem pediu menos.

Os efeitos hover dão vida a um site. Nas publicações sociais não há ponteiro, por isso o movimento tem de viver no próprio design. Os Marks do Gradiently podem trazer o seu próprio movimento suave e, com o Pro, um design exporta-se em MP4, WebM ou GIF onde o browser suporta gravação, pronto para um story ou uma publicação.

Encontra um gradiente só teu

Explora milhares de Marks, cria designs com qualquer um deles gratuitamente e reserva o que parece contigo.

Explorar o Mercado

Perguntas frequentes

É possível fazer transition de um gradiente CSS no hover?

Não diretamente. O background-image muda de imediato. Faz transition de background-position num gradiente sobredimensionado, anima paragens registadas com @property ou esbate a opacidade de um segundo gradiente.

Como faço um botão com gradiente mudar de cor suavemente no hover?

Usa background-size: 200% 100% com um gradiente de três paragens e depois faz transition de background-position de 0% 50% para 100% 50% no hover.

O @property funciona em todos os browsers?

Funciona nas versões atuais do Chrome, Edge, Safari e Firefox. Os browsers mais antigos saltam entre estados em vez de os suavizar.

Qual é o efeito hover com gradiente de melhor desempenho?

A fusão por opacidade: o gradiente de hover fica num pseudo-elemento e só muda a sua opacidade, o que evita repintar.

Os efeitos hover com gradiente devem respeitar o movimento reduzido?

Sim. Com prefers-reduced-motion: reduce, retira o movimento e mantém uma simples mudança de cor.

Partilhar este guia

Escrito pela GradientlyConta Gradiently verificada

A equipa por trás da Gradiently, uma ferramenta de design construída em torno dos Marks: gradientes vivos que fazem tudo o que crias parecer teu.

Ver o nosso perfil

Nesta página

Porque é que o transition não funciona em gradientesTécnica 1: deslizar um gradiente sobredimensionadoTécnica 2: animar paragens de cor com @propertyTécnica 3: fundir dois gradientesTécnica 4: um brilho que segue o cursorEscolher uma técnicaEcrãs táteis e movimento reduzido

Partilhar este guia

A seguir em CSS e web

CSS @property: animar gradientes e propriedades personalizadas

Continua a ler

Todos os guias de CSS e web
CSS e web

Fundos com gradiente animado em CSS, como deve ser

5 min de leitura

Os gradientes não se podem animar diretamente, mas tudo à volta deles pode. Quatro técnicas, o que cada uma custa ao navegador e como manter o movimento calmo e opcional.

CSS e web

CSS @property: animar gradientes e propriedades personalizadas

6 min de leitura

Os gradientes não fazem transition porque o browser não consegue misturar uma imagem com outra. Dá um tipo a uma propriedade personalizada e esse limite desaparece. Aqui fica como funciona o @property, com código para colar.

CSS e web

Botões com gradiente em CSS que parecem premium

5 min de leitura

A maioria dos botões com gradiente parece barata pelas mesmas poucas razões: demasiados matizes, um hover que salta e texto que se apaga na ponta clara. Eis a receita que evita as três.

Encontra o visual que é só teu.

Cada Mark é um fundo vivo com um só dono. Experimenta um Mark ainda disponível e reserva o teu quando te parecer certo.

Começar a criar

Verificar um certificado

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

Funciona com o ChatGPT e o Claude

Pede um design à tua IA. Ela cria-o no teu Mark, pronto a editar.

ChatGPTClaude
Como ligar

Produto

  • Mercado
  • Explorar
  • Preços
  • Certificados

Aprender

  • Guia Prático
  • Centro de ajuda
  • Novidades

Programadores

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

Empresa

  • Sobre nós
  • Contactos
  • Iniciar sessão

Legal

  • Termos
  • Privacidade
  • Reembolsos
  • Proteção de Marks
  • Cookies
  • Todas as políticas
Passa pelas letras. Cada uma veste um Mark real.Toca numa letra para veres o seu Mark.Um nome. Dez Marks lá dentro.
© 2026 Gradiently