CSS e web

Borda com gradiente em CSS: quatro jeitos de desenhar uma

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.

GradientlyConta verificada do Gradiently··5 min de leitura
Capa: Inner Reel · GR·WQK6·T2

Resumindo

  • O CSS não aceita um gradiente em border-color, então uma borda com gradiente em CSS é sempre desenhada com outra técnica.
  • O border-image com um gradiente é o método mais curto, mas ignora o border-radius, então só serve para cantos retos.
  • Duas camadas de fundo, uma recortada na caixa de preenchimento e outra na caixa da borda, dão uma borda com gradiente arredondada, desde que o interior seja uma cor sólida.
  • A técnica da máscara recorta o meio de uma camada de gradiente, o que dá uma borda com gradiente arredondada e com interior transparente.
  • Um gradiente cônico giratório, controlado por uma propriedade personalizada registrada com @property, é o jeito usual de animar uma borda com gradiente.
Nesta página

Uma borda com gradiente em CSS é um contorno cuja cor se mistura ao longo do comprimento. O problema é que o border-color só aceita cores, não imagens, então não existe uma propriedade única para isso. Em vez disso, você desenha o gradiente em outro lugar e mostra só uma faixa fina dele. Há quatro jeitos confiáveis de fazer isso, e o certo depende de duas perguntas: o elemento tem cantos arredondados e o interior dele precisa ser transparente?

MétodoCantos arredondadosInterior transparenteMelhor para
border-imageNãoSimCards retos, divisores, tabelas
Dois fundosSimNão, precisa de preenchimento sólidoA maioria dos cards e botões
Máscara em um pseudoelementoSimSimCards sobre imagens ou gradientes
Pseudoelemento atrásSimNãoBrilhos e anéis animados
Escolha pelas duas perguntas: cantos e interior.
Gradientes que funcionam bem como contornos finos. A alta saturação importa mais em uma linha de 2px do que em um fundo inteiro.

Método 1: border-image

O border-image aceita qualquer imagem, inclusive um gradiente. Defina a largura e o estilo da borda, depois o gradiente e depois um corte de 1, que diz ao navegador para usar a imagem inteira como borda. São duas linhas, funciona em todo lugar e deixa o interior do elemento intocado.

