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étodo | Cantos arredondados | Interior transparente | Melhor para |
|---|---|---|---|
border-image | Não | Sim | Cards retos, divisores, tabelas |
| Dois fundos | Sim | Não, precisa de preenchimento sólido | A maioria dos cards e botões |
| Máscara em um pseudoelemento | Sim | Sim | Cards sobre imagens ou gradientes |
| Pseudoelemento atrás | Sim | Não | Brilhos e anéis animados |
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.
.panel {
border: 3px solid;
border-image: linear-gradient(135deg, #7c3aed, #22d3ee) 1;
}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.
.card {
border: 2px solid transparent;
border-radius: 16px;
background:
linear-gradient(#0f172a, #0f172a) padding-box,
linear-gradient(135deg, #7c3aed, #22d3ee) border-box;
}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.
.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;
}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.
@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; }
}--angle registrado deixa o navegador interpolar o ângulo inicial do cônico de forma suave, e o ::after pinta o preenchimento sobre o meio.conic-gradient(from 0deg, #7c3aed, #22d3ee, #f472b6, #7c3aed)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.
Escrito pelo 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