css
.panel {
  border: 3px solid;
  border-image: linear-gradient(135deg, #7c3aed, #22d3ee) 1;
}
A borda com gradiente mais curta. O 1 é o valor do corte; sem ele, a borda só é desenhada nos cantos.

Método 2: dois fundos com background-clip

Dê ao elemento uma borda transparente e empilhe dois fundos. A camada de cima é o preenchimento interno, recortada no padding-box, então para na borda interna. A camada de baixo é o gradiente, recortado no border-box, então se estende por baixo da borda. Onde o preenchimento para, o gradiente aparece, e ele segue o border-radius perfeitamente.

css
.card {
  border: 2px solid transparent;
  border-radius: 16px;
  background:
    linear-gradient(#0f172a, #0f172a) padding-box,
    linear-gradient(135deg, #7c3aed, #22d3ee) border-box;
}
O preenchimento é escrito como um gradiente de uma cor porque só imagens podem ser sobrepostas assim.

Esse é o método a usar por padrão. O único limite é que o interior precisa ser opaco, já que um preenchimento transparente revelaria o gradiente no card inteiro. Para cards sobre uma cor lisa de página, isso não é limite nenhum: use a cor da página como preenchimento.

Método 3: a técnica da máscara para interiores transparentes

Quando o card fica sobre uma foto ou outro gradiente, o meio precisa ser transparente. Coloque o gradiente em um pseudoelemento que cubra o card, dê a ele um padding igual à largura da borda e mascare-o com duas camadas: uma cobrindo só a caixa de conteúdo e outra cobrindo tudo. Excluir uma da outra deixa visível apenas o anel do padding.

css
.glass-card {
  position: relative;
  border-radius: 16px;
}

.glass-card::before {
  content: "";
  position: absolute;
  inset: 0;
  padding: 2px; /* border width */
  border-radius: inherit;
  background: linear-gradient(135deg, #7c3aed, #22d3ee);
  -webkit-mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask:
    linear-gradient(#000 0 0) content-box exclude,
    linear-gradient(#000 0 0);
  pointer-events: none;
}
Um anel de gradiente com o centro transparente. O par com prefixo cobre o WebKit antigo; a linha mask padrão cobre tudo o que é atual.

O pointer-events: none impede que o pseudoelemento engula os cliques destinados ao conteúdo do card. A referência de mask-composite do MDN explica as palavras-chave de composição. Esse é o método por trás da maioria dos cards de glassmorphism com bordas brilhantes.

Método 4: um pseudoelemento atrás, para brilhos e animação

Coloque um pseudoelemento de gradiente um pouco maior que o card, atrás do conteúdo, e cubra o meio com um segundo pseudoelemento com o preenchimento sólido do card. A borda visível é o gradiente. Como o gradiente fica em uma camada própria, você pode desfocar uma cópia dele para um brilho, ou girá-lo.

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

.ring {
  position: relative;
  isolation: isolate;
  border-radius: 16px;
}

.ring::before {
  content: "";
  position: absolute;
  inset: -2px;
  z-index: -1;
  border-radius: 18px;
  background: conic-gradient(from var(--angle), #7c3aed, #22d3ee, #f472b6, #7c3aed);
  animation: spin 6s linear infinite;
}

/* the card's fill, painted over the middle of the ring */
.ring::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  border-radius: inherit;
  background: #0f172a;
}

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

@media (prefers-reduced-motion: reduce) {
  .ring::before { animation: none; }
}
Uma borda com gradiente animada. O --angle registrado deixa o navegador interpolar o ângulo inicial do cônico de forma suave, e o ::after pinta o preenchimento sobre o meio.
O gradiente do anel giratórioconic-gradient(from 0deg, #7c3aed, #22d3ee, #f472b6, #7c3aed)
Repetir a primeira cor no fim esconde a emenda enquanto ele gira. Gradientes cônicos em CSS trata da função em profundidade.

O raio externo deve ser igual ao raio interno mais a largura da borda, e é por isso que o pseudoelemento usa 18px em volta de um card de 16px. Para mais jeitos de pôr movimento em gradientes, veja gradientes animados em CSS.

Dicas de design para bordas com gradiente

Evite

  • Bordas com gradiente em todo card de uma grade
  • Gradientes de baixa saturação em uma linha de 1px, que parecem cinza
  • Uma borda com gradiente e um preenchimento com gradiente no mesmo elemento
  • Anéis girando rápido sobre conteúdo que as pessoas precisam ler

Faça

  • Reserve a borda com gradiente para um item em destaque, como um plano recomendado
  • Use 2px ou mais e paradas saturadas
  • Um preenchimento calmo com uma borda vívida, ou o contrário
  • Rotação lenta, pausada para movimento reduzido

As bordas com gradiente funcionam melhor como ênfase. A mesma lógica vale para os botões, tratados em botões com gradiente em CSS.

Perguntas frequentes

Como faço uma borda com gradiente em CSS?

O jeito mais rápido é border: 3px solid; border-image: linear-gradient(135deg, #7c3aed, #22d3ee) 1;. Para cantos arredondados, use dois fundos recortados em padding-box e border-box.

Por que o border-radius não funciona com o border-image?

Pela especificação, uma borda desenhada com border-image não é arredondada pelo border-radius. Use o método do background-clip ou da máscara para bordas com gradiente arredondadas.

Como faço uma borda com gradiente com fundo transparente?

Use a técnica da máscara: um pseudoelemento com o gradiente, padding igual à largura da borda e uma máscara que exclui a caixa de conteúdo dele.

Como animo uma borda com gradiente?

Registre um ângulo com @property, use-o como o ângulo from de um gradiente cônico em um pseudoelemento e anime essa propriedade de 0deg a 360deg.

Qual método de borda com gradiente devo usar?

Use dois fundos para a maioria dos cards e botões arredondados, border-image para bordas retas e a técnica da máscara só quando o interior precisa continuar transparente.

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